今天開始要努力準備 HITCON CTF ... 希望把每天鐵人挑戰占用的時間減少到兩小時內 QQ
前幾天 DEF CON CTF 的介紹有提到近年來的冠軍隊伍除了 PPP 以外,其他兩隊是 DEFKOR
和 DERKOR00T
,後者是 DEFKOR
和 r00timentary
組成的聯隊
DEFKOR 可以說是集結韓國幾乎最強戰力為了挑戰 DEF CON CTF 冠軍而組成的隊伍,幾乎都來自 Best of the Best 資安計畫培育出來,似乎只有重要比賽才會集結
DEFKOR 如果沒有集結,主力成員通常會用 Cykor
參賽,Cykor 的成員不是很多,但每個都是強者,有時候會和 lokihardt
一起組隊以 Cykorkinesis
的名字參賽
lokihardt
是繼 geohot 之後,世界公認的天才駭客之一,之後再來聊他的話題 xdBTW,DEFKOR 或 Cykor 一直以來似乎沒有舉辦過自己的 CTF 比賽 (可能是人數太少的關係 ?),據我所知唯一一次由 Cykor 負責出題的比賽是 SECUINSIDE CTF 2016,但品質有點差強人意.....
關於 DEFKOR 和 Cykor 的輝煌戰績可以參考他們的官方網站:https://cykor.kr/about/
當時得知 Cykor 要負責出 SECUINSIDE CTF 2016 的題目,大家興致勃勃的參加了比賽,結果題目各種出包...QQ 雖然說題目本身質量還是不錯,但 infrastructure 不穩真的會讓大家解題興致降低很多,這題詳細的 write up 可以參考這篇 blog: https://blog.l4ys.tw/2016/07/secuinside-ctf-2016-mbrainfuzz/
這題在連上 service 之後會吐出一段 base64,然後要求我們以 hex 的方式輸入 exploit,但很快就會 timeout 切斷連線
decode server 給的 base64 之後會發現是一個隨機產生的 elf 檔 (每次連線拿到的都會不同),從 argv[1]
讀取我們的 payload,通過 80 個 function 檢查之後就可以觸發 stack overflow,合理推測是要把 elf pwn 拿 shell,但由於 timeout 時間很短,不可能人工逆向之後再寫 exploit,因此需要用 Automatic Exploit Generation (AEG) 的技術來解這題
理論上應該需要用目前由 shellphish 所開發的 angr,或是自己想辦法收集 binary branch 的 constraint 之後進行 SMT solver 之類行為才能解題,具體做法可以參考這篇 write up,但這題因為不斷的出包,導致 80 個檢查 function 越改越簡單 = = 最後每一個檢查 function 都長的差不多:
void __fastcall sub_4007FC(char a1, char a2, char a3, char a4)
{
if ( a3 == 5 && a2 == 1 && a1 == 2 && a3 + 2 < a4 * abs(a3 + 2) )
sub_4008A3(input[116], input[30], input[41], input[86]);
}
void __fastcall sub_4008A3(char a1, char a2, char a3, char a4)
{
if ( a3 == 8 && a2 == 7 && a1 == 1 && a3 + 7 < a4 * abs(a3 - 3) )
sub_40094C(input[58], input[53], input[148], input[66]);
}
...
我們最後解題的 script 用 python + objdump 爬出 branch 的 constant 之後,把 constant 依序放進 buffer 正確位置就能生成 exploit,但隨機生成的 ELF 很多都是 unexploitable 的,還會因為不知名的原因無法正確執行,最後要跑了幾百次才成功解決這題,某種程度而言真的是要考 AEG 啦......
後來這題還出了第二版 mbrainfuzz_returns
,跟原本比起來多開啟了 NX harden,變成不能直接跑 shellcode,因此將 stack overflow 改成用 ret-to-dl-resolve 的技巧來 call system
,這樣就一樣不需要 leak 和多次 input 就能拿 shell
最後附上當時 irc 的 log...XD
14:27 <@mango> mbrainfuzz has some problems, so shutting down..
15:01 <@setuid0> mbrainfuzz challenge is back
15:03 <@setuid0> forgot to change binary. sorry
17:09 < b2xiao> so we're on what, version 8 of mbrainfuzz at this point? I lost track...so many solver scripts, all useless...