在处理缓冲区溢出漏洞时,我发现了一些非常奇怪的东西。我已经成功地发现,我需要在我想要跳到的正确地址之前提供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')" 结果在控制台上有两个不同的输出。当然,这些字符是不可读的,但它们在视觉上是不同的。
我不知道为什么会发生这种事?
发布于 2017-10-22 12:30:49
Python 2代码写入字节,Python 3代码编写文本,然后将文本编码为字节。因此,后者将不会编写相同的输出;它取决于为管道配置的编解码器。
在Python3中,将字节写到sys.stdout.buffer对象中:
python3 -c "import sys; sys.stdout.buffer.write(b'-'*32+b'\x37\x8a\x04\x08')"您可能希望手动添加\n换行符,print将添加该换行符。
sys.stdout是一个 object,它在将数据传递给底层缓冲区对象之前,将数据编码到给定的编解码器(通常是基于您的区域设置,但在使用管道时,通常默认为ASCII)。 attribute允许您直接访问底层 object。
https://stackoverflow.com/questions/46874058
复制相似问题