基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法
【專利摘要】本發(fā)明公開一種基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,包括:預(yù)處理;虛函數(shù)調(diào)用點(diǎn)識(shí)別;虛函數(shù)表識(shí)別;虛函數(shù)表繼承關(guān)系識(shí)別;防護(hù)檢測(cè)。通過對(duì)可執(zhí)行文件進(jìn)行分析,根據(jù)其中虛函數(shù)表之間的繼承關(guān)系,對(duì)代碼中的虛函數(shù)調(diào)用點(diǎn)進(jìn)行控制流完整性保護(hù),檢測(cè)代碼重利用攻擊,避免采用原有方法依賴源代碼獲得合法虛函數(shù)集合或?qū)⑺刑摵瘮?shù)視為合法集合的檢測(cè)策略,具有較高檢測(cè)精度和速度,提高代碼重利用攻擊檢測(cè)的準(zhǔn)確性、通用性和效率。
【專利說明】
基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法
技術(shù)領(lǐng)域
[0001]本發(fā)明屬于代碼重利用攻擊檢測(cè)方法的技術(shù)領(lǐng)域,尤其涉及一種基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法。
【背景技術(shù)】
[0002]C++語言支持動(dòng)態(tài)綁定,代碼中存在大量的由虛函數(shù)調(diào)用而產(chǎn)生的間接跳轉(zhuǎn),極易為攻擊者所利用,并且代碼重用攻擊不需要注入攻擊代碼,具有較好的隱蔽性、和圖靈完備的計(jì)算能力,給用戶計(jì)算機(jī)系統(tǒng)安全帶來極大危害。針對(duì)虛函數(shù)調(diào)用點(diǎn)的控制流進(jìn)行完整性保護(hù),是檢測(cè)代碼重利用攻擊的重要手段之一。然而,目前的代碼重利用攻擊檢測(cè)方法在檢測(cè)過程中存在著應(yīng)用范圍有限、不夠準(zhǔn)確、時(shí)間開銷大等缺點(diǎn),影響著檢測(cè)方法的適用性。
【發(fā)明內(nèi)容】
[0003]針對(duì)目前代碼重利用攻擊檢測(cè)方法在檢測(cè)過程中存在著通用性差、準(zhǔn)確性低、性能開銷大的問題,本發(fā)明提出一種基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法。
[0004]為了對(duì)披露的實(shí)施例的一些方面有一個(gè)基本的理解,下面給出了簡(jiǎn)單的概括。該概括部分不是泛泛評(píng)述,也不是要確定關(guān)鍵/重要組成元素或描繪這些實(shí)施例的保護(hù)范圍。其唯一目的是用簡(jiǎn)單的形式呈現(xiàn)一些概念,以此作為后面的詳細(xì)說明的序言。
[0005]本發(fā)明采用如下技術(shù)方案:
[0006]在一些可選的實(shí)施例中,提供一種基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,包括:
[0007]預(yù)處理:對(duì)可執(zhí)行文件進(jìn)行預(yù)處理,生成中間語言文件;
[0008]虛函數(shù)調(diào)用點(diǎn)識(shí)別:針對(duì)所述中間語言文件進(jìn)行數(shù)據(jù)流分析,識(shí)別出所述中間語言文件中的虛函數(shù)調(diào)用點(diǎn)集合,作為運(yùn)行時(shí)防護(hù)的檢測(cè)點(diǎn);
[0009]虛函數(shù)表識(shí)別:掃描所述可執(zhí)行文件,檢測(cè)所述可執(zhí)行文件中的虛函數(shù)表集合并得到所有虛函數(shù)表中的虛函數(shù);
[0010]虛函數(shù)表繼承關(guān)系識(shí)別:結(jié)合所述中間語言文件和所述虛函數(shù)表集合,分析得出虛函數(shù)表之間的繼承關(guān)系,作為運(yùn)行時(shí)檢測(cè)代碼重利用攻擊的依據(jù);
[0011]防護(hù)檢測(cè):利用虛函數(shù)表繼承關(guān)系對(duì)程序進(jìn)行運(yùn)行時(shí)防護(hù),驗(yàn)證虛函數(shù)調(diào)用的合法性,檢測(cè)代碼重利用攻擊。
[0012]在一些可選的實(shí)施例中,所述虛函數(shù)調(diào)用點(diǎn)是指程序中虛函數(shù)調(diào)用的指令,所述虛函數(shù)調(diào)用點(diǎn)的數(shù)據(jù)結(jié)構(gòu)包括:指令所在的地址;所述虛函數(shù)表的數(shù)據(jù)結(jié)構(gòu)包括:虛函數(shù)表所在的地址及虛函數(shù)表中的所有虛函數(shù)的地址組成的集合;虛函數(shù)表繼承關(guān)系的數(shù)據(jù)結(jié)構(gòu)為一個(gè)集合,所述集合的元素為關(guān)聯(lián)虛函數(shù)表集合,所述關(guān)聯(lián)虛函數(shù)表集合是指由虛函數(shù)表組成的集合,所述關(guān)聯(lián)虛函數(shù)表集合中的所有虛函數(shù)表之間具有繼承關(guān)系。
[0013]在一些可選的實(shí)施例中,所述預(yù)處理的過程包括:利用二進(jìn)制程序行為監(jiān)測(cè)分析平臺(tái),以所述可執(zhí)行文件為輸入,對(duì)所述可執(zhí)行文件中的代碼段進(jìn)行反匯編轉(zhuǎn)換為中間語言,并輸出中間語言文件。
[0014]在一些可選的實(shí)施例中,所述虛函數(shù)調(diào)用點(diǎn)識(shí)別的過程包括:生成間接函數(shù)調(diào)用點(diǎn)集合;在所述間接函數(shù)調(diào)用點(diǎn)集合中依次取一個(gè)間接函數(shù)調(diào)用點(diǎn);在取出的間接函數(shù)調(diào)用點(diǎn)處開始進(jìn)行逆向數(shù)據(jù)流分析,得到函數(shù)調(diào)用目的地址表達(dá)式;將所述函數(shù)調(diào)用目的地址表達(dá)式與形式deref (deref (exp )+Tval)相比較;若比較結(jié)果為符合,對(duì)間接調(diào)用的第一個(gè)參數(shù)從傳參的位置處開始進(jìn)行逆向數(shù)據(jù)流分析,直到函數(shù)開頭,得到參數(shù)在函數(shù)開頭位置處的表達(dá)式;將所述參數(shù)在函數(shù)開頭位置處的表達(dá)式與所述函數(shù)調(diào)用目的地址表達(dá)式中的exp進(jìn)行比較;若比較結(jié)果為符合,將所述間接函數(shù)調(diào)用點(diǎn)加入虛函數(shù)調(diào)用點(diǎn)集合。
[0015]在一些可選的實(shí)施例中,所述虛函數(shù)表識(shí)別的過程包括:掃描所述可執(zhí)行文件,找出出現(xiàn)的所有立即數(shù)并存在立即數(shù)鏈表中;從所述立即數(shù)鏈表中取一個(gè)立即數(shù);以所述立即數(shù)為指針,判斷所述立即數(shù)指向的區(qū)域是否為只讀數(shù)據(jù)區(qū);若所述立即數(shù)指向的區(qū)域?yàn)橹蛔x數(shù)據(jù)區(qū),從所述立即數(shù)指向的地址取數(shù)據(jù),以取到的數(shù)據(jù)為指針;若所述指針指向合法指令地址,讀取虛函數(shù)表中的虛函數(shù);將讀取的虛函數(shù)表加入虛函數(shù)表集合。
[0016]在一些可選的實(shí)施例中,所述虛函數(shù)表繼承關(guān)系識(shí)別的過程包括:在程序中依次取出一個(gè)函數(shù);對(duì)取出的函數(shù)進(jìn)行數(shù)據(jù)流分析,得到虛函數(shù)表指針初始化信息集合;從所述虛函數(shù)表指針初始化信息集合依次取一條虛函數(shù)表指針初始化信息;將取出的虛函數(shù)表指針初始化信息中的虛函數(shù)表集合插入虛函數(shù)表繼承關(guān)系。
[0017]在一些可選的實(shí)施例中,所述將取出的虛函數(shù)表指針初始化信息中的虛函數(shù)表集合插入虛函數(shù)表繼承關(guān)系的過程包括:若待插入的虛函數(shù)表集合與虛函數(shù)表繼承關(guān)系中的某個(gè)虛函數(shù)表集合有交集,則將兩個(gè)集合合并,否則,將待插入的虛函數(shù)表集合直接插入虛函數(shù)表繼承關(guān)系中。
[0018]在一些可選的實(shí)施例中,所述防護(hù)檢測(cè)的過程包括:
[0019]701:啟動(dòng)二進(jìn)制插粧平臺(tái),載入應(yīng)用程序的可執(zhí)行文件;
[0020]702:從可執(zhí)行文件依次取指令;
[0021]703:判斷是否取到指令,若取到指令,進(jìn)行步驟704,否則進(jìn)行步驟715;
[0022]704:在所述虛函數(shù)調(diào)用點(diǎn)集合中查找取出的指令的地址;
[0023]705:判斷是否查找到取出的指令的地址,若查找到,進(jìn)行步驟706,否則,進(jìn)行步驟714;
[0024]706:取虛函數(shù)調(diào)用點(diǎn)所綁定的關(guān)聯(lián)虛函數(shù)表集合;
[0025]707:判斷是否取到關(guān)聯(lián)虛函數(shù)表集合,若取到,則進(jìn)行步驟708,否則,進(jìn)行步驟710;
[0026]708:在關(guān)聯(lián)虛函數(shù)表集合中的虛函數(shù)表中查找目的地址;
[0027]709:判斷是否查找到目的地址,若查找到目的地址,則進(jìn)行步驟714,否則,進(jìn)行步驟712;
[0028]710:根據(jù)目的地址查找關(guān)聯(lián)虛函數(shù)表集合;
[0029]711:判斷是否查找到關(guān)聯(lián)虛函數(shù)表集合,若查找到關(guān)聯(lián)虛函數(shù)表集合,則進(jìn)行步驟713,否則進(jìn)行步驟712;
[0030]712:進(jìn)行報(bào)告,報(bào)告檢測(cè)到了代碼重利用攻擊;
[0031]713:綁定虛函數(shù)調(diào)用點(diǎn)與關(guān)聯(lián)虛函數(shù)集合;
[0032]714:執(zhí)行指令;
[0033]715:結(jié)束,終止程序。
[0034]本發(fā)明所帶來的有益效果:通過對(duì)可執(zhí)行文件進(jìn)行分析,根據(jù)其中虛函數(shù)表之間的繼承關(guān)系,對(duì)代碼中的虛函數(shù)調(diào)用點(diǎn)進(jìn)行控制流完整性保護(hù),檢測(cè)代碼重利用攻擊,避免采用原有方法依賴源代碼獲得合法虛函數(shù)集合或?qū)⑺刑摵瘮?shù)視為合法集合的檢測(cè)策略,具有較高檢測(cè)精度和速度,提高代碼重利用攻擊檢測(cè)的準(zhǔn)確性、通用性和效率。
【附圖說明】
[0035]圖1是本發(fā)明基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法的流程示意圖;
[0036]圖2是本發(fā)明虛函數(shù)調(diào)用點(diǎn)識(shí)別過程的流程示意圖;
[0037]圖3是本發(fā)明虛函數(shù)表識(shí)別過程的流程示意圖;
[0038]圖4是本發(fā)明虛函數(shù)讀取流程圖;
[0039]圖5是本發(fā)明虛函數(shù)表繼承關(guān)系識(shí)別過程的流程示意圖;
[0040]圖6是本發(fā)明虛函數(shù)表指針初始化信息生成流程圖;
[0041 ]圖7是本發(fā)明防護(hù)檢測(cè)過程的流程示意圖。
【具體實(shí)施方式】
[0042]以下描述和附圖充分地示出本發(fā)明的具體實(shí)施方案,以使本領(lǐng)域的技術(shù)人員能夠?qū)嵺`它們。其他實(shí)施方案可以包括結(jié)構(gòu)的、邏輯的、電氣的、過程的以及其他的改變。實(shí)施例僅代表可能的變化。除非明確要求,否則單獨(dú)的部件和功能是可選的,并且操作的順序可以變化。一些實(shí)施方案的部分和特征可以被包括在或替換其他實(shí)施方案的部分和特征。
[0043]如圖1所示,在一些說明性的實(shí)施例中,提供一種基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,包括:
[0044]101:預(yù)處理。對(duì)可執(zhí)行文件進(jìn)行預(yù)處理,生成中間語言文件,包括:利用二進(jìn)制程序行為監(jiān)測(cè)分析平臺(tái)的工具toil,以所述可執(zhí)行文件為輸入,對(duì)所述可執(zhí)行文件中的代碼段進(jìn)行反匯編轉(zhuǎn)換為中間語言,并輸出中間語言文件。
[0045]102:虛函數(shù)調(diào)用點(diǎn)識(shí)別。針對(duì)所述中間語言文件進(jìn)行數(shù)據(jù)流分析,識(shí)別出所述中間語言文件中的虛函數(shù)調(diào)用點(diǎn)集合,作為運(yùn)行時(shí)防護(hù)的檢測(cè)點(diǎn)。所述虛函數(shù)調(diào)用點(diǎn)是指程序中虛函數(shù)調(diào)用的指令,所述虛函數(shù)調(diào)用點(diǎn)的數(shù)據(jù)結(jié)構(gòu)包括:指令所在的地址,即其數(shù)據(jù)結(jié)構(gòu)直接以該指令所在的地址表示。
[0046]103:虛函數(shù)表識(shí)別。掃描所述可執(zhí)行文件,檢測(cè)所述可執(zhí)行文件中的虛函數(shù)表集合并得到所有虛函數(shù)表中的虛函數(shù)。虛函數(shù)表的數(shù)據(jù)結(jié)構(gòu)包括兩項(xiàng),一是虛函數(shù)表所在的地址,二是虛函數(shù)表中的所有虛函數(shù)的地址組成的集合。
[0047]104:虛函數(shù)表繼承關(guān)系識(shí)別。結(jié)合所述中間語言文件和所述虛函數(shù)表集合,分析得出虛函數(shù)表之間的繼承關(guān)系,作為運(yùn)行時(shí)檢測(cè)代碼重利用攻擊的依據(jù)。
[0048]若一個(gè)類的虛函數(shù)表繼承自其基類的虛函數(shù)表,則稱這兩個(gè)虛函數(shù)表之間有繼承關(guān)系,繼承關(guān)系具有傳遞性。虛函數(shù)表繼承關(guān)系的數(shù)據(jù)結(jié)構(gòu)為一個(gè)集合,所述集合的元素為關(guān)聯(lián)虛函數(shù)表集合,所述關(guān)聯(lián)虛函數(shù)表集合是指由虛函數(shù)表組成的集合,所述關(guān)聯(lián)虛函數(shù)表集合中的所有虛函數(shù)表之間具有繼承關(guān)系。任意一個(gè)虛函數(shù)表都存在于一個(gè)唯一的關(guān)聯(lián)虛函數(shù)集合中,且任意兩個(gè)有繼承關(guān)系的虛函數(shù)表在同一個(gè)關(guān)聯(lián)虛函數(shù)集合中。
[0049]105:防護(hù)檢測(cè)。利用虛函數(shù)表繼承關(guān)系對(duì)程序進(jìn)行運(yùn)行時(shí)防護(hù),驗(yàn)證虛函數(shù)調(diào)用的合法性,檢測(cè)代碼重利用攻擊。
[0050]在一些說明性的實(shí)施例中,如圖2所示,步驟102包括:
[0051]201:掃描整個(gè)程序,找出其中所有的間接函數(shù)調(diào)用點(diǎn),生成間接函數(shù)調(diào)用點(diǎn)集合。間接函數(shù)調(diào)用點(diǎn)指程序中的間接函數(shù)調(diào)用指令,其數(shù)據(jù)結(jié)構(gòu)以指令所在的地址表示。
[0052]202:在所述間接函數(shù)調(diào)用點(diǎn)集合中依次取一個(gè)間接函數(shù)調(diào)用點(diǎn)。
[0053]203:判斷是否取到間接函數(shù)調(diào)用點(diǎn),若取到間接函數(shù)調(diào)用點(diǎn),則進(jìn)行步驟204,否貝1J,進(jìn)行步驟211。
[0054]204:在取出的間接函數(shù)調(diào)用點(diǎn)處開始進(jìn)行逆向數(shù)據(jù)流分析,直到該函數(shù)開頭,得到目的地址在函數(shù)開頭位置處時(shí)的表達(dá)式。逆向數(shù)據(jù)流分析表示對(duì)程序中的某項(xiàng)數(shù)據(jù),從某條指令處開始向前掃描,當(dāng)經(jīng)過對(duì)該數(shù)據(jù)處理的指令時(shí),對(duì)指令的表達(dá)式進(jìn)行更新。[°°55] 205:將得到的函數(shù)調(diào)用目的地址表達(dá)式與形式deref (deref (exp)+Tval)相比較。形式deref (deref (exp)+Tval)為虛函數(shù)調(diào)用時(shí),跳轉(zhuǎn)的目的地址的表達(dá)式經(jīng)過逆向數(shù)據(jù)流分析之后,應(yīng)當(dāng)表現(xiàn)出來的形式,其中,deref表示對(duì)數(shù)據(jù)解引用,exp為任意的表達(dá)式,Tval為立即數(shù),其值大于或等于零。
[0056]206:判斷步驟205中的比較結(jié)果是否符合,若符合,則進(jìn)行步驟207,否則,進(jìn)行步驟202。
[0057]207:對(duì)間接調(diào)用的第一個(gè)參數(shù)從傳參的位置處開始進(jìn)行逆向數(shù)據(jù)流分析,直到函數(shù)開頭,得到參數(shù)在函數(shù)開頭位置處的表達(dá)式。
[0058]208:將參數(shù)在函數(shù)開頭位置處的表達(dá)式與所述函數(shù)調(diào)用目的地址表達(dá)式中的exp進(jìn)行比較。
[0059]209:判斷步驟208中的比較結(jié)果是否符合,若符合,則進(jìn)行步驟210,否則,進(jìn)行步驟202。
[0060]210:將所述間接函數(shù)調(diào)用點(diǎn)加入虛函數(shù)調(diào)用點(diǎn)集合。
[0061 ] 211:結(jié)束,虛函數(shù)調(diào)用點(diǎn)集合生成完成。
[0062]在一些說明性的實(shí)施例中,如圖3所示,步驟103包括:
[0063]301:掃描可執(zhí)行文件,找出出現(xiàn)的所有立即數(shù)并存在立即數(shù)鏈表中。
[0064]302:從立即數(shù)鏈表中取一個(gè)立即數(shù)。
[0065]303:判斷是否取到立即數(shù),若取到立即數(shù),則進(jìn)行步驟304,否則進(jìn)行步驟309。
[0066]304:以立即數(shù)為指針,判斷立即數(shù)指向的區(qū)域是否為只讀數(shù)據(jù)區(qū),若指向只讀區(qū)域,則進(jìn)行步驟305,否則進(jìn)行步驟302。
[0067]305:從所述立即數(shù)指向的地址取數(shù)據(jù),以取到的數(shù)據(jù)為指針。
[0068]306:判斷所述指針是否指向合法指令地址,若指向合法指令地址,則進(jìn)行步驟307,否則,進(jìn)行步驟302。
[0069]307:讀取虛函數(shù)表中的虛函數(shù)。
[0070]308:將讀取的虛函數(shù)表加入虛函數(shù)表集合。
[0071]309:結(jié)束。
[0072]在一些說明性的實(shí)施例中,如圖4所示,所述步驟307包括:
[0073]401:從虛函數(shù)表的地址處依次讀取數(shù)據(jù),讀取下一條數(shù)據(jù)。
[0074]402:判斷步驟401中是否讀取到數(shù)據(jù),若讀取到數(shù)據(jù),進(jìn)行步驟403,否則,進(jìn)行步驟406。
[0075]403:以取到的數(shù)據(jù)為指針,查看其指向的位置。
[0076]404:判斷指針是否指向合法指令地址,若指向合法指令地址,則進(jìn)行步驟405,否貝丨J,進(jìn)行步驟406。
[0077]405:將此虛函數(shù)加入虛函數(shù)表集合。
[0078]406:結(jié)束。
[0079]在一些說明性的實(shí)施例中,如圖5所示,步驟104包括:
[0080]501:在程序中依次取出一個(gè)函數(shù)。
[0081]502:判斷是否取出函數(shù),若取出函數(shù),則進(jìn)行步驟503,否則,進(jìn)行步驟507。
[0082]503:對(duì)取出的函數(shù)進(jìn)行數(shù)據(jù)流分析,得到虛函數(shù)表指針初始化信息集合。
[0083]504:從所述虛函數(shù)表指針初始化信息集合依次取一條虛函數(shù)表指針初始化信息。
[0084]505:判斷是否取出虛函數(shù)表指針初始化信息,若取出虛函數(shù)表指針初始化信息,則進(jìn)行步驟506,否則,進(jìn)行步驟501。
[0085]506:將取出的虛函數(shù)表指針初始化信息中的虛函數(shù)表集合插入虛函數(shù)表繼承關(guān)系。插入過程包括:若待插入的虛函數(shù)表集合與虛函數(shù)表繼承關(guān)系中的某個(gè)虛函數(shù)表集合有交集,則將兩個(gè)集合合并,否則,將待插入的虛函數(shù)表集合直接插入虛函數(shù)表繼承關(guān)系中。
[0086]507:結(jié)束。
[0087]虛函數(shù)表指針初始化信息包括一個(gè)虛函數(shù)表指針,一個(gè)虛函數(shù)表集合。虛函數(shù)表指針以程序中的一個(gè)表達(dá)式表示,虛函數(shù)表集合中為該虛函數(shù)表指針可能指向的所有虛函數(shù)表。
[0088]其中,如圖6所示,虛函數(shù)表指針初始化信息生成流程包括:
[0089]601:掃描得到本函數(shù)以及本函數(shù)直接調(diào)用的所有函數(shù)中的虛函數(shù)表指針初始化指令。
[0090]602:取一條虛函數(shù)表指針初始化指令。
[0091]603:判斷是否取到虛函數(shù)表指針初始化指令,若取到虛函數(shù)表指針初始化指令,則進(jìn)行步驟604,否則,進(jìn)行步驟610。
[0092]604:對(duì)指令的目的操作數(shù)進(jìn)行逆向數(shù)據(jù)流分析,得到虛函數(shù)表指針表達(dá)式。
[0093]605:從虛函數(shù)表指針初始化信息集合中查找包含該虛函數(shù)表指針的虛函數(shù)表指針初始化信息。
[0094]606:判斷是否查找到虛函數(shù)表指針初始化信息,若查找到虛函數(shù)表指針初始化信息,則進(jìn)行步驟609,否則,進(jìn)行步驟607。
[0095]607:根據(jù)虛函數(shù)表指針的表達(dá)式,以及指令的源操作數(shù)創(chuàng)建一條虛函數(shù)表指針初始化信息。
[0096]608:將新創(chuàng)建的虛函數(shù)表指針初始化信息插入虛函數(shù)表指針初始化信息集合。
[0097]609:將指令的源操作數(shù)插入找到的虛函數(shù)表指針初始化信息的虛函數(shù)表集合中。
[0098]610:結(jié)束。
[0099]虛函數(shù)表指針初始化指令為對(duì)虛函數(shù)表指針進(jìn)行初始化的指令,以該指令的地址表不。
[0100]在一些說明性的實(shí)施例中,如圖7所示,步驟105包括:
[0101]701:啟動(dòng)二進(jìn)制插粧平臺(tái),載入應(yīng)用程序的可執(zhí)行文件。
[0102]702:從可執(zhí)行文件依次取指令。
[0103]703:判斷是否取到指令,若取到指令,進(jìn)行步驟704,否則,進(jìn)行步驟715。
[0104]704:在所述虛函數(shù)調(diào)用點(diǎn)集合中查找取出的指令的地址。
[0105]705:判斷是否查找到取出的指令的地址,若查找到,進(jìn)行步驟706,否則,進(jìn)行步驟714。
[0106]706:取虛函數(shù)調(diào)用點(diǎn)所綁定的關(guān)聯(lián)虛函數(shù)表集合。
[0107]707:判斷是否取到關(guān)聯(lián)虛函數(shù)表集合,若取到,則進(jìn)行步驟708,否則,進(jìn)行步驟710。
[0108]708:在關(guān)聯(lián)虛函數(shù)表集合中的虛函數(shù)表中查找目的地址。
[0109]709:判斷是否查找到目的地址,若查找到目的地址,則進(jìn)行步驟714,否則,進(jìn)行步驟 712。
[0110]710:根據(jù)目的地址查找關(guān)聯(lián)虛函數(shù)表集合。
[0111]711:判斷是否查找到關(guān)聯(lián)虛函數(shù)表集合,若查找到關(guān)聯(lián)虛函數(shù)表集合,則進(jìn)行步驟713,否則進(jìn)行步驟712。
[0112]712:進(jìn)行報(bào)告,報(bào)告檢測(cè)到了代碼重利用攻擊。
[0113]713:綁定虛函數(shù)調(diào)用點(diǎn)與關(guān)聯(lián)虛函數(shù)集合。
[0114]714:執(zhí)行指令。
[0115]715:結(jié)束,終止程序。
[0116]本領(lǐng)域技術(shù)人員還應(yīng)當(dāng)理解,結(jié)合本文的實(shí)施例描述的各種說明性的邏輯框、模塊、電路和算法步驟均可以實(shí)現(xiàn)成電子硬件、計(jì)算機(jī)軟件或其組合。為了清楚地說明硬件和軟件之間的可交換性,上面對(duì)各種說明性的部件、框、模塊、電路和步驟均圍繞其功能進(jìn)行了一般地描述。至于這種功能是實(shí)現(xiàn)成硬件還是實(shí)現(xiàn)成軟件,取決于特定的應(yīng)用和對(duì)整個(gè)系統(tǒng)所施加的設(shè)計(jì)約束條件。熟練的技術(shù)人員可以針對(duì)每個(gè)特定應(yīng)用,以變通的方式實(shí)現(xiàn)所描述的功能,但是,這種實(shí)現(xiàn)決策不應(yīng)解釋為背離本公開的保護(hù)范圍。
【主權(quán)項(xiàng)】
1.基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,其特征在于,包括: 預(yù)處理:對(duì)可執(zhí)行文件進(jìn)行預(yù)處理,生成中間語言文件; 虛函數(shù)調(diào)用點(diǎn)識(shí)別:針對(duì)所述中間語言文件進(jìn)行數(shù)據(jù)流分析,識(shí)別出所述中間語言文件中的虛函數(shù)調(diào)用點(diǎn)集合,作為運(yùn)行時(shí)防護(hù)的檢測(cè)點(diǎn); 虛函數(shù)表識(shí)別:掃描所述可執(zhí)行文件,檢測(cè)所述可執(zhí)行文件中的虛函數(shù)表集合并得到所有虛函數(shù)表中的虛函數(shù); 虛函數(shù)表繼承關(guān)系識(shí)別:結(jié)合所述中間語言文件和所述虛函數(shù)表集合,分析得出虛函數(shù)表之間的繼承關(guān)系,作為運(yùn)行時(shí)檢測(cè)代碼重利用攻擊的依據(jù); 防護(hù)檢測(cè):利用虛函數(shù)表繼承關(guān)系對(duì)程序進(jìn)行運(yùn)行時(shí)防護(hù),驗(yàn)證虛函數(shù)調(diào)用的合法性,檢測(cè)代碼重利用攻擊。2.根據(jù)權(quán)利要求1所述的基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,其特征在于, 所述虛函數(shù)調(diào)用點(diǎn)是指程序中虛函數(shù)調(diào)用的指令,所述虛函數(shù)調(diào)用點(diǎn)的數(shù)據(jù)結(jié)構(gòu)包括:指令所在的地址; 所述虛函數(shù)表的數(shù)據(jù)結(jié)構(gòu)包括:虛函數(shù)表所在的地址及虛函數(shù)表中的所有虛函數(shù)的地址組成的集合; 虛函數(shù)表繼承關(guān)系的數(shù)據(jù)結(jié)構(gòu)為一個(gè)集合,所述集合的元素為關(guān)聯(lián)虛函數(shù)表集合,所述關(guān)聯(lián)虛函數(shù)表集合是指由虛函數(shù)表組成的集合,所述關(guān)聯(lián)虛函數(shù)表集合中的所有虛函數(shù)表之間具有繼承關(guān)系。3.根據(jù)權(quán)利要求1或2所述的基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,其特征在于,所述預(yù)處理的過程包括:利用二進(jìn)制程序行為監(jiān)測(cè)分析平臺(tái),以所述可執(zhí)行文件為輸入,對(duì)所述可執(zhí)行文件中的代碼段進(jìn)行反匯編轉(zhuǎn)換為中間語言,并輸出中間語言文件。4.根據(jù)權(quán)利要求3所述的基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,其特征在于,所述虛函數(shù)調(diào)用點(diǎn)識(shí)別的過程包括: 生成間接函數(shù)調(diào)用點(diǎn)集合; 在所述間接函數(shù)調(diào)用點(diǎn)集合中依次取一個(gè)間接函數(shù)調(diào)用點(diǎn); 在取出的間接函數(shù)調(diào)用點(diǎn)處開始進(jìn)行逆向數(shù)據(jù)流分析,得到函數(shù)調(diào)用目的地址表達(dá)式; 將所述函數(shù)調(diào)用目的地址表達(dá)式與形式deref (deref (exp)+Tval)相比較; 若比較結(jié)果為符合,對(duì)間接調(diào)用的第一個(gè)參數(shù)從傳參的位置處開始進(jìn)行逆向數(shù)據(jù)流分析,直到函數(shù)開頭,得到參數(shù)在函數(shù)開頭位置處的表達(dá)式; 將所述參數(shù)在函數(shù)開頭位置處的表達(dá)式與所述函數(shù)調(diào)用目的地址表達(dá)式中的exp進(jìn)行比較; 若比較結(jié)果為符合,將所述間接函數(shù)調(diào)用點(diǎn)加入虛函數(shù)調(diào)用點(diǎn)集合。5.根據(jù)權(quán)利要求3所述的基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,其特征在于,所述虛函數(shù)表識(shí)別的過程包括: 掃描所述可執(zhí)行文件,找出出現(xiàn)的所有立即數(shù)并存在立即數(shù)鏈表中; 從所述立即數(shù)鏈表中取一個(gè)立即數(shù); 以所述立即數(shù)為指針,判斷所述立即數(shù)指向的區(qū)域是否為只讀數(shù)據(jù)區(qū); 若所述立即數(shù)指向的區(qū)域?yàn)橹蛔x數(shù)據(jù)區(qū),從所述立即數(shù)指向的地址取數(shù)據(jù),以取到的數(shù)據(jù)為指針; 若所述指針指向合法指令地址,讀取虛函數(shù)表中的虛函數(shù); 將讀取的虛函數(shù)表加入虛函數(shù)表集合。6.根據(jù)權(quán)利要求3所述的基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,其特征在于,所述虛函數(shù)表繼承關(guān)系識(shí)別的過程包括: 在程序中依次取出一個(gè)函數(shù); 對(duì)取出的函數(shù)進(jìn)行數(shù)據(jù)流分析,得到虛函數(shù)表指針初始化信息集合; 從所述虛函數(shù)表指針初始化信息集合依次取一條虛函數(shù)表指針初始化信息; 將取出的虛函數(shù)表指針初始化信息中的虛函數(shù)表集合插入虛函數(shù)表繼承關(guān)系。7.根據(jù)權(quán)利要求6所述的基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,其特征在于,所述將取出的虛函數(shù)表指針初始化信息中的虛函數(shù)表集合插入虛函數(shù)表繼承關(guān)系的過程包括: 若待插入的虛函數(shù)表集合與虛函數(shù)表繼承關(guān)系中的某個(gè)虛函數(shù)表集合有交集,則將兩個(gè)集合合并,否則,將待插入的虛函數(shù)表集合直接插入虛函數(shù)表繼承關(guān)系中。8.根據(jù)權(quán)利要求3所述的基于虛函數(shù)表繼承關(guān)系的代碼重利用攻擊檢測(cè)方法,其特征在于,所述防護(hù)檢測(cè)的過程包括:. 701:啟動(dòng)二進(jìn)制插粧平臺(tái),載入應(yīng)用程序的可執(zhí)行文件; . 702:從可執(zhí)行文件依次取指令; . 703:判斷是否取到指令,若取到指令,進(jìn)行步驟704,否則進(jìn)行步驟715; .704:在所述虛函數(shù)調(diào)用點(diǎn)集合中查找取出的指令的地址; . 705:判斷是否查找到取出的指令的地址,若查找到,進(jìn)行步驟706,否則,進(jìn)行步驟714; . 706:取虛函數(shù)調(diào)用點(diǎn)所綁定的關(guān)聯(lián)虛函數(shù)表集合; . 707:判斷是否取到關(guān)聯(lián)虛函數(shù)表集合,若取到,則進(jìn)行步驟708,否則,進(jìn)行步驟710; .708:在關(guān)聯(lián)虛函數(shù)表集合中的虛函數(shù)表中查找目的地址; .709:判斷是否查找到目的地址,若查找到目的地址,則進(jìn)行步驟714,否則,進(jìn)行步驟.712; .710:根據(jù)目的地址查找關(guān)聯(lián)虛函數(shù)表集合;. 711:判斷是否查找到關(guān)聯(lián)虛函數(shù)表集合,若查找到關(guān)聯(lián)虛函數(shù)表集合,則進(jìn)行步驟.713,否則進(jìn)行步驟712; . 712:進(jìn)行報(bào)告,報(bào)告檢測(cè)到了代碼重利用攻擊; .713:綁定虛函數(shù)調(diào)用點(diǎn)與關(guān)聯(lián)虛函數(shù)集合; .714:執(zhí)行指令; .715:結(jié)束,終止程序。
【文檔編號(hào)】G06F11/36GK106021110SQ201610349067
【公開日】2016年10月12日
【申請(qǐng)日】2016年5月24日
【發(fā)明人】曾慶凱, 朱偉
【申請(qǐng)人】南京大學(xué)