如何查看环境变量的二进制内容?

如何查看环境变量的二进制内容?

我正在练习 CTF(捕获标志)并想要查看环境变量的内容:

MyEnv=`python3 -c 'print(64*"A"+"\x0a\x09\x0a\x0d",end="")'`

现在,hexdump当使用管道输入时显示以下内容echo

$ echo -n $MyEnv | hexdump -Cv
00000000  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
00000010  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
00000020  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
00000030  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
00000040  20 0d                                             | .|
00000042

echo这与不愿意打印最后四个十六进制数字有关。

但是,我知道它MyEnv包含最后四位数字,因为它解决了练习。

如何显示环境变量的二进制内容?

答案1

$MyEnv不,它与未加引号的变量被分割并修剪变量中的字符[1]有关IFS,默认情况下是空格 ( \x20)、制表符 ( \x09) 和换行符 ( \x0a),然后echo写入被分割的字段与空格连接 ( \x20)。

为了能够查看这些字符,请引用变量$MyEnv,并使用printf而不是echo -n[2]

$ printf %s "$MyEnv" | hexdump -Cv
...
00000040  0a 09 0a 0d                                       |....|
00000044

请注意,通常不能在环境变量中存储二进制数据——二进制数据可以包含 NUL 字节 ( \0),并且环境变量的值是以零结尾的字符串。 NUL 字节也不适用于bash的内部(非导出)变量。

[1] 如果 IFS 中的字符不是“空格”,则 shell 实际上可能会分割单个字符并创建空字段。完整的描述在场分裂标准的部分。

[2]echo标准 shell 中的 可能会解释一些反斜杠转义(例如\n换行符等),可能会更加混乱您的变量。

相关内容