Bash

ls -la 編碼為十六進制時如何執行?

  • December 11, 2021

網際網路上曾經有一個非常糟糕的笑話,您可以複製以 \x0B\x2E… 開頭的內容(只是一個範例),當您執行此命令時,終端會將其解釋為sudo rm -rf /.

您如何進行這種混淆?我剛剛嘗試執行 Cyber​​chef 並將我的命令轉換為十六進制,即使使用語法ls -la也不會執行此命令。\x<hexcodetwocharactershere>\x<hexcodetwocharactershere>

  • 我究竟做錯了什麼?
  • 有沒有類似的混淆方法?

PS我已經知道base64編碼技巧,但這需要在系統上安裝base64

總而言之,我不想使用 bash 以外的任何其他工具來實現我的目標(所以沒有 base64 編碼工具和類似工具,沒有 xxd,沒有管道)

在大多數 shell 中,\x6c\x73\x20\x2d\x6c\x61程式碼會嘗試像另一個引用運算符x6cx73x20x2dx6cx61一樣執行命令。\

esor fishshells 中,它會嘗試執行ls -la命令並且可能會失敗,因為沒有該名稱的命令。In es,\不是引用運算符,但可用於擴展類似 C 的轉義序列。

in fish\既是引用運算符(如 in sh/ 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

引用自:https://unix.stackexchange.com/questions/680963