互联网上曾经有一个非常糟糕的笑话,您可以复制以 \x0B\x2E... 开头的内容(只是一个示例),当您执行此命令时,终端会将其解释为sudo rm -rf /
.
你如何进行这种混淆?我只是尝试运行 Cyberchef 并将我的命令转换ls -la
为十六进制,即使使用语法,该命令也不会执行\x<hexcodetwocharactershere>\x<hexcodetwocharactershere>
。
- 我究竟做错了什么?
- 还有类似的混淆方法吗?
PS我已经知道base64编码技巧,但这需要在系统上安装base64
总而言之,我不想使用 bash 以外的任何其他工具来实现我的目标(因此没有 base64 编码工具和类似工具,没有 xxd,没有管道)
答案1
在大多数 shell 中,代码\x6c\x73\x20\x2d\x6c\x61
会尝试运行该x6cx73x20x2dx6cx61
命令,就像\
另一个引用运算符一样。
在es
或fish
shell 中,它会尝试运行该ls -la
命令,但可能会失败,因为没有该名称的命令。在 中es
,\
不是引用运算符,但可用于扩展类似 C 的转义序列。
在 Fish 中\
,既是一个引用运算符(如sh
/中csh
),又是一个转义序列引入符(如 中)es
。
在这两种情况下,\x20
都不会被解释为 shell 语法中真实空格字符的标记分隔符,因此它不会以参数运行ls
命令。-la
$'\x6c\x73\x20\x2d\x6c\x61'
如果您在支持 ksh93 样式引用形式的 shell 中输入,则相同。
您需要将这些扩展解释为 shell 代码,例如将其提供给eval
, sh -c
, source
...
eval $'\x6c\x73\x20\x2d\x6c\x61'
或者至少让它经历分裂:
code=$'\x6c\x73\x20\x2d\x6c\x61'
$code # using split+glob in POSIX shells
$=code # explicit IFS-splitting in zsh
${(s[ ])code} # explicit splitting on space in zsh
答案2
我不确定这是否符合问题的精神,尽管它仅适用于 bash:
eval "$(printf "%b" "\x6c\x73\x20\x2d\x6c\x61")"
您可以在运行之前检查解码的命令
printf "%b\n" "\x6c\x73\x20\x2d\x6c\x61"