少年長成,初為武林盟主。在本題,讓我們和飛停一起踏上尋親之旅,找尋他的身世之謎。
在經過4天的鏖戰後,共有3支戰隊完成本題的戰鬥。mininep 戰隊再一次搶的一血,獲得240分,成功升至第一名。金左手和hzqmwne緊隨其後,分別獲得181、178的好成績。
接下來,我們一起來看看這道題的奧祕吧!
出題團隊簡介
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名。
公眾號ID:ikanxue
官方微博:看雪安全
商務合作:wsc@kanxue.com