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

Shu*_*eng 0 linux bash environment-variables

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

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

现在,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
Run Code Online (Sandbox Code Playgroud)

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

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

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

mos*_*svy 5

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

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

$ printf %s "$MyEnv" | hexdump -Cv
...
00000040  0a 09 0a 0d                                       |....|
00000044
Run Code Online (Sandbox Code Playgroud)

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

[1] 如果来自 IFS 的字符不是“空白”,则外壳实际上可能会拆分为单个字符并创建空字段。标准的字段拆分部分中的完整说明。

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