iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 15
1
Security

CTF 的三十道陰影系列 第 15

Day15: [Pwn] DEFKOR & Cykor

前言

今天開始要努力準備 HITCON CTF ... 希望把每天鐵人挑戰占用的時間減少到兩小時內 QQ

DEFKOR & Cykor

前幾天 DEF CON CTF 的介紹有提到近年來的冠軍隊伍除了 PPP 以外,其他兩隊是 DEFKORDERKOR00T,後者是 DEFKORr00timentary 組成的聯隊

DEFKOR 可以說是集結韓國幾乎最強戰力為了挑戰 DEF CON CTF 冠軍而組成的隊伍,幾乎都來自 Best of the Best 資安計畫培育出來,似乎只有重要比賽才會集結

  • 跟 HITCON CTF Team 有點類似,HITCON 平常都用 217 或其他名字參賽,只有 DEF CON CTF 或種子賽才會集結

DEFKOR 如果沒有集結,主力成員通常會用 Cykor 參賽,Cykor 的成員不是很多,但每個都是強者,有時候會和 lokihardt 一起組隊以 Cykorkinesis 的名字參賽

  • lokihardt 是繼 geohot 之後,世界公認的天才駭客之一,之後再來聊他的話題 xd
  • DEFKOR = Cykor + Raon_ASRT + lokihardt
  • Cykorkinesis 至今包辦了所有 HITCON CTF Final 的冠軍
  • 我自己第一次對 Cykor 有印象是 SECCON CTF 2014 Final,以 TOEFL Beginner 的名字參賽,從一開始就輾壓全場直到結束,當年 HITCON 獲得第二名

BTW,DEFKOR 或 Cykor 一直以來似乎沒有舉辦過自己的 CTF 比賽 (可能是人數太少的關係 ?),據我所知唯一一次由 Cykor 負責出題的比賽是 SECUINSIDE CTF 2016,但品質有點差強人意.....

關於 DEFKOR 和 Cykor 的輝煌戰績可以參考他們的官方網站:https://cykor.kr/about/

0x0e: SECUINSIDE CTF 2016 mbrainfuzz / mbrainfuzz_returns

當時得知 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) 的技術來解這題

  • AEG 的概念其實最早是由 CMU 所提出 (沒錯,就是培育出 PPP 這個隊伍的 CMU 大學 XD),可以參考這篇 論文,之後論文的發表人 David Brumley 和 Thanassis Avgerinos 成立了 ForAllSecure,2016 年還參加 DARPA CGC 競賽獲得了冠軍

理論上應該需要用目前由 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...


上一篇
Day14: [Reverse] PPP & Plaid CTF
下一篇
Day16: [Pwn] Educational Heap Exploitation
系列文
CTF 的三十道陰影31

尚未有邦友留言

立即登入留言