我正在练习 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
换行符等),可能会更加混乱您的变量。