符號執(zhí)行框架綜述:代碼轉(zhuǎn)換為符號執(zhí)行所需符號的工具與技術(shù)
引言
符號執(zhí)行是一種程序分析技術(shù),它通過使用抽象的符號值代替具體輸入值來分析程序執(zhí)行情況。這種技術(shù)能夠有效探索程序路徑,并生成對應(yīng)路徑的輸入條件,因此被廣泛應(yīng)用于軟件測試、漏洞檢測和逆向工程等領(lǐng)域。本報告將深入探討目前主流的符號執(zhí)行框架,分析它們的功能特點、應(yīng)用場景以及技術(shù)實現(xiàn),為讀者提供全面的符號執(zhí)行工具參考。
符號執(zhí)行技術(shù)概述
符號執(zhí)行的基本概念
符號執(zhí)行是一種靜態(tài)分析技術(shù),旨在理解程序在輸入條件的不同組合下的行為。與傳統(tǒng)的具體執(zhí)行不同,符號執(zhí)行使用符號變量代替具體值作為程序輸入,并用符號表達式表示與符號值相關(guān)的程序變量的值[0]。在遇到程序分支指令時,程序的執(zhí)行也會相應(yīng)地分支,形成不同的符號約束條件。 符號執(zhí)行技術(shù)是一種白盒的靜態(tài)分析技術(shù),它通過采用抽象的符號代替精確值作為程序輸入變量,得出每個路徑抽象的輸出結(jié)果[31]。這種技術(shù)的核心思想是通過使用符號值來代替具體值作為程序輸入,并用符號表達式來表示與符號值相關(guān)的程序變量的值[4]。
符號執(zhí)行的應(yīng)用領(lǐng)域
符號執(zhí)行技術(shù)在多個領(lǐng)域有著廣泛的應(yīng)用:
- 軟件測試:通過生成滿足特定路徑條件的輸入,實現(xiàn)對程序路徑的全面覆蓋
- 漏洞檢測:發(fā)現(xiàn)程序中可能存在的安全漏洞和錯誤
- 惡意軟件分析:分析惡意軟件的行為模式和攻擊方式
- 代碼逆向工程:理解編譯后的二進制代碼的功能和邏輯
- 固件安全分析:分析嵌入式設(shè)備固件的安全性[30]
主流符號執(zhí)行框架
Angr框架
Angr是一個基于Python的二進制分析框架,它支持靜態(tài)分析和符號執(zhí)行,尤其在惡意軟件分析、漏洞挖掘和逆向工程等安全領(lǐng)域中扮演著重要角色[9]。Angr的主要特點:
- 開源性:Angr是一個開源的Python框架,可以直接通過pip安裝
- 功能強大:提供了多種工具,用于靜態(tài)和動態(tài)分析二進制文件,包括反匯編、控制流圖分析、模擬執(zhí)行、符號執(zhí)行等功能[10]
- 多架構(gòu)支持:是一個多架構(gòu)開源二進制分析工具包
- 動態(tài)符號執(zhí)行:能夠?qū)ΧM制文件執(zhí)行動態(tài)符號執(zhí)行,如Mayhem、KLEE等[29] Angr的架構(gòu)包括CLE(用于處理二進制文件和庫)、VEX(中間表示)、SimProcedures(模擬系統(tǒng)調(diào)用)等多個組件。CLE對不同的二進制格式進行抽象,以處理加載給定的二進制文件和它所依賴的任何庫、解析動態(tài)符號、執(zhí)行重定位以及正確初始化程序狀態(tài)[24]。 Angr被廣泛應(yīng)用于CTF競賽中的逆向分析,研究人員可以利用這個工具嘗試對一些CTF題目進行符號執(zhí)行來找到正確的解答,即flag[21][22]。 此外,Angr還被用于惡意軟件分析工具SEMA的開發(fā),SEMA基于angr,而angr則用于提取API調(diào)用[27]。
KLEE框架
KLEE是一個封裝比較好的符號執(zhí)行工具,可以直接輸入程序進行分析,不像angr那樣更像是一個框架[15]。KLEE主要用于C語言代碼的符號執(zhí)行分析。KLEE的特點:
- 封裝性:相比于angr,KLEE是一個可以直接使用的工具
- 針對C語言:主要面向C代碼的符號執(zhí)行
- 高效性:在處理非聚合類型的輸入時,Klee表現(xiàn)卓越(達82.80%)[25] KLEE在軟件測試和漏洞挖掘領(lǐng)域有著廣泛的應(yīng)用,它可以有效地探索程序的執(zhí)行路徑,并生成滿足特定路徑條件的輸入。
S2E框架
S2E是一個選擇性的符號執(zhí)行平臺,構(gòu)建于QEMU之上。在Avatar框架中,S2E提供了一個功能強大的插件接口,插件可以通過這些接口攔截仿真事件(比如,基本塊)[33]。S2E的主要特點:
- 基于QEMU:構(gòu)建于QEMU虛擬機監(jiān)控器之上
- 選擇性符號執(zhí)行:可以選擇性地對程序的某些部分進行符號執(zhí)行
- 插件系統(tǒng):提供強大的插件接口,方便擴展功能 S2E是針對KLEE無法對二進制生成LLVM IR的缺點而開發(fā)的,它在QEMU虛擬機上實現(xiàn)了將二進制程序翻譯成中間表示的功能[16]。
Z3約束求解器
Z3是由微軟開發(fā)的一個SMT(滿意賦值理論)求解器,雖然它本身不是一個完整的符號執(zhí)行框架,但在符號執(zhí)行過程中扮演著重要角色。Z3用于解決符號執(zhí)行過程中生成的約束條件,幫助確定是否存在滿足特定路徑條件的輸入。Z3的特點:
- 高效約束求解:能夠高效地求解符號執(zhí)行過程中生成的約束條件
- 多語言支持:提供多種編程語言的接口,包括Python、C++等
- 廣泛應(yīng)用于符號執(zhí)行工具:許多符號執(zhí)行工具,如angr,都使用Z3作為約束求解器 Z3在符號執(zhí)行過程中與符號執(zhí)行引擎(如angr)配合使用,在整個過程中,會使用Z3來求解路徑約束,以生成滿足特定路徑條件的測試用例[18]。
Boomerang框架
Boomerang是一個反編譯工具,它可以將二進制代碼轉(zhuǎn)換為高級語言表示,為符號執(zhí)行提供更高級的抽象。雖然它本身不是一個完整的符號執(zhí)行框架,但可以與符號執(zhí)行工具結(jié)合使用。
Triton框架
Triton是一個用于分析二進制程序的符號執(zhí)行框架,它可以幫助定位與用戶輸入有交互的代碼塊,并對這些代碼塊進行符號執(zhí)行,從用戶輸入點作為符號變量開始,直到達到所需的約束條件[23]。
μEmu和Jetset
2021年的μEmu和Jetset將符號執(zhí)行框架(如S2E或Angr)與固件重新托管技術(shù)結(jié)合,以提高固件仿真的效率[30]。這些工具在嵌入式設(shè)備固件安全分析領(lǐng)域有著重要應(yīng)用。
Driller
Driller是AFL(American Fuzzy Lop)和angr結(jié)合的產(chǎn)物,它通過結(jié)合模糊測試和符號執(zhí)行,提高漏洞發(fā)現(xiàn)的效率。Driller的使用需要通過import來導(dǎo)入angr和driller接口,在包含afl和angr的虛擬環(huán)境中部署好之后,可以通過腳本來調(diào)用[32]。
DICE
DICE是在P2IM的基礎(chǔ)上增加DMA仿真功能的符號執(zhí)行框架,它擴展了符號執(zhí)行的應(yīng)用范圍,使其能夠處理更復(fù)雜的系統(tǒng)[30]。
符號執(zhí)行框架的比較
S2E、Angr、KLEE和QSYM的比較
根據(jù)搜索結(jié)果,S2E、Angr、KLEE和QSYM是四個主要的符號執(zhí)行引擎[16]。它們的主要區(qū)別在于:
- S2E:構(gòu)建于QEMU之上,是一個選擇性的符號執(zhí)行平臺,提供強大的插件接口
- Angr:基于Python的二進制分析框架,支持動態(tài)符號執(zhí)行和靜態(tài)分析
- KLEE:封裝比較好的符號執(zhí)行工具,主要用于C語言代碼的分析
- QSYM:可能是一個針對特定場景優(yōu)化的符號執(zhí)行引擎
動態(tài)符號執(zhí)行和LLM的比較
在生成測試用例方面,動態(tài)符號執(zhí)行工具如Klee在特定場景下表現(xiàn)良好。對于非聚合類型的輸入,Klee表現(xiàn)卓越(達82.80%),展示了符號執(zhí)行技術(shù)在理想條件下的高效性。但在實際復(fù)雜場景中,其局限性也較為明顯[25]。
靜態(tài)二進制分析的局限性
靜態(tài)二進制分析盡管使得系統(tǒng)能檢測到所有可能的程序路徑,卻犧牲了可擴展性和表現(xiàn)。靜態(tài)二進制分析通常很慢,在處理間接跳轉(zhuǎn)語句時也受限。在構(gòu)造CFG(控制流圖)時處理非直接跳轉(zhuǎn)語句也面臨挑戰(zhàn)[34]。
符號執(zhí)行工具的最新發(fā)展
多線程并行符號執(zhí)行引擎
隨著計算能力的提升,多線程并行的符號執(zhí)行引擎成為研究熱點。基于多線程并行的符號執(zhí)行引擎設(shè)計與實現(xiàn)的研究表明,這種技術(shù)可以顯著提高符號執(zhí)行的效率和性能[26]。
結(jié)合機器學(xué)習(xí)的符號執(zhí)行
將機器學(xué)習(xí)技術(shù)與符號執(zhí)行相結(jié)合,可以提高符號執(zhí)行的效率和準(zhǔn)確性。例如,利用LLM(大語言模型)與動態(tài)符號執(zhí)行相結(jié)合,可以生成更有效的測試用例[25]。
嵌入式設(shè)備固件安全分析
隨著物聯(lián)網(wǎng)設(shè)備的普及,嵌入式設(shè)備固件的安全分析成為研究熱點。2021年的μEmu和Jetset將符號執(zhí)行框架(如S2E或Angr)與固件重新托管技術(shù)結(jié)合,以提高固件仿真的效率。2021年的DICE在P2IM的基礎(chǔ)上增加DMA仿真功能,進一步擴展了符號執(zhí)行的應(yīng)用范圍[30]。
符號執(zhí)行工具的使用場景
漏洞挖掘
符號執(zhí)行工具在漏洞挖掘領(lǐng)域有著廣泛應(yīng)用。通過符號執(zhí)行,可以系統(tǒng)地探索程序的執(zhí)行路徑,發(fā)現(xiàn)可能導(dǎo)致安全漏洞的輸入條件。例如,Angr、KLEE等工具都被廣泛應(yīng)用于漏洞挖掘研究中。
代碼混淆研究
符號執(zhí)行工具如KLEE和Angr也被用于代碼混淆研究。通過對混淆代碼進行符號執(zhí)行,可以分析代碼的行為,理解混淆技術(shù)的實現(xiàn)原理,從而開發(fā)更有效的反混淆方法[19]。
惡意軟件分析
符號執(zhí)行技術(shù)在惡意軟件分析領(lǐng)域也有重要應(yīng)用。例如,SEMA是一款基于符號執(zhí)行的惡意軟件分析工具,可以幫助研究人員輕松執(zhí)行惡意軟件分析任務(wù)。SEMA基于angr,而angr則用于提取API調(diào)用[27]。
CTF逆向分析
在CTF競賽中,符號執(zhí)行工具如Angr被廣泛用于逆向分析。研究人員可以利用這些工具嘗試對CTF題目進行符號執(zhí)行,找到正確的解答,即flag[21][22]。
符號執(zhí)行工具的局限性
性能問題
符號執(zhí)行工具通常面臨性能問題,特別是在處理大型程序時。符號執(zhí)行需要維護大量的符號狀態(tài),這可能導(dǎo)致計算資源消耗過大,執(zhí)行時間過長。
狀態(tài)爆炸問題
隨著程序路徑的增加,符號執(zhí)行需要維護的狀態(tài)數(shù)量可能會呈指數(shù)級增長,導(dǎo)致狀態(tài)爆炸問題。這限制了符號執(zhí)行在復(fù)雜程序上的應(yīng)用。
間接跳轉(zhuǎn)處理困難
靜態(tài)二進制分析在處理間接跳轉(zhuǎn)語句時面臨挑戰(zhàn)。間接跳轉(zhuǎn)可能導(dǎo)致無法準(zhǔn)確構(gòu)建控制流圖,影響符號執(zhí)行的準(zhǔn)確性[34]。
結(jié)論
符號執(zhí)行是一種強大的程序分析技術(shù),它通過使用符號變量代替具體值,探索程序的所有可能執(zhí)行路徑。目前,已經(jīng)開發(fā)了多種符號執(zhí)行框架和工具,如Angr、KLEE、S2E等,它們在軟件測試、漏洞檢測、惡意軟件分析等領(lǐng)域有著廣泛的應(yīng)用。 隨著技術(shù)的發(fā)展,符號執(zhí)行工具也在不斷演進,出現(xiàn)了多線程并行符號執(zhí)行引擎、結(jié)合機器學(xué)習(xí)的符號執(zhí)行等新技術(shù)。這些技術(shù)的發(fā)展使得符號執(zhí)行工具能夠處理更復(fù)雜的程序,提高分析效率和準(zhǔn)確性。 然而,符號執(zhí)行工具仍然面臨性能問題、狀態(tài)爆炸問題和間接跳轉(zhuǎn)處理困難等挑戰(zhàn)。未來的研究方向可能包括優(yōu)化符號執(zhí)行算法,減少狀態(tài)空間,提高處理間接跳轉(zhuǎn)的能力,以及結(jié)合其他技術(shù)(如機器學(xué)習(xí))來提高符號執(zhí)行的效率和準(zhǔn)確性。
參考文獻
[0] test Symbolic Execution-01-符號執(zhí)行(Symbolic Execution)簡介原創(chuàng). https://blog.csdn.net/ryo1060732496/article/details/135543800.
[4] 符號執(zhí)行(Symbolic Execution) 與約束求解(Constraint Solving) - 騰訊云. https://cloud.tencent.com/developer/article/2377216.
[9] 符號執(zhí)行之a(chǎn)ngr初探原創(chuàng) - CSDN博客. https://blog.csdn.net/hanxuer_/article/details/106065133.
[10] 符號執(zhí)行angr安裝與使用原創(chuàng) - CSDN博客. https://blog.csdn.net/xshower/article/details/113869873.
[15] KLEE 源碼閱讀筆記-安全KER. https://www.anquanke.com/post/id/240038.
[16] 符號化執(zhí)行引擎對比原創(chuàng) - CSDN博客. https://blog.csdn.net/m0_37907383/article/details/105674577.
[18] 符號執(zhí)行,從漏洞掃描到自動化生成測試用例. http://www.szyisi.cn/article/663849.html.
[19] 2021看雪SDC議題回顧| 代碼混淆研究的新方向. https://zhuanlan.zhihu.com/p/426876577.
[21] 符號執(zhí)行-Angr實踐原創(chuàng) - CSDN博客. https://blog.csdn.net/yalecaltech/article/details/88753923.
[22] 利用Angr進行簡單CTF逆向分析-符號執(zhí)行工具. http://www.szyisi.cn/article/554933.html.
[23] [翻譯]使用Triton框架分析混淆代碼(How Triton may help to ... - 看雪. https://bbs.kanxue.com/thread-277009.htm.
[24] angr原理與實踐(一)——原理- WelkinChan - 博客園. https://www.cnblogs.com/welkinchan/p/16483119.html.
[25] LLM與動態(tài)符號執(zhí)行生成測試用例的比較原創(chuàng) - CSDN博客. https://blog.csdn.net/qq_44370676/article/details/144159798.
[26] 基于多線程并行的符號執(zhí)行引擎設(shè)計與實現(xiàn) - 計算機研究與發(fā)展. https://crad.ict.ac.cn/cn/article/doi/10.7544/issn1000-1239.202220920?viewType=HTML.
[27] SEMA:一款基于符號執(zhí)行的惡意軟件分析工具 - FreeBuf. https://www.freebuf.com/sectool/412060.html.
[29] ANGR初識原創(chuàng) - CSDN博客. https://blog.csdn.net/leiwuhen92/article/details/134171222.
[30] [PDF] 嵌入式設(shè)備固件仿真器綜述 - 計算機研究與發(fā)展. https://crad.ict.ac.cn/cn/article/pdf/preview/10.7544/issn1000-1239.202330476.pdf.
[31] 符號執(zhí)行 - 極客方舟. https://deelmind.com.cn/reverse/symbolic/.
[32] 符號執(zhí)行結(jié)合fuzz總結(jié)原創(chuàng) - CSDN博客. https://blog.csdn.net/sjlving123/article/details/114636197.
[33] [PDF] 嵌入式設(shè)備固件安全分析技術(shù)研究綜述 - 計算機學(xué)報. http://cjc.ict.ac.cn/online/bfpub/yyc-2020818141436.pdf.
[34] 關(guān)于CRS中的自動化漏洞檢測和攻擊代碼生成研究綜述. https://rowl1ng.com/MyWiki/machine_learning/application/automated_vulnerability_detection.html.