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