当编码为十六进制时如何执行 ls -la ?

当编码为十六进制时如何执行 ls -la ?

互联网上曾经有一个非常糟糕的笑话,您可以复制以 \x0B\x2E... 开头的内容(只是一个示例),当您执行此命令时,终端会将其解释为sudo rm -rf /.

你如何进行这种混淆?我只是尝试运行 Cyber​​chef 并将我的命令转换ls -la为十六进制,即使使用语法,该命令也不会执行\x<hexcodetwocharactershere>\x<hexcodetwocharactershere>

  • 我究竟做错了什么?
  • 还有类似的混淆方法吗?

PS我已经知道base64编码技巧,但这需要在系统上安装base64

总而言之,我不想使用 bash 以外的任何其他工具来实现我的目标(因此没有 base64 编码工具和类似工具,没有 xxd,没有管道)

答案1

在大多数 shell 中,代码\x6c\x73\x20\x2d\x6c\x61会尝试运行该x6cx73x20x2dx6cx61命令,就像\另一个引用运算符一样。

esfishshell 中,它会尝试运行该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"

相关内容