【问题标题】:Python3 handling non-ASCII characters in a weird wayPython3以一种奇怪的方式处理非ASCII字符
【发布时间】:2019-10-03 07:57:35
【问题描述】:

我试图用 Python 3 解决一个 pwnable。为此我需要打印一些不在 ASCII 范围内的字符。

Python 3 正在将这些字符转换为一些奇怪的 Unicode。

例如,如果我在 Python 3 中打印 "\xff",我会得到:

root@kali:~# python3 -c 'print("\xff")' | xxd
00000000: c3bf 0a                                  ...

\xff 被转换为 \xc3\xbf

但在 Python 2 中,它按预期工作,如下所示:

root@kali:~# python -c 'print("\xff")' | xxd
00000000: ff0a                                     ..

那么如何在 Python 3 中这样打印呢?

【问题讨论】:

  • 请在此处发布代码而不是图片
  • root@kali:~# python3 -c 'print("\xff")' | xxd 00000000: c3bf 0a ... root@kali:~# python -c 'print("\xff")' | xxd 00000000: ff0a
  • 请在问题中!
  • 完成,添加。
  • 反应灵敏

标签: python python-3.x unicode ascii non-ascii-characters


【解决方案1】:

在 Python 2 中,print '\xff' 将字节字符串直接写入终端,因此您可以得到打印的字节。

在 Python 3 中,print('\xff') 使用默认编码将 Unicode 字符 U+00FF 编码到终端...在您的情况下为 UTF-8。

在 Python 3 中直接输出字节到终端你不能使用print,但是你可以使用下面的来跳过编码并写一个字节串:

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

【讨论】:

    【解决方案2】:

    在 Python 2 中,strbytes 是同一个东西,所以当你写 '\xff' 时,结果包含实际字节 0xFF

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

    现在寻求解决方案。如果您只想要一些字节,请执行

    b'\xff'
    

    这与在 Python 2 中的工作方式相同。您可以将这些字节写入二进制文件,但不能直接打印,因为您打印的所有内容都会转换为 str。打印的问题是所有内容都以文本模式编码。幸运的是,sys.stdout 有一个buffer 属性,可以让你直接输出bytes

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

    这只有在您不将 sys.stdout 替换为没有 buffer 的花哨的东西时才有效。

    【讨论】:

    • 这给了我 AttributeError: 'bytes' object has no attribute 'encode'
    • 这仍然给我与 print("\xff") 完全相同的输出
    • root@kali:~# python3 -c "p​​rint(b'\xff'.decode('latin-1'))" |xxd 00000000: c3bf 0a ...
    • 是的。我才意识到我做了什么。它仍然以 utf-8 打印。等一下
    • @3xpl017。固定
    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2017-12-04
    相关资源
    最近更新 更多