一種棧溢出位置的檢測方法
【技術領域】
[0001] 本發(fā)明屬于軟件分析技術領域,是一種用于軟件分析的棧溢出自動化檢測方法, 不需要被測軟件的源碼便可處理商用軟件,能夠檢測所有函數類型。
【背景技術】
[0002] 棧溢出就是緩沖區(qū)溢出的一種。程序在運行過程中,為了臨時存取數據的需要,一 般都要分配一些內存空間,通常稱這些空間為緩沖區(qū)。如果向緩沖區(qū)中寫入超過其本身長 度的數據,以致于緩沖區(qū)無法容納,造成緩沖區(qū)的溢出,造成程序崩潰或使程序轉而執(zhí)行其 它指令。
[0003] 緩沖區(qū)溢出漏洞存在普遍,且其攻擊易于實現。每當一個函數調用發(fā)生時,調用者 會在棧中留下一個活動紀錄,它包含了函數結束時返回的地址。而棧溢出主要指棧的關鍵 內容被外界所改變,如果局部緩沖區(qū)發(fā)生溢出(超過了緩沖區(qū)的上邊界),即往棧生長方向 的相反方向生長,那么就有可能覆蓋一些關鍵指針,比如函數返回地址等。此時,程序的運 行就會發(fā)生異常,比如返回地址的修改將使程序運行跳轉不可預料的地址,例如跳轉到惡 意程序等。
[0004] 程序插粧,最早是由J.C. Huang教授提出的,它是在保證被測程序原有邏輯完整 性的基礎上在程序中插入一些探針,通過探針的執(zhí)行并拋出程序運行的特征數據,通過對 這些數據的分析,可以獲得程序的控制流和數據流信息,進而得到邏輯覆蓋等動態(tài)信息,從 而實現測試目的的方法。
[0005] 根據檢測發(fā)生的階段,棧溢出的檢測可以分為靜態(tài)檢測技術和動態(tài)檢測技術。靜 態(tài)檢測技術指的是不依賴于程序的運行就能檢測出棧溢出的錯誤,靜態(tài)檢測一般發(fā)生在編 譯前和編譯后。動態(tài)檢測技術指的是檢測過程必須依賴于程序的運行,一般需要在程序中 插入或者修改一些指令來檢測棧的溢出。根據插入方式的不同,動態(tài)檢測技術可以進一步 劃分為靜態(tài)插裝和動態(tài)插裝。靜態(tài)插裝技術主要是指對程序的修改發(fā)生在程序運行之前。 目前靜態(tài)插裝技術主要有兩類:基于源碼的靜態(tài)插裝技術和基于二進制代碼的靜態(tài)插裝技 術。而動態(tài)插裝指的是在程序運行過程中對二進制代碼進行修改,在函數的入口和出口插 入一些指令來完成對棧使用情況的監(jiān)控。
[0006] 現在的技術對棧溢出位置的檢測都是基于源碼重新編譯的,不能針對已經編譯好 的軟件。
【發(fā)明內容】
[0007] 本發(fā)明的目的在于提供一種針對分析軟件棧溢出位置的檢測方法,該方法只判斷 函數返回地址在其入口地址集合中,并不要求其一定為本函數入口地址,能夠適應所有函 數調用方式。該方法不需要軟件源碼,在運行軟件過程中,通過插粧方式在指定位置插入代 碼,就能夠進行檢測,因而能方便地測試商用嵌入式軟件。且判斷方式簡單,能夠快速檢測 出是否發(fā)生棧溢出現象,并通過具體分析,能夠定位到發(fā)生棧溢出的具體位置。
[0008] 為了達到上述目的,本發(fā)明采用如下技術方案: 一種用于軟件分析的棧溢出自動化檢測方法及裝置,其特征在于,包括以下器件: 插粧工具:負責編譯監(jiān)測程序,從監(jiān)測程序接收檢測命令并啟動被測軟件,獲取被測軟 件運行時信息再發(fā)送給監(jiān)測程序; 監(jiān)測程序:負責實際執(zhí)行部分的主要功能,包括:設置監(jiān)測具體位置,以及監(jiān)測測試軟 件運行時的具體信息,獲取指定寄存器和內存的值,建立集合A并判斷,當執(zhí)行call指令 時,獲取到其入棧地址并將其存入集合A ;在執(zhí)行ret指令時,判斷其返回地址是否在集合A 中,如果不在,則判定該函數存在棧溢出。
[0009] 測試軟件:被測軟件啟動之后的運行部分; 在本發(fā)明中,定義了一個集合,利用程序插粧執(zhí)行測試軟件;當執(zhí)行call指令時,獲取 到其入棧地址并將其存入集合A ;在執(zhí)行ret指令時,判斷其返回地址是否在集合A中,如 果不在,則判定該函數存在棧溢出。該方法主要包括以下步驟: 51 :建立集合A,啟動測試軟件開始運行; 52 :通過程序插粧進行指令解析,根據監(jiān)測程序的設置獲取測試軟件執(zhí)行的指令與運 行信息,判定是否是轉移類指令或程序結束指令,是程序結束指令則檢測結束; 53 :判定程序轉移類指令,如果為call指令,則獲取其入口地址,如果為ret指令,則轉 到步驟S5 ; 54 :將入口地址存入集合A中,轉到步驟S2 ;判斷其返回地址是否存在集合A中,如果 是,則轉到步驟Sl,如果不是,則發(fā)生棧溢出,檢測結束。
[0010] S5 :獲取返回地址及其詳細信息; S6 :與集合A中的地址進行比較,判斷返回地址是否存在集合A中,如果是,則轉到步驟 S2,如果不是,則發(fā)生棧溢出,檢測結束; 在本發(fā)明中,檢測call指令從插粧返回的運行信息中提取到的入口地址都保存到集 合中,檢測ret指令獲得返回地址后,直接判定返回地址是否在集合中,命中則正常,沒命 中則表示發(fā)生了棧溢出現象。
[0011] 在本發(fā)明中,不要求返回地址必須與入棧地址一一對應,能夠對各種復雜函數進 行檢測,具有更好的適應性。
[0012] 本發(fā)明同現有技術相比,其有益效果表現在: 一、 判定邏輯簡單,探測獲取入口位置添加到集合中,探測獲取返回位置,然后判定是 否在集合中,來判定是否發(fā)生了棧溢出,執(zhí)行效率高; 二、 插粧技術是二進制分析框架,通過插粧技術在目標代碼中進行代碼插入,由于目標 代碼的格式主要和操作系統(tǒng)相關,和具體的編程語言及版本無關,因此我們的分析方法即 使在無源碼的各類商用軟件上也能得到應用; 三、 本發(fā)明不強制要求函數出口與入口一一對應,能夠適應幾乎所有函數調用方式。例 如,在大多數時候,外部函數的調用是嵌套的,本發(fā)明也能夠處理嵌套的外部函數。
【附圖說明】
[0013] 圖1是本發(fā)明的總體架構圖; 圖2為本發(fā)明的溢出檢測流程圖。
【具體實施方式】
[0014] 下面將結合附圖及【具體實施方式】對本發(fā)明作進一步的描述。 實施例
[0015] 在本發(fā)明中,使用intel公司開發(fā)的用于程序測試的一款工具軟件Pin,它是一款 動態(tài)二進制分析框架,可以用于構建強大的動態(tài)程序分析工具,支持32位、64位的Linux和 Windows的可執(zhí)行程序,可以檢測程序運行過程中的