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
包含最后四位数字,因为它解决了练习。
如何显示环境变量的二进制内容?
不,它与未加引号的$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
到换行符等),可能会更加混乱您的变量。