python - python3 十六进制的奇怪行为

标签 python

我正在尝试利用缓冲区,我的 python 3 代码如下所示:

python3 -c "print ('A' * 44 + '\xcb\x85\x04\x08')" | ./vuln

或者使用 2.7 的另一种方式:

python2.7 -c "print 'A' * 44 + '\xcb\x85\x04\x08'" | ./vuln

但在这种情况下,只有 2.7 工作正常,所以我尝试检查十六进制:

python2.7 -c "p​​rint 'A' * 44 + '\xcb\x85\x04\x08'"|十六进制转储
0000020 4141 4141 4141 4141 4141 4141 85cb 0804
0000030 000a

python3 -c "p​​rint ('A' * 44 + '\xcb\x85\x04\x08')"|十六进制转储
0000020 4141 4141 4141 4141 4141 4141 8bc3 85c2
0000030 0804 000a

它不依赖于系统(我在ubuntu和arch上尝试过),不依赖于终端(也尝试过不同的)
看起来 python 3 添加了一些东西并改变了内存,但是为什么,这真的很正常吗?

最佳答案

在 Python 2 中,字符串和字节范围是相同的。这给非 ASCII 字符串带来了问题,因此他们在 Python 3 中对其进行了更改。在 Python 3 中,有一种 bytes 类型,这就是您想要的类型。构造字节字符串的最简单方法是在文字前面添加 b:

b'A' * 44 + b'\xcb\x85\x04\x08'

但是,您无法像 Python 2 那样直接打印 bytes。Python 3 会很好地表示您的字节,如下所示:

b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xcb\x85\x04\x08'

显然这都是 ASCII,而不是您想要的字节。要将字节直接写入标准输出,请使用 sys.stdout.buffer.write:

python3 -c "import sys;sys.stdout.buffer.write(b'A' * 44 + b'\xcb\x85\x04\x08')"

请注意,这不会在末尾写入换行符:

0000020 41 41 41 41 41 41 41 41 41 41 41 41 cb 85 04 08

对于输出一些字节来说,这似乎有点麻烦,尤其是与 Python 2 相比。这是因为 Python 3 确实改进了人类可读文本的输出方式。这样做的后果之一是,在没有任何编码的情况下打印字节会更加困难,因为输出文本时这通常是不正确的。

关于python - python3 十六进制的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54550845/

相关文章:

python - 用python删除文件夹和子文件夹中的pdf文件?

python - 大型数据集上的 Sklearn-GMM

javascript - baseHTTPserver 不能使用 javascript 库

python - recv() 不断返回相同的数据

python - 是否可以阻止迭代器到达文件末尾?

python - 我尝试求解非线性方程时出错

python - 使用 python 在大文件中搜索字符串的更快方法

python - 代码可以在 pyCharm 中运行,但不能在 Visual Studio Code 中运行

c++ - python 和痛饮 : Using StringIO in place of FILE*

python - django uwsgi没有名为site的模块