本發(fā)明涉及一種基于路徑比對(duì)的程序中校驗(yàn)函數(shù)的定位方法,屬于信息安全中的二進(jìn)制漏洞挖掘領(lǐng)域。
背景技術(shù):
軟件漏洞會(huì)嚴(yán)重影響信息系統(tǒng)的機(jī)密性、完整性、可用性、可控性、真實(shí)性等基本屬性,威脅信息系統(tǒng)的安全,因此對(duì)軟件安全漏洞問題的研究是信息安全領(lǐng)域十分重要的組成部分。目前,解決安全漏洞問題的主要方法是通過軟件漏洞挖掘提前發(fā)現(xiàn)軟件存在的漏洞,因此漏洞挖掘工作對(duì)于保護(hù)信息系統(tǒng)安全有著極其重要的意義。
漏洞挖掘領(lǐng)域中,最常用的挖掘方法是模糊測(cè)試技術(shù),該技術(shù)主要通過構(gòu)造隨機(jī)的測(cè)試用例(測(cè)試用例是指在模糊測(cè)試時(shí),經(jīng)過變異后用于測(cè)試程序是否存在漏洞而使用的輸入數(shù)據(jù),該數(shù)據(jù)具有很大的不可預(yù)測(cè)性),以模仿用戶的隨機(jī)輸入,對(duì)黑盒程序進(jìn)行安全性測(cè)試。但隨機(jī)地構(gòu)造測(cè)試用例的效果較差,測(cè)試效率較低——當(dāng)被測(cè)程序中存在校驗(yàn)函數(shù)時(shí),隨機(jī)構(gòu)造的測(cè)試數(shù)據(jù)很難通過程序循環(huán)冗余校驗(yàn)、哈希校驗(yàn)等函數(shù)的檢測(cè),因此對(duì)程序的代碼測(cè)試覆蓋率較低,不能發(fā)現(xiàn)校驗(yàn)函數(shù)后續(xù)執(zhí)行流程的隱藏漏洞。目前有效的解決方法都需要對(duì)校驗(yàn)函數(shù)在程序中的位置進(jìn)行定位,因此,本發(fā)明將提供一種基于路徑比對(duì)的方法來定位校驗(yàn)函數(shù)在程序中的位置。
目前對(duì)校驗(yàn)函數(shù)定位的常用方法可歸為兩類:
1.匯編指令統(tǒng)計(jì)
這種方法主要通過對(duì)程序匯編指令進(jìn)行統(tǒng)計(jì),通過匹配符合校驗(yàn)函數(shù)特征的匯編代碼,來確定校驗(yàn)函數(shù)的位置。校驗(yàn)函數(shù)的匯編指令與加解密計(jì)算、算數(shù)運(yùn)算等函數(shù)特征具有相似性,都存在大量的移位、計(jì)算類匯編指令,因此難以對(duì)函數(shù)進(jìn)行準(zhǔn)確定位。
2.污點(diǎn)跟蹤定位
這種方法主要通過污點(diǎn)跟蹤技術(shù),對(duì)函數(shù)執(zhí)行的特定語句進(jìn)行插樁——即在被測(cè)程序運(yùn)行時(shí)插入獲取匯編語句和寄存器、內(nèi)存值的程序語句,并輸出這些語句獲取的寄存器和內(nèi)存值。一次污點(diǎn)跟蹤結(jié)束后,再使用離線分析方法,對(duì)所記錄的寄存器和內(nèi)存值進(jìn)行分析,與輸入數(shù)據(jù)(標(biāo)記為污點(diǎn)數(shù)據(jù))符合一定規(guī)則(污點(diǎn)傳播規(guī)則)的寄存器、內(nèi)存值被標(biāo)記為污點(diǎn)值,當(dāng)程序某處污點(diǎn)值和初始污點(diǎn)數(shù)據(jù)能與校驗(yàn)函數(shù)模式進(jìn)行匹配時(shí),則判定該處污點(diǎn)所在的程序語句為校驗(yàn)函數(shù)。這種方法由于記錄了大量寄存器、內(nèi)存和指令數(shù)據(jù),對(duì)外存的占用量十分高;同時(shí),記錄過程和分析過程都占用了大量的cpu時(shí)鐘周期,因此時(shí)間效率較低。
綜上所述,校驗(yàn)函數(shù)定位方法存在著空間(外存)消耗大,時(shí)間效率低的問題,所以本發(fā)明提出了一種基于路徑比對(duì)的校驗(yàn)函數(shù)定位方法,在保證定位準(zhǔn)確率的前提下,降低空間消耗,有助于提高模糊測(cè)試的測(cè)試效率。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是為解決模糊測(cè)試中校驗(yàn)函數(shù)定位時(shí)空間消耗大、時(shí)間效率低的問題,提出一種基于路徑比對(duì)的校驗(yàn)函數(shù)定位方法。
本發(fā)明的設(shè)計(jì)原理為:使用指令插樁工具對(duì)目標(biāo)程序以基本塊(存在唯一入口和唯一出口地址的一段語句序列)為單位進(jìn)行動(dòng)態(tài)插樁,跟蹤eip寄存器值以獲取程序?qū)δ骋粶y(cè)試用例的執(zhí)行路徑(程序執(zhí)行時(shí)的指令執(zhí)行的地址)。對(duì)執(zhí)行路徑進(jìn)行哈希運(yùn)算,并比對(duì)這些哈希值,如果某個(gè)哈希值大量出現(xiàn),則說明程序在這個(gè)位置出現(xiàn)了“阻塞”,即大量測(cè)試用例不能通過這個(gè)路徑,可能是因?yàn)樵撀窂匠龃嬖谥r?yàn)函數(shù)。最后,在程序發(fā)生“阻塞”的位置對(duì)上下的基本塊進(jìn)行匯編特征匹配,以最終確定該處是否為校驗(yàn)函數(shù)。
本發(fā)明的技術(shù)方案是通過以下步驟實(shí)現(xiàn)的:
步驟1,進(jìn)行二進(jìn)制程序的動(dòng)態(tài)插樁,獲取程序執(zhí)行的路徑信息,具體方法如下:
步驟1.1,使用二進(jìn)制指令插樁工具,在程序執(zhí)行時(shí),對(duì)程序語句的基本塊進(jìn)行檢測(cè),當(dāng)檢測(cè)到j(luò)mp、call等跳轉(zhuǎn)語句時(shí),劃分之前的語句為一個(gè)基本塊。
步驟1.2,記錄每個(gè)基本塊的入口地址,即eip指針寄存器的值,存入離線路徑文件中。
步驟1.3,重復(fù)上述兩步驟,直至程序運(yùn)行結(jié)束,獲得對(duì)單一測(cè)試用例的路徑文件。
步驟1.4,對(duì)輸入數(shù)據(jù)進(jìn)行變異,重復(fù)步驟1.3,以獲取變異測(cè)試用例的執(zhí)行路徑文件,直至模糊測(cè)試結(jié)束。該步驟獲得了對(duì)一次模糊測(cè)試中所有測(cè)試用例的路徑文件。整個(gè)步驟1獲取了多次程序測(cè)試流程中,以基本塊首地址為內(nèi)容的程序執(zhí)行路徑,由于基本塊具有單入單出的特性,因此,這個(gè)簡(jiǎn)化的路徑文件可以完整地保存程序?qū)嶋H的執(zhí)行流程。
步驟2,在步驟1的基礎(chǔ)上,對(duì)路徑文件集進(jìn)行路徑比較,具體步驟如下:
步驟2.1,對(duì)每個(gè)路徑文件進(jìn)行哈希計(jì)算,相同的哈希結(jié)果說明兩次模糊測(cè)試使用的測(cè)試用例使程序運(yùn)行了相同的代碼。之后對(duì)計(jì)算結(jié)果進(jìn)行次數(shù)統(tǒng)計(jì),當(dāng)某一哈希值出現(xiàn)次數(shù)遠(yuǎn)大于其他值的出現(xiàn)次數(shù)時(shí),說明此處存在校驗(yàn)語句,使得多數(shù)隨機(jī)變異的測(cè)試用例不能滿足校驗(yàn)條件,從而未能通過校驗(yàn)函數(shù),而出現(xiàn)“阻塞”情況的位置就是校驗(yàn)函數(shù)所在的位置。
步驟2.2,在步驟2.1的基礎(chǔ)上,比較出現(xiàn)阻塞的文件和其他文件,文件內(nèi)容出現(xiàn)不同的路徑值,就是程序發(fā)生阻塞時(shí)的地址,記錄該地址值。
步驟3,確定校驗(yàn)函數(shù)位置,進(jìn)行校驗(yàn)函數(shù)定位,具體方法為:根據(jù)步驟2.2中記錄的地址值,考察上下基本塊的基本塊規(guī)模、匯編指令特征,符合特征的基本塊所在的函數(shù)即可定位為校驗(yàn)函數(shù)。
有益效果
相比于匯編指令統(tǒng)計(jì)和污點(diǎn)跟蹤方法,本發(fā)明采用的基于路徑比對(duì)的方法在保證定位準(zhǔn)確率的前提下,減少了定位校驗(yàn)函數(shù)時(shí)所需的外存空間,從而減少了分析離線文件時(shí)所需的工作量;同時(shí),由于獲取路徑信息只需要對(duì)每一個(gè)基本塊的首地址進(jìn)行插樁記錄,因此減少了程序插樁時(shí)帶來的時(shí)間損耗。
以上特點(diǎn)使本發(fā)明更加適用于模糊測(cè)試情景中,因?yàn)槟:郎y(cè)試需要運(yùn)行大量的測(cè)試用例,而本發(fā)明可以插入到模糊測(cè)試的流程中,充分利用了這些測(cè)試用例,并只帶來很小的時(shí)空開銷。
附圖說明
圖1為本發(fā)明基于校驗(yàn)比對(duì)的校驗(yàn)函數(shù)定位原理圖。
具體實(shí)施方式
為了更好的說明本發(fā)明的目的和優(yōu)點(diǎn),下面結(jié)合實(shí)例對(duì)本發(fā)明方法的實(shí)施方式做進(jìn)一步詳細(xì)說明。
步驟1,使用afl模糊測(cè)試工具生成測(cè)試用例。因?yàn)楸景l(fā)明需要通過測(cè)試用例尋找新路徑,故需一種用于生成測(cè)試用例的方法,而afl的用例生成原理較為簡(jiǎn)單,便于進(jìn)行方法展示。具體方法為:判斷被測(cè)文件的某個(gè)翻譯塊的起始地址是否為整個(gè)elf文件的起始地址(這個(gè)地址在elf補(bǔ)丁中進(jìn)行賦值)。如果是,則啟動(dòng)afl程序,做基本的測(cè)試準(zhǔn)備,比如開辟共享內(nèi)存空間;若非,則調(diào)用afl_forkserver函數(shù),通過cpuarchstate結(jié)構(gòu)體進(jìn)行初始化,再調(diào)用afl_maybe_log函數(shù)進(jìn)行語句插樁。以后afl每完成一次測(cè)試,都從重新創(chuàng)建一個(gè)新的路徑文件,方便步驟2中記錄不同測(cè)試的路徑文件。
步驟2,在步驟1的基礎(chǔ)上,qemu仿真器進(jìn)行二進(jìn)制程序的動(dòng)態(tài)插樁,獲取程序執(zhí)行的路徑信息。所謂動(dòng)態(tài)插樁是指在程序的運(yùn)行過程中,根據(jù)運(yùn)行時(shí)語句的不同進(jìn)行選擇性插樁。具體到qemu中,使用翻譯塊tb結(jié)構(gòu)體中的pc和cs兩個(gè)指針,分別表示eip寄存器和cs段,二者共同表示了某條語句的地址;而tb本身就是基于基本塊的翻譯方式,因此使用qemu進(jìn)行插樁時(shí),省卻了基本塊判別的步驟。
步驟3,使用md5哈希計(jì)算,將每個(gè)路徑文件進(jìn)行計(jì)算。在做模糊測(cè)試時(shí),一般傾向于給出一個(gè)合法的測(cè)試用例(初始測(cè)試用例)并在此用例的基礎(chǔ)上進(jìn)行變異,由于這個(gè)用例是合法的,因此一定可以通過校驗(yàn)函數(shù)的檢測(cè)。所以在做路徑文件比對(duì)時(shí),如果發(fā)現(xiàn)大量文件的md5值相同,則將這些文件的路徑信息和初始用例產(chǎn)生的路徑信息進(jìn)行對(duì)比,如果該路徑與初始路徑在某個(gè)地址處出現(xiàn)了不同且總路徑數(shù)小與初始路徑數(shù),則記錄該地址。
步驟4,使用步驟3中記錄的地址,用ida等反匯編軟件查看該地址前后基本塊的匯編代碼,在代碼處查找cmp等比較類指令,如果存在,則進(jìn)一步對(duì)基本塊規(guī)模和基本塊代碼特征進(jìn)行比對(duì),因?yàn)樾r?yàn)函數(shù)往往含有較少的跳轉(zhuǎn),因此基本塊規(guī)模較大;又因?yàn)榇嬖谟?jì)算,因此運(yùn)算指令比例較高。
其中,基本塊規(guī)模取40條指令以上;而運(yùn)算指令包括表1中所述所有指令。
表1運(yùn)算指令特征
其中,通過多次實(shí)驗(yàn)進(jìn)行平均可得門限參數(shù):運(yùn)算指令總占比在26%以上;或者在去除mov和循環(huán)移位類指令后,運(yùn)算指令占比在55%以上,則可判定該地址即是校驗(yàn)函數(shù)所在位置。
測(cè)試結(jié)果
實(shí)驗(yàn)對(duì)目標(biāo)程序中的校驗(yàn)函數(shù)進(jìn)行定位,結(jié)果顯示,本發(fā)明可以有效定位函數(shù)中存在的校驗(yàn)函數(shù),準(zhǔn)確率達(dá)到94.4%,并且顯著減少了定位所需的空間消耗,對(duì)百兆級(jí)程序進(jìn)行校驗(yàn)定位所需的空間只有幾十兆,遠(yuǎn)小于污點(diǎn)跟蹤方法所需的g級(jí)空間消耗,并減少了離線分析的工作量。
以上所述的具體描述,對(duì)發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實(shí)施例而已,并不用于限定本發(fā)明的保護(hù)范圍,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。