Python3以一种奇怪的方式处理nonASCII角色

2024-09-25 16:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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中打印它呢?你知道吗


Tags: asciiunicoderoot字符python3print我会xff
2条回答

在python2中,strbytes是同一件事,因此当您编写'\xff'时,结果包含实际的字节0xFF。你知道吗

在python3中,str更接近python2的unicode对象,而不是bytes的别名。\xff不再是插入字节的请求,而是插入Unicode字符的请求,该字符的代码可以用8位表示。该字符串使用默认编码(可能是UTF-8)打印,其中字符0xFF被编码为字节\xc3\xbf\x基本上是以字符串形式出现的\u的单字节版本。不过,当它出现在bytes中时,还是和以前一样。你知道吗

现在来看看解决办法。如果你只是想要一些字节,那么就做吧

b'\xff'

这与python2中的工作原理相同。可以将这些字节写入二进制文件,但不能直接打印,因为打印的所有内容都转换为str。打印的问题是所有内容都以文本模式编码。幸运的是,^{}有一个buffer属性,允许您直接输出bytes

sys.stdout.buffer.write(b'\xff\n')

只有当您不使用没有buffer的花哨的东西来替换sys.stdout时,这才有效。你知道吗

在python2中,print '\xff'将字节字符串直接写入终端,这样就可以得到打印的字节。你知道吗

在python3中,print('\xff')使用默认编码将Unicode字符U+00FF编码到终端…在您的例子中是UTF-8。你知道吗

要在Python3中直接向终端输出字节,不能使用print,但可以使用以下方法跳过编码并写入字节字符串:

python3 -c "import sys; sys.stdout.buffer.write(b'\xff')"

相关问题 更多 >