Python3 print()与Python2打印

时间:2017-10-22 12:28:05

标签: python stdout bytestring

在处理缓冲区溢出攻击时,我发现了一些非常奇怪的东西。我已经成功地发现我需要在要跳转到的正确地址之前提供32个字符,并且正确的地址是0x08048a37。我执行时

python -c "print '-'*32+'\x37\x8a\x04\x08'" | ./MyExecutable
该漏洞利用取得了成功。但是,当我尝试时:

python3 -c "print('-'*32+'\x37\x8a\x04\x08')" | ./MyExecutable

没有。可执行文件只会导致分段错误,而不会跳转到所需的地址。实际上,正在执行

python -c "print '-'*32+'\x37\x8a\x04\x08'"

python3 -c "print('-'*32+'\x37\x8a\x04\x08')" 

在控制台上产生两个不同的输出。当然,这些角色不可读,但它们在视觉上是不同的。

我想知道为什么会这样?

1 个答案:

答案 0 :(得分:19)

Python 2代码写入 bytes ,Python 3代码写入 text ,然后编码为字节。因此后者不会写相同的输出;它取决于为管道配置的编解码器。

在Python 3中,将字节写入sys.stdout.buffer对象:

python3 -c "import sys; sys.stdout.buffer.write(b'-'*32+b'\x37\x8a\x04\x08')"

您可能需要手动添加\n将添加的print换行符。

sys.stdoutio.TextIOBase object,将编码数据写入给定的编解码器(通常基于您的语言环境,但在使用管道时,通常默认为ASCII),然后将其传递给底层缓冲对象。 TextIOBase.buffer attribute可让您直接访问基础BufferedIOBase object