Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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
Python3打印()与Python2打印_Python_Stdout - Fatal编程技术网

Python3打印()与Python2打印

Python3打印()与Python2打印,python,stdout,Python,Stdout,在进行缓冲区溢出攻击时,我发现了一些非常奇怪的事情。我已成功发现,我需要在要跳转到的正确地址之前提供32个字符,并且正确的地址是0x08048a37。当我执行死刑的时候 python -c "print '-'*32+'\x37\x8a\x04\x08'" | ./MyExecutable 这一利用取得了成功。但是,当我尝试时: python3 -c "print('-'*32+'\x37\x8a\x04\x08')" | ./MyExecutable 没有。可执行文件只会导致分段错误,而不

在进行缓冲区溢出攻击时,我发现了一些非常奇怪的事情。我已成功发现,我需要在要跳转到的正确地址之前提供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'"

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

我想知道为什么会这样

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

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

python3 -c "import sys; sys.stdout.buffer.write(b'-'*32+b'\x37\x8a\x04\x08')"
您可能需要手动添加
\n
打印将添加的
换行符

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

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