基於ebp構造的棧棧幀內容保護方法
2023-06-13 04:29:11 2
基於ebp構造的棧棧幀內容保護方法
【專利摘要】一種基於ebp構造的棧棧幀內容保護方法,包括1、初始化的步驟;2、當函數調用發生時,保存當前ebp寄存器數值,並更改其值為指向page所在內存頁的步驟;3、在被調用函數執行期間,捕獲其對ebp鏈的定位操作並對被調用函數所定位的棧幀提供保護的步驟;4、被調用函數執行完成返回時,查看棧幀內容和恢復的步驟。本發明中,被調用函數對棧中的棧幀定位操作被透明地重定向到影子棧幀中,被調用函數在隨後針對目標棧幀的任何修改操作都將在影子棧幀中完成,實現了對原有棧幀的保護。同時,在被調用函數返回時,將原有棧幀同影子棧幀內容進行比較,可以確定被調用函數更改了系統中的哪些棧幀內容,為分析被調用函數的棧幀行為提供支持。
【專利說明】基於ebp構造的棧棧幀內容保護方法
【技術領域】
[0001]本發明涉及計算機系統安全【技術領域】,具體來講是一種基於ebp構造的棧棧幀內容保護方法。
【背景技術】
[0002]棧保存著程序在運行過程中產生的數據以及用於函數調用與返回的控制信息,x86架構下,相同特權級內的函數調用不會引起棧切換,使得棧在發起調用的函數(調用者,caller)與被調用函數(被調用者,callee)之間共享。當被調用函數在執行時,調用者運行所需數據已經存在於棧內,被調用者則可輕易獲取並修改這些信息。
[0003]在基於ebp (extended base pointer,拓展基址指針寄存器)構造的棧中,每一次函數調用都產生一個棧幀(stack frame),棧幀中保存著該次函數調用對應參數、返回地址以及該函數在運行過程中產生的數據。各個棧幀通過ebp連通,形如單向鍊表,鍊表表頭由當前ebp寄存器指定。如圖1所示,包含三個函數棧幀A、B和C,所示函數調用順序為函數C調用函數B,函數B調用函數A,系統當前正在運行函數A中的代碼。當前ebp寄存器保存著棧幀A中的[ebp]所在地址([ebp]表示壓入棧中的ebp寄存器,參照圖1箭頭I所示),A.[ebp]則記錄著B.[ebp]所在地址,B.[ebp]中保存著C.[ebp]所在棧中的地址,形成形如ebp_>A.[ebp]->B.[ebp]->C.[epp]的單向ebp鏈。函數A對應棧巾貞為系統中的最新棧幀,函數A中的代碼便可通過上述關係去遍歷當前系統中的所有棧幀,繼而讀取甚至修改各個棧幀的內容。
[0004]當前針對系統棧的保護主要集中在防護緩衝區溢出(buffer overflow)和ROP(面向返回地址編程,return oriented programming)攻擊上,而忽略了棧巾貞內容本身的安全性。
【發明內容】
[0005]本發明的目的是提供一種基於ebp構造的棧棧幀內容保護方法,通過監控系統棧中的已有ebp鏈,繼而攔截並修改被調用函數對棧幀所進行的定位操作,使得被調用函數定位到錯誤的內存處,達到對原有棧幀的保護。
[0006]實現本發明目的的技術方案如下:一種基於ebp構造的棧棧幀內容保護方法,包括
初始化的步驟,包括
1.1向內核申請一個內存頁,其首地址記為page ;
1.2將page對應頁表項標記為不存在;
當函數調用發生時,保存當前ebp寄存器數值,並更改其值為指向page所在內存頁的步驟,包括
2.1產生一個計數器i,初值賦為O ;
2.2當函數調用發生時,保存當前ebp寄存器數值為ebp_old,更改當前ebp寄存器數值為 ebp_new,使得 ebp_new = page + i ;
在被調用函數執行期間,捕獲其對ebp鏈的定位操作並對被調用函數所定位的棧幀提供保護的步驟,包括
3.1若被調用函數通過ebp鏈去定位系統之前的已有棧幀,則觸發缺頁中斷;否則,等待函數調用返回;
3.2在缺頁中斷處理中,判斷CR2寄存器數值是否等於ebp_new ;若相等,則根據ebp_new數值計算其相對於page的偏移量i = ebp_new - page ;若不相等,則等待函數調用返回;
3.3拷貝棧幀frame_i的內容到其它內存處形成影子棧幀frame_i_shadow ;
3.4累加計數器i,即i = i + I ;
3.5 將 page + i 賦值給 frame_i_shadow.[ebp];
3.6通過指令模擬操作,將被調用函數對上述棧幀的定位操作重定向到frame_i_shadow, [ebp]所在地址處,形成虛擬ebp鏈;
3.7轉步驟3.1 ;
被調用函數執行完成返回時,查看棧幀內容和恢復的步驟,包括
4.1比較各個影子棧幀frame_i_shadow與原有棧幀frame」的內容,查看其內容是否被更改;
4.2將保存的ebp_old數值恢復到當前 ebp寄存器中。
[0007]進一步地,所述指令模擬操作包括:
分析當前被調用函數觸發缺頁的指令,將其中尋址內存地址ebp_new處的操作數改為尋址地址frame_i_shadow.[ebp],再模擬出修改後的臨時指令;
將返回地址數值改為指向當前被調用函數觸發缺頁的指令的下一條指令所在地址。
[0008]本發明的有益效果在於:被調用函數對棧中的棧幀定位操作被透明地重定向到影子棧幀中,被調用函數在隨後針對目標棧幀的任何修改操作都將在影子棧幀中完成,不會影響到系統中原有棧幀的安全,實現了對原有棧幀的保護。同時,在被調用函數返回時,將原有棧幀同影子棧幀內容進行比較,可以確定被調用函數更改了系統中的哪些棧幀內容,為分析被調用函數的棧幀行為提供支持。
【專利附圖】
【附圖說明】
[0009]圖1是基於ebp構造的棧結構示意圖。
[0010]圖2是本發明的流程圖。
[0011]圖3是壓入棧中被修改的ebp寄存器的示意圖。
[0012]圖4是拷貝棧幀的內容形成影子棧幀的示意圖。
[0013]圖5是虛擬ebp鏈的形成示意圖。
[0014]圖6是兩次定位操作產生的虛擬ebp鏈的示意圖。
【具體實施方式】
[0015]本發明的總體思路是:當函數調用發生時,更改當前ebp寄存器數值,使其指向系統中一個不存在的內存頁。被更改後的ebp會被系統壓入到棧中形成[ebp],若被調用函數通過ebp鏈定位系統已有棧幀,則會觸發缺頁異常。在缺頁異常中將被調用函數定位的棧幀內容拷貝到其它內存地址處形成影子棧幀,通過指令模擬技術將被調用函數的棧幀定位操作重定向到影子棧幀中。
[0016]下面結合附圖具體描述本發明的實施方式。
[0017]如圖2所示,基於ebp構造的棧棧幀內容保護方法,包括 1、初始化的步驟,包括
1.1向內核申請一個內存頁,其首地址記為page ;
1.2將page對應頁表項標記為不存在;
上述初始化的步驟,申請page內存頁用於引發缺頁中斷。
[0018]2、當函數調用發生時,保存當前ebp寄存器數值,並更改其值為指向page所在內存頁的步驟,包括
2.1產生一個計數器i,初值賦為O ;計數器i用於標記系統中的棧幀。
[0019]2.2當函數調用發生時,保存當前ebp寄存器數值為ebp_old,更改當前ebp寄存器數值為ebp_new,使得ebp_new = page + i ;該值隨後會被壓入棧中,如圖3中棧幀A所
/Jn ο
[0020]3、在被調用函數執行期間,捕獲其對ebp鏈的定位操作並對被調用函數所定位的棧幀提供保護的步驟,包括
3.1若被調用函數通過ebp鏈`去定位系統之前的已有棧幀,則觸發缺頁中斷;否則,等待函數調用返回;如圖3所示,此時,原有ebp鏈已經斷裂,page所在內存頁在頁表項中被標記為不存在,引用I處的[ebp]去定位棧B會觸發缺頁中斷。
[0021]3.2在缺頁中斷處理中,判斷CR2寄存器數值是否等於ebp_neW ;若相等,則根據ebp_new數值計算其相對於page的偏移量i = ebp_new - page ;若不相等,貝U等待函數調用返回;其中,CR2為頁故障線性地址寄存器,用來保存最近一次出現頁故障時的虛擬地址。
[0022]3.3拷貝棧幀frame_i的內容到其它內存處形成影子棧幀frame_i_shadow ;如圖
4所示,拷貝棧幀B的內容,形成影子棧幀frame_B_shadow。
[0023]3.4累加計數器i,即i = i + I ;
3.5 將 page + i 賦值給 frame_i_shadow.[ebp];
3.6通過指令模擬操作,將被調用函數對上述棧幀的定位操作重定向到frame_i_shadow, [ebp]所在地址處,形成虛擬ebp鏈;如圖5所示,重定向被調用函數的棧幀定位操作到影子棧幀中,形成一個虛擬的ebp鏈,如箭頭2所示。箭頭I處的內容並不實際指向frame_B_shadow,通過重定向操作,使得被調用函數感覺存在箭頭2所示的指向關係,即讓當前棧幀的前一個棧幀看起來是frame_B_shadow。
[0024]其中,指令模擬(Instructionsimulation,參見維基百科http://en.wikipedia.0rg/wiki/Instruction_set_simulator))包括:1、分析當前被調用函數觸發缺頁的指令,將其中尋址內存地址ebp_new處的操作數改為尋址地址frame_i_shadow.[ebp],再模擬出修改後的臨時指令;2、將返回地址數值改為指向當前被調用函數觸發缺頁的指令的下一條指令所在地址。此處的返回地址指等缺頁中斷執行完成後,用於返回被調用函數的地址。
[0025]3.7 轉步驟 3.1 ;如圖6所示,被調用函數通過frame_B_shadow繼續定位之前棧幀C,產生一個新的影子棧中貞 frame_C_shadow,形成 A--->frame_B_shadow--->frame_C_shadow 的虛擬棧幀關係。
[0026]4、被調用函數執行完成返回時,查看棧幀內容和恢復的步驟,包括
4.1比較各個影子棧幀frame_i_shadow與原有棧幀frame」的內容,查看其內容是否被更改;這裡,將原有棧幀同影子棧幀內容進行比較,可以確定被調用函數更改了系統中的哪些棧幀內容,為分析被調用函數的棧幀行為提供支持。
[0027]4.2將保存 的ebp_old數值恢復到當前ebp寄存器中。
【權利要求】
1.一種基於ebp構造的棧棧幀內容保護方法,其特徵在於,包括 初始化的步驟,包括 1.1向內核申請一個內存頁,其首地址記為page ; 1.2將page對應頁表項標記為不存在; 當函數調用發生時,保存當前ebp寄存器數值,並更改其值為指向page所在內存頁的步驟,包括 2.1產生一個計數器i,初值賦為O ; 2.2當函數調用發生時,保存當前ebp寄存器數值為ebp_old,更改當前ebp寄存器數值為 ebp_new,使得 ebp_new = page + i ; 在被調用 函數執行期間,捕獲其對ebp鏈的定位操作並對被調用函數所定位的棧幀提供保護的步驟,包括 3.1若被調用函數通過ebp鏈去定位系統之前的已有棧幀,則觸發缺頁中斷;否則,等待函數調用返回; 3.2在缺頁中斷處理中,判斷CR2寄存器數值是否等於ebp_new ;若相等,則根據ebp_new數值計算其相對於page的偏移量i = ebp_new - page ;若不相等,則等待函數調用返回; 3.3拷貝棧幀frame_i的內容到其它內存處形成影子棧幀frame_i_shadow ; 3.4累加計數器i,即i = i + I ;
3.5 將 page + i 賦值給 frame_i_shadow.[ebp]; 3.6通過指令模擬操作,將被調用函數對上述棧幀的定位操作重定向到frame_i_shadow, [ebp]所在地址處,形成虛擬ebp鏈; 3.7轉步驟3.1 ; 被調用函數執行完成返回時,查看棧幀內容和恢復的步驟,包括 4.1比較各個影子棧幀frame_i_shadow與原有棧幀frame」的內容,查看其內容是否被更改; 4.2將保存的ebp_old數值恢復到當前ebp寄存器中。
2.根據權利要求1所述的基於ebp構造的棧棧幀內容保護方法,其特徵在於,所述指令模擬操作包括 分析當前被調用函數觸發缺頁的指令,將其中尋址內存地址ebp_new處的操作數改為尋址地址frame_i_shadow.[ebp],再模擬出修改後的臨時指令; 將返回地址數值改為指向當前被調用函數觸發缺頁的指令的下一條指令所在地址。
【文檔編號】G06F21/78GK103870767SQ201410102934
【公開日】2014年6月18日 申請日期:2014年3月19日 優先權日:2014年3月19日
【發明者】陳興蜀, 李輝, 張磊, 王文賢, 鄭炳倫 申請人:四川大學