Rex:棧溢位之Exploit自動生成
*本文原創作者:xiaohan0x00,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
Rex 是由 Shellphish 開發的自動化漏洞利用引擎,設計初衷在於參加 Cyber Grand Challenge 。本文以棧溢位為例,展示 Rex 自動生成 Exploit 的能力。測試樣例為 Linux 下可執行程式 vuln_stacksmash ,其中存在棧溢位漏洞,通過 Rex 自動生成 rop2system、rop2text、jmpesp 三種 Exploit。
0×00 vuln_stacksmash 棧溢位漏洞
使用 radare2 簡要分析 vuln_stacksmash。vuln() 函式中,呼叫 read(int fd, void * buf, size_t count) 時未檢查緩衝區大小,導致棧溢位。
使用 GDB 除錯 vuln_stacksmash,執行至溢位點,程式狀態如下:
計算偏移為 0×44,構造 PoC 並輸入。單步執行並檢查棧幀情況,可見 EBP 已被 “\x41\x41\x41\x41” 覆蓋,後續四個位元組為 EIP 值,已被覆蓋為 “\x42\x42\x42\x42”。
跟蹤至 vuln() 返回,觸發異常,EIP 被劫持為 “\x42\x42\x42\x42”。
上文簡要分析了 vuln_stacksmash 中存在的棧溢位漏洞,下文將介紹如何利用 Rex 自動生成 Exploit。
0×01 Rex 指令碼
Rex 的實現基於 Angr,主要採用混合符號執行技術,對原理感興趣的同學可以閱讀論文 《(State of) The Art of War: Offensive Techniques in Binary Analysis》 。由於封裝的原因,整體程式碼看起來較為簡潔,從漏洞復現、漏洞型別判定、Exploit 生成到 Exploit 有效性驗證,共計 10 行程式碼。其中,Crash 類用以復現漏洞並返回漏洞型別,Exploit 類用以判定漏洞的可利用性,並生成 Exploit。171 ~ 174 行用以驗證 Exploit 的有效性。
0×02 漏洞復現
Rex 在實現混合符號執行時,首先使用 QEMU 進行 Concrete Execution,在獲取到 Crash 狀態後,使用 Angr 進行 Concolic Execution,相關功能封裝在 Crash 類中。
1、Concrete Execution
使用 QEMU 載入 vuln_stacksmash,以 PoC 為輸入執行,獲取程式崩潰時的狀態。執行結果如下:
2、Concolic Execution
在獲取到 Crash state 後,基於 Angr 實現 Concolic Execution。首先設定程式初始狀態。
使用 ‘posix’、’preconstrainer’ 外掛輔助分析:
SimSystemPosix()
Data storage and interaction mechanisms for states with an environment conforming to posix. Available as “state.posix“.
SimStatePreconstrainer()
This state plugin manages the concept of preconstraining – adding constraints which you would like to remove later. :param constrained_addrs : SimActions for memory operations whose addresses should be constrained during crash analysis
使用 ‘Tracer’、’Oppologist’ 兩種 Exploration_techniques:
設定 simulation_manager :
執行結果:
0×03 漏洞型別判定
Crash 類中的 _triage_crash() 方法對漏洞型別進行判定。
執行結果為 IP_OVERWRITE:
0×04 Exploit 生成
程式碼中設定了 rop_leak_memory、rop_set_register、 explore_for_exploit 三種利用方式。通過閱讀原始碼可知,rop_leak_memory、rop_set_register 均是針對 CGC 格式檔案的利用技術。在 Rex 現有的 exploit_technique 中,call_jmp_sp_shellcode、call_shellcode、rop_to_system 三種技術用以針對 ELF 檔案。執行結果如下:
0×05 Verified
對三種生成結果進行確認。
0×06 小結
通過學習 Rex 原始碼以及混合符號執行,成功對棧溢位漏洞生成 Exploit。文中所針對的漏洞非常簡單,且未涉及 ASLR 等安全機制的繞過。由於弟才疏學淺,文中難免存在理解不當之處,望各位師傅批評指正。
*本文原創作者:xiaohan0x00,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載