看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析

Editor發表於2021-05-25

看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析


少年長成,初為武林盟主。在本題,讓我們和飛停一起踏上尋親之旅,找尋他的身世之謎。


在經過4天的鏖戰後,共有3支戰隊完成本題的戰鬥。mininep 戰隊再一次搶的一血,獲得240分,成功升至第一名。金左手和hzqmwne緊隨其後,分別獲得181、178的好成績。


看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析


接下來,我們一起來看看這道題的奧祕吧!


出題團隊簡介

看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析

KuCha128(Archaia戰隊隊長),武漢科銳35期學員,喜歡打遊戲,痴迷於軟體安全技術研究。主要擅長windows平臺的逆向,研究最多的是殼和程式碼流的防禦和攻擊手段。



賽題設計思路


此題《千里尋根》的設計思路就是程式碼長長長,並且設卡阻止破解者“眼看手跳快速pass大量框架程式碼直搗黃龍”。


技術 • 要點


PE加密殼:


CRC校驗:只校驗外殼程式碼,在攻擊者patch外殼程式碼的時候會導致解壓縮程式碼節資料不對。


反除錯:使用了兩種反除錯“IsDebuggerPresent”和“模擬NtQueryInformationProcess”。


加密匯入表:如果不脫此加密殼就著手研究,在“首代蝸牛”和“末代蝸牛”呼叫API的地方,不能直接看到被呼叫API的名字和地址。

 

蝸牛殼:


SMC加密:使用簡單的加密演算法保護後代蝸牛的程式碼,防止破解者看到未來太遠的程式碼。


地址隨機化:每一代蝸牛展開蝸牛殼,丟擲下一代蝸牛時,隨機指定下一代蝸牛的執行地址。


切片技術:將核心演算法的程式碼切成切片,然後將每個切片貼到每層殼上(有可能有的層是沒有核心演算法程式碼的切片的),每層殼被執行的時候,相應的切片也會被執行。


程式碼獨立:蝸牛殼在運作的時候,不呼叫任何外部的API,不使用外部的堆疊。


對抗指令碼:破解者在看了前面幾層殼的架勢之後,不會真的一層一層單步跟蹤,而會寫指令碼脫殼取肉。這是對比之前兩題主要改進的地方,利用混淆工具對中間層進行隨機混淆,加大破解者尋找蝸牛殼行為特徵寫指令碼的難度。



預期 • 破解思路


思路1(難以實現):


1. 脫去最外層的"加密殼",得到只有"蝸牛殼"的應用程式。


"蝸牛殼"和最外層的"加密殼"不會相互依賴,所以可以確保最外層的"加密殼"脫掉後能正常執行,當然可能大佬不需要脫"加密殼"就能進行下面的破解步驟。


脫殼比較簡單,找到OEP(0x140001088),dump,修復匯入表項(匯入表項只有system/scanf/printf/GetModuleHandleA/ExitProcess/VirtualProtect六項), 即可完成脫殼。


2. 使用x64dbg(或者ida等其他工具)的trace功能,得到"蝸牛殼"所有的執行過的程式碼。


(1) 從“首代蝸牛”輸入完成一直跟蹤到“末代蝸牛”完成比較輸出結果,得到中間所有的程式碼。


(2) 觀察並寫程式碼對上面得到的程式碼進行優化:

去掉跳轉程式碼;

多行彙編程式碼合併成一行(比如把mov rax, 1和add rax, 2 合併成mov rax, 3)。

 

(3) 經過上面的步驟就能發現,“中間的每一代蝸牛”程式碼基本上一樣,根據特徵分離出關鍵演算法程式碼。


3. 根據關鍵演算法程式碼寫逆演算法,此題在演算法上沒有過多設計,參考大佬們寫的《三道八佛》wp演算法部分和base64演算法稍作修改即可寫出KeyGen。


https://bbs.pediy.com/thread-256746.htm
https://bbs.pediy.com/thread-256835.htm


相信有不少選手想嘗試思路1的“trace所有的執行過的程式碼”,都會遇到一個很尷尬的問題:很難trace完,或者莫名其妙trace結束了。


筆者在自己測試時候,使用x64dbg的trace into功能,大概跟蹤半小時後, x64dbg會停止trace,直接把程式執行起來,而且還附帶著"系統庫名稱符號不見了"/"Ctrl+G無法跳轉地址"等一系列奇怪的現象。這應該是x64dbg的BUG吧,輸出資料太多導致無法alloc記憶體。


思路2


斷掉trace的念頭(trace可能是條不歸路),自己跟蹤個一兩層程式碼找特徵,然後編寫除錯指令碼能整層整層跑蝸牛殼。

 

要想破解蝸牛殼保護的程式,最關鍵的步驟就是從萬千程式碼海中提取出“肉程式碼”,這也是此題的難點所在。

 

比較容易發現利用的特徵是每層修改棧時候對gs:[30]寫入值,這個在之前比賽的wp中也有選手提到過。


然後利用esp定律,對棧下訪問斷點(因為每次執行“肉程式碼”都要先恢復暫存器環境,棧地址將對偏移都是固定的),直接執行到"肉程式碼"處,然後一直單步跟完這層的肉程式碼。


指令碼log出來的資料需要自己提取出有用的“肉程式碼”。人肉搞定,或者指令碼一通字串操作也能搞定。


圖片

 

所有的"肉程式碼"拼在一起,就是一個完整的演算法函式了,接著思路1的步驟(3)繼續完成即可。

 

題目 • 小彩蛋


如果直接對printf函式下斷點,在最後輸出提示資訊的時候,rdx/r8/r9暫存器會有字串。


圖片


賽題解析


本賽題解析由看雪論壇 mb_mgodlfyn 給出:


圖片


解析文章連結,請點選:https://bbs.pediy.com/thread-267732.htm


往期解析


1. 看雪·深信服 2021 KCTF 春季賽 | 第二題設計思路及解析

2. 看雪·深信服 2021 KCTF 春季賽 | 第三題設計思路及解析

3. 看雪·深信服 2021 KCTF 春季賽 | 第四題設計思路及解析

4. 看雪·深信服 2021 KCTF 春季賽 | 第五題設計思路及解析

5. 看雪·深信服 2021 KCTF 春季賽 | 第六題設計思路及解析



主辦方


看雪CTF(簡稱KCTF)是圈內知名度最高的技術競技之一,從原CrackMe攻防大賽中發展而來,採取線上PK的方式,規則設定嚴格周全,題目涵蓋Windows、Android、iOS、Pwn、智慧裝置、Web等眾多領域。


看雪CTF比賽歷史悠久、影響廣泛。自2007年以來,看雪已經舉辦十多個比賽,與包括金山、360、騰訊、阿里等在內的各大公司共同合作舉辦賽事。比賽吸引了國內一大批安全人士的廣泛關注,歷年來CTF中人才輩出,匯聚了來自國內眾多安全人才,高手對決,精彩異常,成為安全圈的一次比賽盛宴,突出了看雪論壇複合型人才多的優勢,成為企業挑選人才的重要途徑,在社會安全事業發展中產生了巨大的影響力。


合作伙伴


圖片


深信服科技股份有限公司成立於2000年,是一家專注於企業級安全、雲端計算及基礎架構的產品和服務供應商,致力於讓使用者的IT更簡單、更安全、更有價值。目前深信服在全球設有50餘個分支機構,員工規模超過7000名。



看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析

公眾號ID:ikanxue

官方微博:看雪安全

商務合作:wsc@kanxue.com


相關文章