Bash
ls -la 編碼為十六進制時如何執行?
網際網路上曾經有一個非常糟糕的笑話,您可以複製以 \x0B\x2E… 開頭的內容(只是一個範例),當您執行此命令時,終端會將其解釋為
sudo rm -rf /
.您如何進行這種混淆?我剛剛嘗試執行 Cyberchef 並將我的命令轉換為十六進制,即使使用語法
ls -la
也不會執行此命令。\x<hexcodetwocharactershere>\x<hexcodetwocharactershere>
- 我究竟做錯了什麼?
- 有沒有類似的混淆方法?
PS我已經知道base64編碼技巧,但這需要在系統上安裝base64
總而言之,我不想使用 bash 以外的任何其他工具來實現我的目標(所以沒有 base64 編碼工具和類似工具,沒有 xxd,沒有管道)
在大多數 shell 中,
\x6c\x73\x20\x2d\x6c\x61
程式碼會嘗試像另一個引用運算符x6cx73x20x2dx6cx61
一樣執行命令。\
在
es
orfish
shells 中,它會嘗試執行ls -la
命令並且可能會失敗,因為沒有該名稱的命令。Ines
,\
不是引用運算符,但可用於擴展類似 C 的轉義序列。in fish
\
既是引用運算符(如 insh
/csh
)又是轉義序列引入器(如 in )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