今年修了交大程安,期末考是用 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}}
去呼叫即可