張斌等
摘 要: 傳統(tǒng)模糊測試中,由于不同的輸入可能重復(fù)測試相同的狀態(tài)空間,導(dǎo)致其效率嚴(yán)重低下。提出一種基于動(dòng)態(tài)污點(diǎn)分析與輸入分域技術(shù)相結(jié)合的二進(jìn)制程序?qū)蛐阅:郎y試技術(shù),可以對(duì)典型安全敏感操作與一般模塊函數(shù)進(jìn)行導(dǎo)向性模糊測試,很好地解決了傳統(tǒng)模糊測試效率低下的問題。實(shí)現(xiàn)了二進(jìn)制導(dǎo)向性模糊測試的原型系統(tǒng)TaintedFuzz,實(shí)驗(yàn)證明,該系統(tǒng)能夠?qū)ΧM(jìn)制程序中存在的典型安全漏洞進(jìn)行高效地發(fā)掘。
關(guān)鍵詞: 安全漏洞; 導(dǎo)向性模糊測試; 動(dòng)態(tài)污點(diǎn)分析; 輸入分域
中圖分類號(hào): TN915.08?34 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)19?0089?06
Method of binary oriented fuzzy testing based on dynamic taint analysis
ZHANG Bin, LI Meng?jun, WU bo, TANG Chao?jing
(College of Electronic Science and Engineering, National University of Defence Technology, Changsha 410073, China)
Abstract: Since traditional fuzzy testing may test the same state space repeatedly due to the different input, and lead to a low efficiency, a binary oriented fuzzy testing technique based on dynamic taint analysis combined with input field classification technology is presented in this paper, which can perform the oriented fuzzy testing for typical security?sensitive operation and general module function, and serve as a good solution to the problem of low efficiency of the traditional fuzzy testing. The prototype system TaintedFuzz was also realized for binary oriented fuzzy testing. The experiment proves that the method is capable of exploring the typical security vulnerabilities in the binary program efficiently.
Keywords: security vulnerability; oriented fuzzy testing; dynamic taint analysis; input field classification
0 引 言
隨著現(xiàn)代信息系統(tǒng)規(guī)模和復(fù)雜度的逐步增加,計(jì)算機(jī)軟件安全問題變得尤為突出,而軟件安全漏洞又是威脅信息系統(tǒng)安全的核心問題,因此,如何快速準(zhǔn)確地發(fā)掘軟件安全漏洞成為安全界的熱點(diǎn)研究問題。根據(jù)研究對(duì)象的不同,軟件安全漏洞挖掘分為針對(duì)開源軟件的源碼級(jí)別漏洞挖掘和針對(duì)閉源軟件的二進(jìn)制級(jí)別漏洞挖掘。出于對(duì)自身商業(yè)利益和知識(shí)產(chǎn)權(quán)的保護(hù),大部分軟件廠商并不向外開放其軟件源代碼,因此針對(duì)二進(jìn)制程序進(jìn)行安全漏洞發(fā)掘是當(dāng)前研究的一大主流方向。目前,針對(duì)二進(jìn)制程序有效的發(fā)掘方法有補(bǔ)丁對(duì)比技術(shù)、模糊測試技術(shù)、靜態(tài)分析技術(shù)和動(dòng)態(tài)分析技術(shù)[1]。
模糊測試(Fuzzing)技術(shù)是一種通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法[2]。模糊測試首先通過正常樣本構(gòu)造出一系列畸形測試用例,然后針對(duì)目標(biāo)系統(tǒng)使用這些測試用例逐一進(jìn)行測試并實(shí)時(shí)監(jiān)控目標(biāo)狀態(tài),通過對(duì)目標(biāo)異常信息的分析來發(fā)掘目標(biāo)系統(tǒng)中存在的安全漏洞。模糊測試是一種通過輸入空間的完全遍歷來驅(qū)動(dòng)程序在狀態(tài)空間進(jìn)行完全遍歷的測試方法,具有測試簡單、易于部署等特點(diǎn)。然而,輸入空間與狀態(tài)空間的非對(duì)等性導(dǎo)致不同的輸入可能驅(qū)動(dòng)程序重復(fù)測試相同的狀態(tài)空間,因此模糊測試具有效率低下的天然缺陷。
傳統(tǒng)模糊測試采用完全黑盒的測試方法,在畸形測試用例的生成過程中,沒有用到程序的內(nèi)部信息[3],造成大部分畸形測試用例對(duì)程序狀態(tài)空間進(jìn)行了重復(fù)性測試。如何提高模糊測試的效率是當(dāng)前模糊測試的主要研究方向,本文提出并實(shí)現(xiàn)了針對(duì)二進(jìn)制程序的導(dǎo)向性模糊測試原型系統(tǒng)TaintedFuzz。該系統(tǒng)采用基于動(dòng)態(tài)污點(diǎn)分析與輸入分域技術(shù)相結(jié)合的導(dǎo)向性模糊測試方法,利用程序在動(dòng)態(tài)執(zhí)行過程中的運(yùn)行時(shí)信息指導(dǎo)模糊測試畸形樣本的生成,很好地解決了傳統(tǒng)模糊測試效率低下的問題。
1 導(dǎo)向性模糊測試技術(shù)
畸形樣本生成是模糊測試技術(shù)的關(guān)鍵。正常樣本數(shù)據(jù)由安全相關(guān)數(shù)據(jù)和安全無關(guān)數(shù)據(jù)組成,安全相關(guān)數(shù)據(jù)是指與程序安全敏感操作相關(guān)的數(shù)據(jù),安全無關(guān)數(shù)據(jù)指對(duì)安全敏感操作不產(chǎn)生影響的數(shù)據(jù)[3]。典型安全敏感操作包括字符串處理函數(shù)(如strcpy、memcpy)、內(nèi)存分配函數(shù)(如malloc、HeapAlloc)以及用戶根據(jù)具體需求指定的安全操作。對(duì)安全無關(guān)數(shù)據(jù)的變異通常不會(huì)導(dǎo)致軟件異常,而對(duì)安全相關(guān)數(shù)據(jù)的變異往往能夠觸發(fā)軟件中潛在的安全漏洞,因此,首先通過靜態(tài)分析技術(shù)獲得安全敏感函數(shù)的調(diào)用點(diǎn);然后利用動(dòng)態(tài)污點(diǎn)分析技術(shù)對(duì)數(shù)據(jù)依賴關(guān)系進(jìn)行動(dòng)態(tài)跟蹤,根據(jù)安全敏感函數(shù)的參數(shù)類型分析對(duì)應(yīng)的安全相關(guān)數(shù)據(jù);最終通過對(duì)安全相關(guān)數(shù)據(jù)的變異實(shí)現(xiàn)對(duì)目標(biāo)程序的導(dǎo)向性模糊測試。
考慮到編譯器的優(yōu)化工作,如函數(shù)內(nèi)聯(lián)、無用代碼刪除、循環(huán)體展開等,這些優(yōu)化工作可能會(huì)將一些安全敏感函數(shù)內(nèi)聯(lián)到模塊函數(shù)當(dāng)中,造成模塊函數(shù)中出現(xiàn)漏洞的可能性增大。因此,對(duì)模塊函數(shù)進(jìn)行模糊測試時(shí),發(fā)掘目標(biāo)程序中的安全漏洞具有重要意義。然而,不同于安全敏感函數(shù),這些模塊函數(shù)往往不具有調(diào)試信息,其函數(shù)參數(shù)類型不可獲得,所以無法根據(jù)其函數(shù)類型對(duì)其相關(guān)數(shù)據(jù)進(jìn)行變異。提出基于動(dòng)態(tài)污點(diǎn)分析與輸入分域技術(shù)相結(jié)合的導(dǎo)向性模糊測試方法,通過對(duì)目標(biāo)程序處理正常樣本過程的學(xué)習(xí),獲取所有處理輸入的模塊函數(shù)及對(duì)應(yīng)的污點(diǎn)輸入;并通過基于執(zhí)行跡的分域技術(shù),完成對(duì)未知格式輸入的輸入域的劃分;最終根據(jù)輸入域劃分的結(jié)果對(duì)模塊函數(shù)的污點(diǎn)輸入進(jìn)行變異,實(shí)現(xiàn)對(duì)目標(biāo)程序的導(dǎo)向性模糊測試。
本文實(shí)現(xiàn)了基于動(dòng)態(tài)污點(diǎn)分析與輸入分域技術(shù)的導(dǎo)向性模糊測試原型系統(tǒng)TaintedFuzz,整體框架如圖1所示。系統(tǒng)分為前端信息收集、中端測試點(diǎn)分析及后端Fuzzing引擎三大模塊。系統(tǒng)前端模塊利用動(dòng)態(tài)污點(diǎn)分析技術(shù)收集目標(biāo)軟件在執(zhí)行正常測試樣本時(shí)的運(yùn)行時(shí)信息;中端模塊通過對(duì)前端收集的預(yù)處理信息進(jìn)行分析處理,獲得后端Fuzzing引擎的測試點(diǎn)(check點(diǎn));后端Fuzzing引擎通過對(duì)check點(diǎn)的變異測試,完成對(duì)目標(biāo)軟件的導(dǎo)向性模糊測試。
1.1 在線安全敏感操作分析
1.1.1 細(xì)顆粒度動(dòng)態(tài)污點(diǎn)分析技術(shù)
TaintedFuzz采用細(xì)顆粒度動(dòng)態(tài)污點(diǎn)分析技術(shù)(Fine?Grained Dynamic Taint Analysis)完成對(duì)目標(biāo)程序執(zhí)行過程的監(jiān)控及信息獲取。
動(dòng)態(tài)污點(diǎn)分析技術(shù)本質(zhì)上是一種信息流分析,其基本思想是在程序的動(dòng)態(tài)執(zhí)行過程中,追蹤并收集程序?qū)μ囟ㄝ斎霐?shù)據(jù)的處理過程。傳統(tǒng)動(dòng)態(tài)污點(diǎn)分析技術(shù)僅能夠分析內(nèi)存、寄存器或指令是否被單一污點(diǎn)源污染,無法滿足針對(duì)復(fù)雜輸入軟件的分析。TaintedFuzz通過對(duì)污點(diǎn)數(shù)據(jù)進(jìn)行字節(jié)粒度的標(biāo)定與傳播,完成對(duì)目標(biāo)程序的細(xì)顆粒度污點(diǎn)分析。
TaintedFuzz對(duì)目標(biāo)程序的動(dòng)態(tài)監(jiān)控及信息收集主要由三個(gè)部分構(gòu)成:污點(diǎn)數(shù)據(jù)的標(biāo)定、污點(diǎn)數(shù)據(jù)的傳播以及污點(diǎn)分析策略。圖2描述了其基本過程。
TaintedFuzz依靠劫持特定的Windows API函數(shù)完成對(duì)目標(biāo)程序污點(diǎn)數(shù)據(jù)的標(biāo)定及注入。如針對(duì)命令行輸入型程序可以攔截GetCommandLine的返回值,該函數(shù)返回一個(gè)指向命令行參數(shù)的指針,通過對(duì)該指針指向的內(nèi)存區(qū)域進(jìn)行污點(diǎn)標(biāo)記,完成對(duì)命令行參數(shù)的污點(diǎn)標(biāo)記;針對(duì)文件輸入型程序,TaintedFuzz通過攔截Windows系統(tǒng)中典型的文件操作函數(shù)(如fread、ReadFile、MapViewOfFile等)并分析這些函數(shù)的參數(shù)或返回值,完成對(duì)文件輸入型程序的污點(diǎn)標(biāo)定。TaintedFuzz通過對(duì)輸入數(shù)據(jù)的每個(gè)字節(jié)賦予一個(gè)特定的污點(diǎn)標(biāo)簽,來完成字節(jié)粒度上多污點(diǎn)源的標(biāo)定。污點(diǎn)標(biāo)簽結(jié)構(gòu)為二元組。其中:s表示污染源,如文件、命令行等;o表示該污點(diǎn)字節(jié)在整個(gè)污染源中的偏移量。在完成污點(diǎn)數(shù)據(jù)的標(biāo)定之后,TaintedFuzz監(jiān)控并分析每條CPU指令,來實(shí)現(xiàn)對(duì)目標(biāo)代碼執(zhí)行的動(dòng)態(tài)監(jiān)控,并通過影子內(nèi)存(Shadow Memory)[4]技術(shù)實(shí)現(xiàn)對(duì)內(nèi)存和寄存器污點(diǎn)信息的存儲(chǔ)及傳播。在程序的執(zhí)行過程中,TaintedFuzz將根據(jù)需要對(duì)相應(yīng)的信息進(jìn)行收集,并在達(dá)到需要分析的位置(sink點(diǎn))之后,根據(jù)特定的污點(diǎn)分析策略對(duì)收集到的信息進(jìn)行分析。
1.1.2 安全敏感函數(shù)分析
TaintedFuzz在細(xì)粒度動(dòng)態(tài)污點(diǎn)分析基礎(chǔ)上實(shí)現(xiàn)了數(shù)據(jù)依賴關(guān)系的動(dòng)態(tài)跟蹤,因此在監(jiān)控程序動(dòng)態(tài)執(zhí)行的同時(shí),可以在線完成典型安全敏感操作的分析工作。TaintedFuzz首先通過靜態(tài)分析技術(shù)獲得安全敏感函數(shù)的調(diào)用點(diǎn),然后在動(dòng)態(tài)污點(diǎn)分析時(shí),根據(jù)這些安全敏感函數(shù)的參數(shù)類型分析對(duì)應(yīng)的安全相關(guān)數(shù)據(jù),如對(duì)于strcpy,其函數(shù)原型為:
char*strcpy(char*strDestination,const char *strSource)
其中strDestination表示寫入地址,strSource表示源地址。TaintedFuzz通過對(duì)strSource指向的內(nèi)存地址進(jìn)行污點(diǎn)檢查,獲取對(duì)應(yīng)的安全相關(guān)數(shù)據(jù),并記錄當(dāng)前運(yùn)行時(shí)信息,運(yùn)行時(shí)信息記錄格式為(Danger_func,TID,Module,InvokeEIP,RETAddr,StackBase,StackLimit, arg1,arg2,…),Danger_func代表安全敏感函數(shù);TID、 Module分別表示當(dāng)前線程ID與模塊名稱;InvokeEIP與RETAddr分別表示安全敏感函數(shù)調(diào)用地址與返回地址;StackBase與StackLimit分別表示當(dāng)前線程棧的?;放c棧界限;arg1等代表當(dāng)前安全敏感函數(shù)參數(shù)。下面給出了具體的執(zhí)行結(jié)果:
(1, 1856, cmd_overflow.exe, 0x0040e791, 0x0040e796, 0x0012e000, 0x00130000, 0x0012ff10, 0x00380bbd)
T(16 17 18 19 20 21 22 23)
其中1表示當(dāng)前安全敏感函數(shù)為strcpy;T(16 17 18 19 20 21 22 23)表示strSource參數(shù)所指向的內(nèi)存被偏移量為(16 17 18 19 20 21 22 23)的污點(diǎn)數(shù)據(jù)所污染。那么這8個(gè)連續(xù)污點(diǎn)數(shù)據(jù)將被作為檢測點(diǎn),用來指導(dǎo)后端的模糊測試。這樣可以避免對(duì)輸入空間的盲目枚舉,提高模糊測試的效率。
1.2 針對(duì)模塊函數(shù)的測試用例生成方法
模糊測試的有效性完全取決于測試用例的有效性。例如,針對(duì)安全敏感操作的測試用例生成,可以在已知敏感操作函數(shù)參數(shù)類型的情況下,根據(jù)參數(shù)類型對(duì)安全相關(guān)數(shù)據(jù)進(jìn)行變異,這樣生成的測試用例更容易觸發(fā)安全漏洞。然而,如何針對(duì)未知參數(shù)類型的模塊函數(shù)進(jìn)行有效的測試用例生成,卻成為模糊測試的難題。在對(duì)輸入進(jìn)行輸入域劃分的基礎(chǔ)上,結(jié)合程序循環(huán)復(fù)雜度提出一種針對(duì)模塊函數(shù)的測試用例生成方法,該方法可以針對(duì)復(fù)雜模塊函數(shù)生成有效的測試用例。
1.2.1 基于執(zhí)行跡的輸入分域技術(shù)
作為輸入驅(qū)動(dòng)的測試方法,模糊測試的有效性完全依賴于畸形數(shù)據(jù)的生成方式。傳統(tǒng)模糊測試畸形測試用例產(chǎn)生的方法有兩種:基于變異的畸形數(shù)據(jù)生成方法和基于規(guī)范的畸形數(shù)據(jù)生成方法[2]?;谧儺惖纳煞椒ㄍㄟ^對(duì)正常數(shù)據(jù)進(jìn)行隨機(jī)修改/破壞而生成畸形數(shù)據(jù),其主要優(yōu)勢在于不依賴具體的格式而且易于實(shí)現(xiàn),然而這種測試方法生成的測試數(shù)據(jù)對(duì)程序狀態(tài)空間覆蓋率比較低,嚴(yán)重影響模糊測試的效率;基于規(guī)范的畸形數(shù)據(jù)測試方法依賴于測試人員對(duì)文件/協(xié)議格式的先驗(yàn)知識(shí),然而如何獲取畸形數(shù)據(jù)生成規(guī)范卻成為這種方法的瓶頸,對(duì)于未公開或非常復(fù)雜的輸入格式,如何構(gòu)造出有效的測試用例成為基于規(guī)范的畸形數(shù)據(jù)生成方法的難點(diǎn)。在文獻(xiàn)[5?7]對(duì)協(xié)議格式逆向工程(Protocol Format Reverse Engineering)已經(jīng)取得一定成果的基礎(chǔ)上,提出一種基于執(zhí)行跡的輸入分域方法,通過學(xué)習(xí)目標(biāo)程序?qū)φ颖镜奶幚磉^程,完成對(duì)輸入數(shù)據(jù)的域劃分。
算法的核心思想是程序在解析輸入時(shí)總是將不同的輸入域(Input Field)放置在不同的執(zhí)行環(huán)境(Execution Context)中處理,也就是說,屬于同一個(gè)輸入域的相鄰字節(jié)將在同樣的執(zhí)行環(huán)境中處理。因此,TaintedFuzz在已獲取到每個(gè)輸入字節(jié)處理信息(執(zhí)行跡、調(diào)用棧等)的基礎(chǔ)上,通過基于執(zhí)行跡的輸入分域算法完成對(duì)輸入中各個(gè)域的區(qū)別與劃分。
算法將污點(diǎn)輸入的處理信息表示為四元組,。其中i代表指令地址;s表示當(dāng)前指令的調(diào)用棧信息;t表示當(dāng)前指令的污點(diǎn)集合信息;c為當(dāng)前進(jìn)程線程信息。TaintedFuzz采用動(dòng)態(tài)維護(hù)影子棧的方法完成對(duì)程序運(yùn)行時(shí)調(diào)用棧的獲取,對(duì)進(jìn)程中每個(gè)線程影子棧進(jìn)行分別維護(hù)。影子棧的維護(hù)通過插樁函數(shù)調(diào)用指令,如CALL和函數(shù)返回指令如RET完成。若將每條處理信息表示為preInfo[i],則每條處理信息中的四元信息將分別表示為preInfo[i].i、preInfo[i].s、preInfo[i].t以及preInfo[i].c。具體輸入分域算法如下:
Algorithm2 Input Format Reverse
1:Initial:IFtree = ROOT – Input Format Tree
2:Input:preInfo
3:Output:IFtree
4:Input_Format_Reverse (preInfo){
5: p=preInfo[0].t; i = 1;
6: while(preInfo is not EOF){
7: q=preInfo[i].t;
8: if(q == p){}
9: else if ((q.min == p.max || q.min ==p.max+1) &&
10: preInfo[i].s == preInfo[i-1].s)
11: p=UNION(p, q);
12: else{
13: Vnode =CreateNoe(p);
14: Find Unode in IFtree where Unode contains Vnode, but not its children;
15: Insert Vnode into IFtree as the child of Unode;
16: if (Unode.children != NULL){
17: Find NeedMoves in Unode.children which are subset of Vnode;
18: Insert NeedMoves into IFtree as the child of Vnode;
19: }
20: p=q;
21: }
22: i++;
23: }
24: return IFtree;
25: }
算法將整個(gè)輸入看作一個(gè)輸入格式樹。首先將樹初始化為包含所有污點(diǎn)標(biāo)簽的ROOT節(jié)點(diǎn)。對(duì)于每條信息preInfo[i],如果當(dāng)前信息污點(diǎn)集合與前一條信息污點(diǎn)集合連續(xù)或“偽連續(xù)”(偽連續(xù)是指當(dāng)前信息污點(diǎn)集合最小值與前一條信息污點(diǎn)集合最大值相等),并且當(dāng)前調(diào)用棧與前一條調(diào)用棧相同,則認(rèn)為當(dāng)前污點(diǎn)信息集合與前一條污點(diǎn)信息集合屬于同一個(gè)輸入域(第9、10行);如果污點(diǎn)集合信息不連續(xù)或調(diào)用棧不同,算法首先在樹中找到一個(gè)包含當(dāng)前污點(diǎn)集合信息的最小節(jié)點(diǎn)(第14行),然后將當(dāng)前污點(diǎn)信息作為該節(jié)點(diǎn)的子節(jié)點(diǎn)插入到樹中;同時(shí),如果該節(jié)點(diǎn)有子節(jié)點(diǎn),則將子節(jié)點(diǎn)中是當(dāng)前污點(diǎn)信息子集的子節(jié)點(diǎn)移動(dòng)為當(dāng)前污點(diǎn)信息集合節(jié)點(diǎn)的子節(jié)點(diǎn)(第17~19行)。
用于測試的文件格式如圖3所示。
該測試文件格式前兩個(gè)字節(jié)表示文件格式,第2~5個(gè)字節(jié)表示數(shù)據(jù)偏移位置,第6~9個(gè)字節(jié)表征數(shù)據(jù)域的長度,第10個(gè)字節(jié)以后為數(shù)據(jù)域。測試程序?yàn)楹唵蔚奈募x入解析程序,經(jīng)過輸入域劃分之后的結(jié)果如圖4所示??梢钥吹剑趫?zhí)行跡的輸入分域算法可以很好地識(shí)別與劃分輸入域。
1.2.2 輸入分域與循環(huán)復(fù)雜度結(jié)合的測試用例生成法
考慮到目標(biāo)程序中模塊函數(shù)的數(shù)量比較龐大,在有效時(shí)間內(nèi)對(duì)目標(biāo)程序中所有模塊函數(shù)進(jìn)行完全模糊測試將會(huì)消耗大量資源,因此,為了提高模糊測試效率,發(fā)掘更多的安全漏洞,結(jié)合程序分析理論,對(duì)模塊函數(shù)進(jìn)行篩選,選擇其中比較復(fù)雜的函數(shù)進(jìn)行選擇性的分析與測試。
循環(huán)復(fù)雜度(Cyclomatic Complexity)也稱為條件復(fù)雜度或圈復(fù)雜度,用于表示程序復(fù)雜度[8]。程序的循環(huán)復(fù)雜度是其線性獨(dú)立路徑的數(shù)量,一般通過程序的控制流圖來定義,其定義為[M=E-N+2P,]其中[E]代表流圖中邊的個(gè)數(shù),[N]代表流圖中節(jié)點(diǎn)個(gè)數(shù),[P]代表流圖中連接組件的個(gè)數(shù)[9]。例如,在圖5給出的簡單控制流圖中,[E=9,][N=8,][P=1,]因此其循環(huán)復(fù)雜度為[9-8+(2×1)=3。]
循環(huán)復(fù)雜度和軟件缺陷個(gè)數(shù)具有高度的正相關(guān)性,因此循環(huán)復(fù)雜度可以用來預(yù)測軟件中安全缺陷的個(gè)數(shù)[10]。提出基于輸入分域與循環(huán)復(fù)雜度相結(jié)合的測試用例生成方法,首先通過對(duì)動(dòng)態(tài)污點(diǎn)分析執(zhí)行跡進(jìn)行分析,獲得被污染的函數(shù)及其污點(diǎn)信息集合;然后,為了提高模糊測試中發(fā)現(xiàn)漏洞的概率,根據(jù)循環(huán)復(fù)雜度,對(duì)被污染函數(shù)進(jìn)行排序,選取其中復(fù)雜度較高的函數(shù);最后,根據(jù)輸入分域的結(jié)果對(duì)這些函數(shù)的污點(diǎn)信息進(jìn)行分析和輸入域劃分,用于指導(dǎo)模糊測試的測試用例生成。
如表1所示,在對(duì)動(dòng)態(tài)污點(diǎn)分析的執(zhí)行跡進(jìn)行分析的基礎(chǔ)上,針對(duì)循環(huán)復(fù)雜度較高的Func1,F(xiàn)unc2,F(xiàn)unc3,可以根據(jù)輸入分域的結(jié)果將其對(duì)應(yīng)的污點(diǎn)信息進(jìn)行輸入域劃分,如(2,3,4,5)四個(gè)字節(jié)很可能表示一個(gè)整形數(shù)據(jù),(10,11,12,13,14,15)連續(xù)多字節(jié)表示字符串?dāng)?shù)據(jù),那么用這些信息指導(dǎo)生成的測試用例將會(huì)更容易觸發(fā)復(fù)雜函數(shù)中的安全漏洞。
表1 被污染函數(shù)復(fù)雜度排序
[污點(diǎn)信息集合\&函數(shù)\&循環(huán)復(fù)雜度\&(2,3,4,5,8,9)\&Func1\&40\&(10,11,12,13,14,15)\&Func2\&37\&(1,5,6,7)\&Func3\&23\&…\&…\&…\&]
1.3 模糊測試引擎
在完成安全相關(guān)數(shù)據(jù)偏移及類型識(shí)別之后,TaintedFuzz系統(tǒng)將識(shí)別的關(guān)鍵測試點(diǎn)送至模糊測試引擎中進(jìn)行變異。TaintedFuzz的模糊測試引擎主要負(fù)責(zé)畸形測試用例的生成和針對(duì)目標(biāo)程序的安全測試。TaintedFuzz的模糊測試引擎實(shí)現(xiàn)了針對(duì)不同數(shù)據(jù)類型(如longint,int,shortint,char,string等)的變異,并且每種數(shù)據(jù)類型均具有多種變異策略,如針對(duì)char類型的深度變異、針對(duì)string類型的長度變異,針對(duì)整形的臨界安全值變異及隨機(jī)變異等;安全測試部分采用調(diào)試器技術(shù)實(shí)現(xiàn)對(duì)目標(biāo)程序執(zhí)行的動(dòng)態(tài)監(jiān)控及異常捕獲,并且可以將異常發(fā)生時(shí)的CPU狀態(tài)及執(zhí)行上下文記錄下來,供安全人員進(jìn)行分析。
2 TaintedFuzz系統(tǒng)實(shí)現(xiàn)及實(shí)驗(yàn)結(jié)果
2.1 TaintedFuzz系統(tǒng)實(shí)現(xiàn)
TaintedFuzz原型系統(tǒng)基于二進(jìn)制代碼分析平臺(tái)Bitblaze[11]的TEMU[12]動(dòng)態(tài)污點(diǎn)分析組件實(shí)現(xiàn)。TEMU是一個(gè)基于QEMU虛擬化技術(shù)開發(fā)的全系統(tǒng)動(dòng)態(tài)二進(jìn)制污點(diǎn)分析平臺(tái),在TEMU中可以運(yùn)行操作系統(tǒng)及應(yīng)用程序,并通過相應(yīng)接口完成對(duì)相關(guān)二進(jìn)制代碼執(zhí)行的細(xì)粒度監(jiān)控與分析。TEMU架構(gòu)如圖6所示,其中語義提取器用于提取仿真系統(tǒng)的操作系統(tǒng)級(jí)語義信息,包括進(jìn)程、線程、模塊及符號(hào)信息;動(dòng)態(tài)污點(diǎn)分析引擎采用影子內(nèi)存技術(shù)實(shí)現(xiàn)對(duì)物理內(nèi)存、CPU寄存器、磁盤及網(wǎng)絡(luò)接口緩沖區(qū)數(shù)據(jù)的污點(diǎn)標(biāo)記及傳播;同時(shí)用戶還可以自定義插件,以擴(kuò)展TEMU功能。TaintedFuzz通過編寫命令行污點(diǎn)標(biāo)記模塊、文件污點(diǎn)標(biāo)記模塊、執(zhí)行上下文記錄模塊、敏感函數(shù)在線分析插件,實(shí)現(xiàn)針對(duì)二進(jìn)制程序的執(zhí)行跡及運(yùn)行時(shí)信息的維護(hù)與記錄。
TaintedFuzz模糊測試引擎基于模糊測試框架antiparser實(shí)現(xiàn)。antiparser是一個(gè)由python開發(fā)的跨平臺(tái)模糊測試框架,主要用于針對(duì)不同數(shù)據(jù)類型實(shí)現(xiàn)畸形測試用例的生成[2]。TaintedFuzz擴(kuò)展了antiparser數(shù)據(jù)的生成方式,以提高生成數(shù)據(jù)的有效性;并在antiparser的基礎(chǔ)上實(shí)現(xiàn)了針對(duì)命令行輸入型程序與文件輸入型程序的模糊測試引擎,可以完成對(duì)二進(jìn)制程序執(zhí)行的監(jiān)控及異常捕獲。TaintedFuzz模糊測試引擎的測試及異常捕獲模塊基于調(diào)試器技術(shù)實(shí)現(xiàn),通過集成輕量級(jí)調(diào)試器pydbg[2]完成對(duì)異常的捕獲及對(duì)異常發(fā)生時(shí)現(xiàn)場環(huán)境的記錄。
2.2 實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)針對(duì)未知參數(shù)類型的模塊函數(shù)和典型安全敏感操作的導(dǎo)向型模糊測試,分別選取兩個(gè)不同的目標(biāo)程序進(jìn)行測試。針對(duì)模塊函數(shù)的測試程序代碼片段如下:
Test Code 1:
1:char * get_Data(char *arg_[], int len){
2: char dest[10];
3: memset(dest, 0, sizeof(dest));
4: char * a = NULL;
5: if (len > 0){
6: strcpy(dest,arg_[2]);
7: a=dest;
8: }
9: return a;
10:}
程序從命令行參數(shù)中獲取數(shù)據(jù)字符串a(chǎn)rg_[2],并將其復(fù)制到緩沖區(qū)當(dāng)中;然而在復(fù)制時(shí)未對(duì)參數(shù)的長度進(jìn)行合理的驗(yàn)證(第5行),如果命令行第二個(gè)參數(shù)長度大于10則會(huì)造成嚴(yán)重的緩沖區(qū)溢出。程序中雖然顯式調(diào)用了安全敏感函數(shù)strcpy,但是由于編譯器的優(yōu)化,使strcpy被內(nèi)聯(lián)到當(dāng)前模塊中,無法通過靜態(tài)分析的方式獲得這些安全敏感函數(shù)的調(diào)用點(diǎn)。雖然現(xiàn)有一些可以通過函數(shù)摘要匹配的安全敏感函數(shù)識(shí)別的算法[13],但由于編譯器的多樣化造成內(nèi)聯(lián)代碼的多樣化,因此這些算法仍無法完全解決安全敏感函數(shù)的識(shí)別問題。TaintedFuzz通過學(xué)習(xí)目標(biāo)代碼對(duì)輸入的解析過程,從而完成對(duì)命令行參數(shù)的輸入域劃分,劃分之后的輸入格式如圖7所示(輸入命令行參數(shù)為“soft_metric.exe 8 AAAAAAAA”):
同時(shí),通過分析執(zhí)行跡信息得知,get_Data函數(shù)的污點(diǎn)集合信息為(15,17,18,19,20,21,22,23,24)的非連續(xù)字節(jié)數(shù)據(jù)(考慮到目標(biāo)程序中用戶自定義函數(shù)較少,因此跳過函數(shù)循環(huán)復(fù)雜度排序),那么根據(jù)輸入劃分的結(jié)果,判定偏移量為15的參數(shù)“8”和偏移量為(17,18,19,20,21,22,23,24)的參數(shù)“AAAAAAAA”分別屬于不同的輸入域;然后通過導(dǎo)向型模糊測試引擎分別對(duì)偏移量為15的單字節(jié)進(jìn)行深度變異和偏移量為(17, 18,19,20,21,22,23,24)的連續(xù)字節(jié)進(jìn)行字符串變長變異;最終模糊測試引擎成功觸發(fā)該漏洞。
針對(duì)典型安全敏感操作造成的安全漏洞,實(shí)驗(yàn)選取VUPlayer 2.49的.m3u緩沖區(qū)溢出漏洞,該漏洞在EDB數(shù)據(jù)庫的編號(hào)為EDB?ID:30336。VUPlayer是Windows平臺(tái)下一款功能強(qiáng)大的媒體播放工具,支持多種媒體格式。該軟件2.49版本在解析.m3u的文件名時(shí)存在嚴(yán)重的緩沖區(qū)溢出漏洞。
TaintedFuzz隨機(jī)選取簡單的樣本.m3u文件,如圖8所示,文件僅包含一條播放記錄。通過對(duì)VUplayer解析樣本.m3u文件的過程進(jìn)行動(dòng)態(tài)污點(diǎn)分析及在線安全敏感函數(shù)分析后,獲得安全敏感函數(shù)調(diào)用記錄如下:
CALL lstrcpyA() at 0x00453313: (Dest: 0x0012eb4c, Scr: 0x00ba93e4)
PID: 1700, MODULE: VUPlayer.exe, TID: 1696, RETADDR: 0x00453319.
TID: 1696, StackBase: 0x00129000, StackLimit: 0x00130000.
Writing to current stack.
Taint(0~10)
VUPlayer在0x00453313處通過調(diào)用lstrcpyA函數(shù)將當(dāng)前.m3u文件的文件名(第0~10字節(jié))拷入到當(dāng)前的線程棧當(dāng)中(0x0012eb4c);在對(duì)危險(xiǎn)函數(shù)lstrcpyA的參數(shù)進(jìn)行分析后,TaintedFuzz將測試點(diǎn)(第0~10字節(jié))送入到導(dǎo)向性模糊測試引擎當(dāng)中作為字符串進(jìn)行變異,模糊測試引擎成功觸發(fā)該漏洞。異常發(fā)生時(shí)上下文環(huán)境如圖9所示。
3 結(jié) 語
本文提出了一種基于動(dòng)態(tài)污點(diǎn)分析的二進(jìn)制程序?qū)蛐阅:郎y試技術(shù)。該技術(shù)可以根據(jù)動(dòng)態(tài)污點(diǎn)分析的結(jié)果,對(duì)安全敏感相關(guān)字段進(jìn)行有效地廣度或深度變異。同時(shí),針對(duì)未知參數(shù)類型函數(shù),特別是內(nèi)聯(lián)了安全敏感操作的模塊函數(shù),提出了一種基于輸入分域與循環(huán)復(fù)雜度的測試用例生成方法,該方法利用基于執(zhí)行跡的輸入分域方法。首先通過對(duì)目標(biāo)程序處理正常樣本過程的學(xué)習(xí),完成輸入字段的劃分;之后,為了提高漏洞發(fā)現(xiàn)的效率,根據(jù)模塊函數(shù)的循環(huán)復(fù)雜度對(duì)模塊函數(shù)進(jìn)行排序;選擇復(fù)雜度較高的模塊函數(shù),對(duì)其根據(jù)輸入分域結(jié)果進(jìn)行測試用例生成。該方法可以針對(duì)復(fù)雜模塊函數(shù)生成有效的測試用例,提高了模糊測試的效率。實(shí)現(xiàn)了基于動(dòng)態(tài)污點(diǎn)分析的二進(jìn)制模糊測試的原型系統(tǒng)TaintedFuzz,實(shí)驗(yàn)證明該系統(tǒng)針對(duì)二進(jìn)制目標(biāo)程序中的模塊函數(shù)和典型安全敏感操作可以進(jìn)行導(dǎo)向性模糊測試,能夠?qū)ΧM(jìn)制程序中存在的典型安全漏洞進(jìn)行高效地發(fā)掘。
參考文獻(xiàn)
[1] 文偉平,吳興麗,蔣建春.軟件安全漏洞挖掘的研究思路及發(fā)展趨勢[J].信息網(wǎng)絡(luò)安全,2009 (10):78?80.
[2] SUTTON Michael.模糊測試:強(qiáng)制性安全漏洞發(fā)掘[M].北京:機(jī)械工業(yè)出版社,2009.
[3] 王鐵磊.面向二進(jìn)制程序的漏洞挖掘關(guān)鍵技術(shù)研究[D].北京:北京大學(xué),2011.
[4] SCHWARTZ E J, AVGERINOS T, BRUMLEY D. All you ever wanted to know about dynamic taint analysis and forward symbolic execution (but might have been afraid to ask) [C]// 2010 IEEE Symposium on Security and Privacy (SP). [S.l.]: IEEE, 2010: 317?331.
[5] LIN Z, JIANG X, XU D, et al. Automatic protocol format reverse engineering through context?aware monitored execution [J]. NDSS, 2008, 8: 1?15.
[6] LIN Z, ZHANG X, XU D. Reverse engineering input syntactic structure from program execution and its applications [J]. IEEE Transactions on Software Engineering, 2010, 36(5): 688?703.
[7] CABALLERO J, YIN H, LIANG Z, et al. Polyglot: Automatic extraction of protocol message format using dynamic binary analysis [C]// Proceedings of the 14th ACM conference on Computer and Communications Security. [S.l.]: ACM, 2007: 317?329.
[8] KANER C, BOND W P. Software engineering metrics: What do they measure and how do we know [J]. Methodology, 2004, 8: 6?18.
[9] MCCABE T J. A complexity measure [J]. IEEE Transactions on Software Engineering, 1976 (4): 308?320.
[10] HATTON L. The role of empiricism in improving the reliability of future software [J/OL]. [2012?08?29]. http://www.computer.org/csdl/.
[11] SONG D, BRUMLEY D, YIN H, et al. BitBlaze: A new approach to computer security via binary analysis [J]. Information Systems Security: Lecture Notes in Computer Science, 2008, 5352: 1?25.
[12] YIN H, SONG D. Temu: Binary code analysis via whole?system layered annotative execution, UCB/EECS?2010?3 [R]. Berkeley: EECS Department, University of California, 2010.
針對(duì)典型安全敏感操作造成的安全漏洞,實(shí)驗(yàn)選取VUPlayer 2.49的.m3u緩沖區(qū)溢出漏洞,該漏洞在EDB數(shù)據(jù)庫的編號(hào)為EDB?ID:30336。VUPlayer是Windows平臺(tái)下一款功能強(qiáng)大的媒體播放工具,支持多種媒體格式。該軟件2.49版本在解析.m3u的文件名時(shí)存在嚴(yán)重的緩沖區(qū)溢出漏洞。
TaintedFuzz隨機(jī)選取簡單的樣本.m3u文件,如圖8所示,文件僅包含一條播放記錄。通過對(duì)VUplayer解析樣本.m3u文件的過程進(jìn)行動(dòng)態(tài)污點(diǎn)分析及在線安全敏感函數(shù)分析后,獲得安全敏感函數(shù)調(diào)用記錄如下:
CALL lstrcpyA() at 0x00453313: (Dest: 0x0012eb4c, Scr: 0x00ba93e4)
PID: 1700, MODULE: VUPlayer.exe, TID: 1696, RETADDR: 0x00453319.
TID: 1696, StackBase: 0x00129000, StackLimit: 0x00130000.
Writing to current stack.
Taint(0~10)
VUPlayer在0x00453313處通過調(diào)用lstrcpyA函數(shù)將當(dāng)前.m3u文件的文件名(第0~10字節(jié))拷入到當(dāng)前的線程棧當(dāng)中(0x0012eb4c);在對(duì)危險(xiǎn)函數(shù)lstrcpyA的參數(shù)進(jìn)行分析后,TaintedFuzz將測試點(diǎn)(第0~10字節(jié))送入到導(dǎo)向性模糊測試引擎當(dāng)中作為字符串進(jìn)行變異,模糊測試引擎成功觸發(fā)該漏洞。異常發(fā)生時(shí)上下文環(huán)境如圖9所示。
3 結(jié) 語
本文提出了一種基于動(dòng)態(tài)污點(diǎn)分析的二進(jìn)制程序?qū)蛐阅:郎y試技術(shù)。該技術(shù)可以根據(jù)動(dòng)態(tài)污點(diǎn)分析的結(jié)果,對(duì)安全敏感相關(guān)字段進(jìn)行有效地廣度或深度變異。同時(shí),針對(duì)未知參數(shù)類型函數(shù),特別是內(nèi)聯(lián)了安全敏感操作的模塊函數(shù),提出了一種基于輸入分域與循環(huán)復(fù)雜度的測試用例生成方法,該方法利用基于執(zhí)行跡的輸入分域方法。首先通過對(duì)目標(biāo)程序處理正常樣本過程的學(xué)習(xí),完成輸入字段的劃分;之后,為了提高漏洞發(fā)現(xiàn)的效率,根據(jù)模塊函數(shù)的循環(huán)復(fù)雜度對(duì)模塊函數(shù)進(jìn)行排序;選擇復(fù)雜度較高的模塊函數(shù),對(duì)其根據(jù)輸入分域結(jié)果進(jìn)行測試用例生成。該方法可以針對(duì)復(fù)雜模塊函數(shù)生成有效的測試用例,提高了模糊測試的效率。實(shí)現(xiàn)了基于動(dòng)態(tài)污點(diǎn)分析的二進(jìn)制模糊測試的原型系統(tǒng)TaintedFuzz,實(shí)驗(yàn)證明該系統(tǒng)針對(duì)二進(jìn)制目標(biāo)程序中的模塊函數(shù)和典型安全敏感操作可以進(jìn)行導(dǎo)向性模糊測試,能夠?qū)ΧM(jìn)制程序中存在的典型安全漏洞進(jìn)行高效地發(fā)掘。
參考文獻(xiàn)
[1] 文偉平,吳興麗,蔣建春.軟件安全漏洞挖掘的研究思路及發(fā)展趨勢[J].信息網(wǎng)絡(luò)安全,2009 (10):78?80.
[2] SUTTON Michael.模糊測試:強(qiáng)制性安全漏洞發(fā)掘[M].北京:機(jī)械工業(yè)出版社,2009.
[3] 王鐵磊.面向二進(jìn)制程序的漏洞挖掘關(guān)鍵技術(shù)研究[D].北京:北京大學(xué),2011.
[4] SCHWARTZ E J, AVGERINOS T, BRUMLEY D. All you ever wanted to know about dynamic taint analysis and forward symbolic execution (but might have been afraid to ask) [C]// 2010 IEEE Symposium on Security and Privacy (SP). [S.l.]: IEEE, 2010: 317?331.
[5] LIN Z, JIANG X, XU D, et al. Automatic protocol format reverse engineering through context?aware monitored execution [J]. NDSS, 2008, 8: 1?15.
[6] LIN Z, ZHANG X, XU D. Reverse engineering input syntactic structure from program execution and its applications [J]. IEEE Transactions on Software Engineering, 2010, 36(5): 688?703.
[7] CABALLERO J, YIN H, LIANG Z, et al. Polyglot: Automatic extraction of protocol message format using dynamic binary analysis [C]// Proceedings of the 14th ACM conference on Computer and Communications Security. [S.l.]: ACM, 2007: 317?329.
[8] KANER C, BOND W P. Software engineering metrics: What do they measure and how do we know [J]. Methodology, 2004, 8: 6?18.
[9] MCCABE T J. A complexity measure [J]. IEEE Transactions on Software Engineering, 1976 (4): 308?320.
[10] HATTON L. The role of empiricism in improving the reliability of future software [J/OL]. [2012?08?29]. http://www.computer.org/csdl/.
[11] SONG D, BRUMLEY D, YIN H, et al. BitBlaze: A new approach to computer security via binary analysis [J]. Information Systems Security: Lecture Notes in Computer Science, 2008, 5352: 1?25.
[12] YIN H, SONG D. Temu: Binary code analysis via whole?system layered annotative execution, UCB/EECS?2010?3 [R]. Berkeley: EECS Department, University of California, 2010.
針對(duì)典型安全敏感操作造成的安全漏洞,實(shí)驗(yàn)選取VUPlayer 2.49的.m3u緩沖區(qū)溢出漏洞,該漏洞在EDB數(shù)據(jù)庫的編號(hào)為EDB?ID:30336。VUPlayer是Windows平臺(tái)下一款功能強(qiáng)大的媒體播放工具,支持多種媒體格式。該軟件2.49版本在解析.m3u的文件名時(shí)存在嚴(yán)重的緩沖區(qū)溢出漏洞。
TaintedFuzz隨機(jī)選取簡單的樣本.m3u文件,如圖8所示,文件僅包含一條播放記錄。通過對(duì)VUplayer解析樣本.m3u文件的過程進(jìn)行動(dòng)態(tài)污點(diǎn)分析及在線安全敏感函數(shù)分析后,獲得安全敏感函數(shù)調(diào)用記錄如下:
CALL lstrcpyA() at 0x00453313: (Dest: 0x0012eb4c, Scr: 0x00ba93e4)
PID: 1700, MODULE: VUPlayer.exe, TID: 1696, RETADDR: 0x00453319.
TID: 1696, StackBase: 0x00129000, StackLimit: 0x00130000.
Writing to current stack.
Taint(0~10)
VUPlayer在0x00453313處通過調(diào)用lstrcpyA函數(shù)將當(dāng)前.m3u文件的文件名(第0~10字節(jié))拷入到當(dāng)前的線程棧當(dāng)中(0x0012eb4c);在對(duì)危險(xiǎn)函數(shù)lstrcpyA的參數(shù)進(jìn)行分析后,TaintedFuzz將測試點(diǎn)(第0~10字節(jié))送入到導(dǎo)向性模糊測試引擎當(dāng)中作為字符串進(jìn)行變異,模糊測試引擎成功觸發(fā)該漏洞。異常發(fā)生時(shí)上下文環(huán)境如圖9所示。
3 結(jié) 語
本文提出了一種基于動(dòng)態(tài)污點(diǎn)分析的二進(jìn)制程序?qū)蛐阅:郎y試技術(shù)。該技術(shù)可以根據(jù)動(dòng)態(tài)污點(diǎn)分析的結(jié)果,對(duì)安全敏感相關(guān)字段進(jìn)行有效地廣度或深度變異。同時(shí),針對(duì)未知參數(shù)類型函數(shù),特別是內(nèi)聯(lián)了安全敏感操作的模塊函數(shù),提出了一種基于輸入分域與循環(huán)復(fù)雜度的測試用例生成方法,該方法利用基于執(zhí)行跡的輸入分域方法。首先通過對(duì)目標(biāo)程序處理正常樣本過程的學(xué)習(xí),完成輸入字段的劃分;之后,為了提高漏洞發(fā)現(xiàn)的效率,根據(jù)模塊函數(shù)的循環(huán)復(fù)雜度對(duì)模塊函數(shù)進(jìn)行排序;選擇復(fù)雜度較高的模塊函數(shù),對(duì)其根據(jù)輸入分域結(jié)果進(jìn)行測試用例生成。該方法可以針對(duì)復(fù)雜模塊函數(shù)生成有效的測試用例,提高了模糊測試的效率。實(shí)現(xiàn)了基于動(dòng)態(tài)污點(diǎn)分析的二進(jìn)制模糊測試的原型系統(tǒng)TaintedFuzz,實(shí)驗(yàn)證明該系統(tǒng)針對(duì)二進(jìn)制目標(biāo)程序中的模塊函數(shù)和典型安全敏感操作可以進(jìn)行導(dǎo)向性模糊測試,能夠?qū)ΧM(jìn)制程序中存在的典型安全漏洞進(jìn)行高效地發(fā)掘。
參考文獻(xiàn)
[1] 文偉平,吳興麗,蔣建春.軟件安全漏洞挖掘的研究思路及發(fā)展趨勢[J].信息網(wǎng)絡(luò)安全,2009 (10):78?80.
[2] SUTTON Michael.模糊測試:強(qiáng)制性安全漏洞發(fā)掘[M].北京:機(jī)械工業(yè)出版社,2009.
[3] 王鐵磊.面向二進(jìn)制程序的漏洞挖掘關(guān)鍵技術(shù)研究[D].北京:北京大學(xué),2011.
[4] SCHWARTZ E J, AVGERINOS T, BRUMLEY D. All you ever wanted to know about dynamic taint analysis and forward symbolic execution (but might have been afraid to ask) [C]// 2010 IEEE Symposium on Security and Privacy (SP). [S.l.]: IEEE, 2010: 317?331.
[5] LIN Z, JIANG X, XU D, et al. Automatic protocol format reverse engineering through context?aware monitored execution [J]. NDSS, 2008, 8: 1?15.
[6] LIN Z, ZHANG X, XU D. Reverse engineering input syntactic structure from program execution and its applications [J]. IEEE Transactions on Software Engineering, 2010, 36(5): 688?703.
[7] CABALLERO J, YIN H, LIANG Z, et al. Polyglot: Automatic extraction of protocol message format using dynamic binary analysis [C]// Proceedings of the 14th ACM conference on Computer and Communications Security. [S.l.]: ACM, 2007: 317?329.
[8] KANER C, BOND W P. Software engineering metrics: What do they measure and how do we know [J]. Methodology, 2004, 8: 6?18.
[9] MCCABE T J. A complexity measure [J]. IEEE Transactions on Software Engineering, 1976 (4): 308?320.
[10] HATTON L. The role of empiricism in improving the reliability of future software [J/OL]. [2012?08?29]. http://www.computer.org/csdl/.
[11] SONG D, BRUMLEY D, YIN H, et al. BitBlaze: A new approach to computer security via binary analysis [J]. Information Systems Security: Lecture Notes in Computer Science, 2008, 5352: 1?25.
[12] YIN H, SONG D. Temu: Binary code analysis via whole?system layered annotative execution, UCB/EECS?2010?3 [R]. Berkeley: EECS Department, University of California, 2010.