今年修了交大程安,期末考是用 AIS3 EOF 的初賽算分,很久沒有打 CTF 了,今年出題的品質很高,有很容易出現非預期解的那種題目,寫幾題自己有興趣的 Writeup
Execgen & Execgen-Revenge
這題簡單來說是給了一個 tmpfile,其中 IFS='',並在第一行寫入 #!{{可控}}(created by execgen)
這樣的檔案稱作 Shebang ,其中簡單版寫入沒有限制,困難版有 ^[A-Za-z0-9 /]*$ 的 Regex
tmpfile 執行後因為 IFS 的關係,會把後面所有的參數都當作 argv[1],所以不能用常見的 Command Injection Bypass 技巧繞過,好像很有多種解法,寫下來當作紀錄
預期解(吧)
Shebang 的長度受到 Kernel BINPRM_BUF_SIZE 常數的限制,在大約 2019 之前是 128,之後是 256
所以用空格或是 / 把長度補到剛好,後面的 (created by execgen) 就會被截斷。
e.g print('/'*233 + 'bin/cat /home/chal/flag')
非預期解 #1 - script
這個是我去翻 /bin 後找到的,在這題之前我也不知道有這種東西

簡單來說用途就是開個 session 並把結果當作檔案寫入檔名 argv[1] 的檔案中,而且這個程式也有支援 -c 的 argument(just like bash),而且更好的是,在 bash 中如果把指令跟 -c 一起放進 argv[1] 的話會被 parse 壞,要分成 argv[1] = -c / argv[2] = {{shell}} 這樣才不會用壞,但 script 的話可以直接放在 argv[1] 中。
所以直接 /bin/script /tmp/{{random}} 就可以拿到一個不回顯的 shell,然後再 /bin/cat /tmp/{{random}} 就可以了
因為是 nobody ,所以要一個能寫入的地方 (e.g. tmp),不然會 Permission denied雖然/tmp/{{random}}尾端會被加上(created by execgen)但沒關係,會被當成檔名一起執行。

非預期解 #2 - tee
tee 就是 tee ,把 stdin 給到 stdout,並 clone 一份到 argv[1] 的檔案中,所以跟 #1 差不多,先用 /bin/tee /tmp/{{random}} 寫入一個檔案,然後再用 /bin/bash /tmp/{{random}} 去呼叫即可
