iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
2
Security

CTF 的三十道陰影系列 第 26

Day26: [Reverse] 能坐著,就不要站著,能躺著,就不要坐著

前言

今天要介紹的人物也是低調的強者,還直接嗆說寫他一定會發現沒東西好寫,只好改寫別人 XDD

沙發馬鈴薯

Lays,a.k.a L4ys,跟 Orange 一樣也是在 CTF 盛行之前就接觸資安圈的 senpai (不過後來大學畢業之後就到交大 SQLAB 變我學弟了,變成我才是 senpai QQ)

剛開始接觸資安是寫遊戲外掛,聽說有被 ban 過不少帳號 XD 在接觸 HITCON CTF 之前,主要在 Hack Stuff 社群活躍 (...或是潛水 ?)

Lays 的專長是逆向工程,而且樂在其中 XD reverse 題我偶爾也會看一下,但通常是沒有 pwn 題做的次要選擇,是 HITCON CTF reverse 組的最強戰力之一
比較少出題目,但卻是 HITCON CTF 能成功推動的最重要幕後功臣,但同時也是廉價工具人 (幫 QQ),比如說這個前台光彩炫目的光劍,後面是由 Lays 負責撰寫韌體的部分

以前是個只需要給香蕉就可以躺著等任務完成,但自從開始接觸 bounty 之後已經逐漸變成 充滿銅臭味的大人

最早開始意識到 Lays 應該是在 2013 年的 HITCON Wargame,單槍匹馬就殺進前十名

後來 DEF CON 22 CTF 回國後,在交大開設的程式安全中以亂入的身分霸佔排行榜前幾名,在這之前也有解當時 SQLAB 架設的 wargame.cs.nctu.edu.tw

  • 節錄當年 HITCON irc 的對話.....

    16:22 < Lays_> nctu wargame 的最後一題哪時候要修 T _ T
    16:22 < Lays_> 可惡 想打
    16:23 < cychao> Lays_: 要打我在幫你開
    16:23 < Lays_> 我怕一直 pwn 不出來你手會酸
    16:23 < cychao> Lays_: 那你等crax.ctf.tw吧
    16:24 < ddaa> Lays_: 敬請期待~

  • 不過後來 crax.ctf.tw 沒誕生就是了,只有誕生 http://secprog.cs.nctu.edu.tw

當然亂打別人的課程的 CTF 會受到懲罰的,後來就 jeffxx 被抓來當台交賽 CTCTF 的動畫製作,這一當就當了六年,到現在 HITCON CTF Final 的戰場還是由 Lays 做的......XD 每年 Lays 都會說:「明年我們應該找網頁前端/動畫製作/.....」之類的台詞

前面在 angelboy 那篇提過,2017 年 Lays, angelboy 和我架設了 pwnable.tw,Lays 一個人就包辦了:網站視覺設計、資料庫設計、成就系統、贊助系統......總之就是包辦了整個前端設計 XD 另外兼直客服組,負責處理從 email 寄來的客戶需求

另外 Lays 也是最早在 FireEye 舉辦的逆向工程競賽中最早破台的幾個台灣人之一

  • 今年 2019 破台的人數比較多一些,前幾年只有 lucasLays 破台

最後不得不說,Lays 是 HITCON CTF team 裡面的 幹話王 ****兼 梗圖王,這篇文章標粗體字的部分全部都是 Lays 的經典名句.....XD

  • 比如說,就在剛剛出現了以下對話:

    O: 你怎麼沒有去 Bluehat
    L: 其實我有票,但我沒有機票

    (歡迎大家贊助 Lays 機票出國 X)

Lazy Project

常把 能坐著,就不要站著,能躺著,就不要坐著 掛在嘴邊,並身體力行,所有做了各種幫助偷懶的 Lazy Project,讓大家省下寶貴的時間,來做更偷懶的事情,接著就來一一介紹:

1. LazyIDA

IDA Pro plugin,裡面各種精巧的小功能,雖然不一定是都經常用到,但需要用到的時候就會在心中感慨:感恩 lays,讚嘆 lays

  • Remove function return type in Hex-Rays
    • IDA Pro 轉 pseudo code 之後預設 return type 都會是 __int64,對我這種有強迫症的人來說不轉回 void 實在很痛苦
    • 這個指令大約可以幫忙省下 3 秒改型態的時間,假設每天逆用到 10 次,就省下了半分鐘的時間,一年就省了 10950 s ~= 182 min ~= 3 hr 的時間,可以多看 6 集動畫
  • Convert data into different formats
    • 做逆向時經常要把 binary 裡面的 raw data 做解密或進一步的分析,通常會需要把內容 copy-paste 到其他程式內進行處理,做法可能有:
      1. 切到 hexdump 的 view 然後用滑鼠慢慢框要選取的資料,貼到其他 editor 再改成需要的格式

        • 菜逼巴的做法,沒錯就是我 QQ
      2. 用 xxd 之類的程式打開 binary,找到 offset 之後再搭配 grep 將 pipe 到 awk 做轉換

        • geek 的做法,但要找 offset 還是很困難
      3. 安裝 LazyIDA,一鍵滿足你的願望

  • Scan for format string vulnerabilities
    • 根據 assembly 來判斷程式內是不是以 fmt string 的漏洞
    • 解 CTF 的題目還算好用,但遇到 compile 比較特殊的程式誤判率有點高 XD
  • Jump to vtable functions by double clicking
    • 我現在才發現原來這功能是 LazyIDA 做的......
  • Lazy shortcuts
    • 跟 remove type 的類似,都是各種一鍵完成的懶人包 XD
    • 這樣總共的使用量應該可以省下 6 hr,差不多夠我們追完一季的動畫,或是把鬼滅之刃 19 重看 12 次,可喜可賀

2. IDASignsrch

分析 real world 程式的工具,real world 的程式經常會有共用的 code,因此可以透過 binary 的 signature 來從 database 尋找是不是有人已經看過這段 code 的邏輯

  • 這個工具可以從 IDA Pro 裡面直接看到 search 的結果
  • 不過 database 是從別人的 project 拿的 ... XD
  • 我個人沒有使用這個工具 QQ 無法評估節省多少時間

3. LazyKLEE

相信打 CTF 的一定都遇過要解 SMT solver 的題目,尤其是 reverse 的題型 ... XD 平常我們可能會選擇用 python z3,比較好寫 code,但執行速度就是慢......QQ KLEE 執行的快,但是環境相對麻煩

  • LazyKLEE 的功能就是自動幫你設定好 KLEE,因此我們只要專注在寫 SMT solver 的部分就好
  • 因為 IDA Pro 越來越方便,很多情況只要將 pseudo code dump 出來再稍微改一下就好了
  • 根據題目難度節省的時間有所不同,尤其是故意設計成 z3 跑很久的題目,隨便亂估計能節省 10 ~ 30 min 的時間

結語

Lays 在 reverse 和 Windows 上的耕耘終於在 2019 年開花結果,拿到微軟的百大駭客的第 42 名 (灑花)

  • Lays:「是微軟七十五大駭客

最後引用 Lays 自述的部分貼文做結尾,也希望自己之後也能有所成績

覺得比起打 CTF 打到被總統召見
最棒的還是能夠持續做著自己喜歡的事情吧
十年了
上班的時候還是會不自覺的跟同事說「我覺得做逆向好爽喔」這種幹話
我真的是沒救了

0x19: HITCON CMT 2017 mini wargame Reverse winmine.exe

Lays 說他每年 HITCON CTF 都沒出題,今天一定找不到題目來寫...... 太天真了,雖然當時我沒有解這題,但我當時 edu ctf 也出了一題 minesweeper,所以對這題可是印象深刻呢......XD

  • Lays: "Make reverse wargame great again."

開啟程式後看起來跟 Windows 的踩地雷差不多,但如果有對 Windows 踩地雷熟悉的人,應該一眼就會看出不對勁,地圖大小是 40x40,但初級地圖是 8x8、中級 16x16、高級 36x16,因此這是一張自訂大小的地圖

  • 但看不出來也沒關係,因為這跟解題完全無關 (逃)

隨便點一個位置,基本上有很高的機率爆炸,但我們可以發現插旗子的部分有個 T 的 pattern:

如果運氣夠好沒有被炸死,可以在下一次遊戲發現 pattern 變成 H

猜了三個字之後會發現 pattern 分別是:THE,可以推測應該猜到最後就可以得到一句包含 flag 的句子,知道程式在幹嘛之後,逆向起來就比較有切入點,同時程式內包含了 Are u a hacker O_o? 的字串,根據過往解逆向題的經驗,使用到這類字串可能是出題者用來驗證某些事情的 function,因此也值得重點觀察

經過一連串樸實無華而枯燥的逆向之後,會發現這些 pattern 是與 0x00973bd9 存的內容有關,內容是一串內容是 0 或 1 的 byte array,如果把該位置的 bit 以 15 個字為一組,每三個為一行排列,就會得到以下的 patterrn,應該不難看出字串是 THEFLAGIShitcon{BOOM!}

@@@@@@  @@  @@  @@@@@@  @@@@@@  @@      @@@@@@  @@@@@@  @@@@@@  @@@@@@  @@                      
  @@    @@  @@  @@      @@      @@      @@  @@  @@        @@    @@      @@        @@      @@    
  @@    @@@@@@  @@@@@@  @@@@@@  @@      @@@@@@  @@  @@    @@    @@@@@@  @@@@@@          @@@@@@  
  @@    @@  @@  @@      @@      @@      @@  @@  @@  @@    @@        @@  @@  @@    @@      @@    
  @@    @@  @@  @@@@@@  @@      @@@@@@  @@  @@  @@@@@@  @@@@@@  @@@@@@  @@  @@    @@      @@    

                          @@@@  @@@@    @@@@@@  @@@@@@  @@  @@    @@    @@@@  
                          @@    @@  @@  @@  @@  @@  @@  @@@@@@    @@      @@  
@@@@@@  @@@@@@  @@@@    @@@@    @@@@@@  @@  @@  @@  @@  @@  @@    @@      @@@@
@@      @@  @@  @@  @@    @@    @@  @@  @@  @@  @@  @@  @@  @@            @@
@@@@@@  @@@@@@  @@  @@    @@@@  @@@@@@  @@@@@@  @@@@@@  @@  @@    @@    @@@@

後來得知這題有個歪解是謝夫羅德大法 ......XD 當然踩地雷本身沒有 Save Game 的功能,但可以將 binary 丟進 VM 裡面執行,每一次嘗試之前都先做 snapshot,如果成功踩中安全地帶得到下一個 pattern 就再做一次 snapshot,失敗就還原回去......,不得不說是很有創意的解法 XDD

(本文逆向部分是參考自 linglingblog,當時不小心先得知 unintended solution 就沒認真看了......(艸),只有重新 parse pattern 讓結果比較好閱讀)


上一篇
Day25: [Misc] 我從來沒想過我會害怕寫 code
下一篇
Day27: [Forensic] 他們轉生變成 CTFer 這檔事
系列文
CTF 的三十道陰影31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言