为什么在终端中内联打印转义的十六进制字符与在终端程序 运行 中打印转义十六进制字符之间存在差异?

Why is there a difference between printing escaped hex characters inline in the terminal and in a program running the the terminal?

我试图将字符串发送到服务器上的另一个应用程序 运行ning(我无权访问)。该字符串包含空字符。 现在我注意到当我 运行 脚本中的以下代码时,

print('abc\x00\x91\x11\x01123')

输出为:abc\x00\x91\x11123.

当我 运行 终端中的相同代码时想到:

python -c 'print("abc\x00\x91\x11\x01123")'

我得到输出:abc�123

在我的案例中,这是所需的输出。 为什么两个输出不同? 运行在脚本中使用 print 函数时如何获得第二个输出?

编辑: 我弄清楚是什么导致了差异。 pwntools 导致了这种行为。 但我仍然无法真正弄清楚为什么。 以下代码:

#!/usr/env/python
import pwn

print('abc\x00\x91\x11\x01123')

结果

abc\x00\x91\x11123

当我不导入pwn时,结果和预期的一样: abc�123.

实际上没有区别。你的问题在别处,而不是在终端和脚本中的解释差异。

这是我在本地为您的示例提供的输出:

[cecile@CC-PC ~]$ python
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('abc\x00\x91\x11\x01123')
abc_123
>>>
[cecile@CC-PC ~]$ python -c 'print("abc\x00\x91\x11\x01123")'
abc_123

在这台机器上,不可打印的字符似乎被替换为 _ 但这里的要点是,如您所见,结果在解释器和终端中是相同的。

我希望这符合 Stack Overflow 标准的答案。

如果你玩手榴弹,对待就像手榴弹,而不是玩具。 PWN tools 似乎是一些用于开发的脚本小子工具。如果您阅读文档的前几段,您会发现以下内容:

As stated, we would also like to have the ability to get a lot of these side-effects by default. That is the purpose of this module. It does the following:

[...]Calls pwnlib.term.init() to put your terminal in raw mode and implements functionality to make it appear like it isn’t.

您已收到警告,但您还没有 RTFM。