首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3 print() Vs Python2 print

Python3 print() Vs Python2 print
EN

Stack Overflow用户
提问于 2017-10-22 12:28:04
回答 1查看 2.2K关注 0票数 12

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

代码语言:javascript
复制
python -c "print '-'*32+'\x37\x8a\x04\x08'" | ./MyExecutable

这次开发取得了成功。但是,当我尝试:

代码语言:javascript
复制
python3 -c "print('-'*32+'\x37\x8a\x04\x08')" | ./MyExecutable

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

代码语言:javascript
复制
python -c "print '-'*32+'\x37\x8a\x04\x08'"

代码语言:javascript
复制
python3 -c "print('-'*32+'\x37\x8a\x04\x08')" 

结果在控制台上有两个不同的输出。当然,这些字符是不可读的,但它们在视觉上是不同的。

我不知道为什么会发生这种事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-22 12:30:49

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

在Python3中,将字节写到sys.stdout.buffer对象中:

代码语言:javascript
复制
python3 -c "import sys; sys.stdout.buffer.write(b'-'*32+b'\x37\x8a\x04\x08')"

您可能希望手动添加\n换行符,print将添加该换行符。

sys.stdout是一个 object,它在将数据传递给底层缓冲区对象之前,将数据编码到给定的编解码器(通常是基于您的区域设置,但在使用管道时,通常默认为ASCII)。 attribute允许您直接访问底层 object

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46874058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档