我试图用python3解决一个pwnable问题。为此,我需要打印一些字符不在ASCII范围内。你知道吗
python3正在将这些字符转换成一些奇怪的Unicode。你知道吗
例如,如果我在python3中打印"\xff"
,我会得到:
root@kali:~# python3 -c 'print("\xff")' | xxd
00000000: c3bf 0a ...
\xff
转换为\xc3\xbf
但在Python2中,它按预期工作,如下所示:
root@kali:~# python -c 'print("\xff")' | xxd
00000000: ff0a ..
那么如何在python3中打印它呢?你知道吗
在python2中,
str
和bytes
是同一件事,因此当您编写'\xff'
时,结果包含实际的字节0xFF
。你知道吗在python3中,
str
更接近python2的unicode
对象,而不是bytes
的别名。\xff
不再是插入字节的请求,而是插入Unicode字符的请求,该字符的代码可以用8位表示。该字符串使用默认编码(可能是UTF-8)打印,其中字符0xFF被编码为字节\xc3\xbf
。\x
基本上是以字符串形式出现的\u
的单字节版本。不过,当它出现在bytes
中时,还是和以前一样。你知道吗现在来看看解决办法。如果你只是想要一些字节,那么就做吧
这与python2中的工作原理相同。可以将这些字节写入二进制文件,但不能直接打印,因为打印的所有内容都转换为} 有一个
str
。打印的问题是所有内容都以文本模式编码。幸运的是,^{buffer
属性,允许您直接输出bytes
:只有当您不使用没有
buffer
的花哨的东西来替换sys.stdout
时,这才有效。你知道吗在python2中,
print '\xff'
将字节字符串直接写入终端,这样就可以得到打印的字节。你知道吗在python3中,
print('\xff')
使用默认编码将Unicode字符U+00FF编码到终端…在您的例子中是UTF-8。你知道吗要在Python3中直接向终端输出字节,不能使用
print
,但可以使用以下方法跳过编码并写入字节字符串:相关问题 更多 >
编程相关推荐