亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

基于模擬棧和線程注入的一種ROP攻擊棧溢出防護方法與流程

文檔序號:11177640閱讀:1479來源:國知局
基于模擬棧和線程注入的一種ROP攻擊棧溢出防護方法與流程

本發(fā)明涉及rop攻擊防護技術(shù)領(lǐng)域,具體涉及基于模擬棧和線程注入的一種rop攻擊棧溢出防護方法。



背景技術(shù):

rop(return-orientedprogramming)是一種基于代碼復(fù)用技術(shù)的新型攻擊,攻擊者供已有的庫或可執(zhí)行文件中提取指令片段、構(gòu)建惡意代碼。

seh(structuredexceptionhandling)seh("structuredexceptionha-ndling"),即結(jié)構(gòu)化異常處理是(windows)操作系統(tǒng)提供給程序設(shè)計者的強有力的處理程序錯誤或異常的武器。

sehop(sehoverwriteprotection)sehop的全稱是structuredexcept-ionhandleroverwriteprotection(結(jié)構(gòu)化異常處理覆蓋保護),seh攻擊是指通過棧溢出或者其他漏洞,使用精心構(gòu)造的數(shù)據(jù)覆蓋結(jié)構(gòu)化異常處理鏈表上面的某個節(jié)點或者多個節(jié)點,從而控制eip(控制程序執(zhí)行流程)。而sehop則是是微軟針對這種攻擊提出的一種安全防護方案。

在操作系統(tǒng)和編譯器的保護下,程序的棧是不可運行的、棧的位置是隨機的,增大了棧溢出攻擊的難度。但如果程序的加載位置是固定的或者程序中存在加載到固定位置的可執(zhí)行代碼,攻擊者就可以利用這些固定位置上的代碼來實施他的攻擊,rop惡意代碼不包含任何指令,將自己的惡意代碼隱藏在正常代碼中。因而,它可以繞過傳統(tǒng)的棧溢出防御技術(shù)。



技術(shù)實現(xiàn)要素:

針對上述現(xiàn)有技術(shù),本發(fā)明目的在于提供基于模擬棧和線程注入的一種rop攻擊棧溢出防護方法,解決了現(xiàn)有技術(shù)由于程序加載位置固定導(dǎo)致不具有指令的rop惡意代碼能夠繞過棧溢出防護技術(shù)問題,以及解決了在利用模擬棧監(jiān)控目標(biāo)進程時所使用的遠程線程注入造成目標(biāo)進程中出現(xiàn)棧溢出的技術(shù)問題。

為達到上述目的,本發(fā)明采用的技術(shù)方案如下:

本方案主要利用線程注入到目標(biāo)進程(所保護的進程),開辟一個模擬??臻g,監(jiān)控模擬目標(biāo)進程的指令流程,通過獲取rop攻擊的call和ret指令間的有效代碼串連,在模擬棧上執(zhí)行,再使用傳統(tǒng)的溢出防護機制(如windows的緩沖區(qū)安全監(jiān)測機制,gs)檢測模擬棧上是否存在棧溢出,從而對rop攻擊棧溢出漏洞的防護。

基于模擬棧和線程注入的一種rop攻擊棧溢出防護方法,包括以下步驟:

步驟1、對目標(biāo)進程注入遠程線程,通過遠程線程獲得目標(biāo)進程的指令流;

步驟2、通過目標(biāo)進程函數(shù)的調(diào)用特征提取算法將指令流與受信的特征數(shù)據(jù)庫進行比對,獲得存在異常調(diào)用的指令序列;

步驟3、構(gòu)建模擬棧并完成指令序列的拼接,然后在模擬棧中壓入拼接的指令序列和金絲雀值,再利用函數(shù)進行模擬棧的指令調(diào)用,在函數(shù)進行返回前檢測指令調(diào)用過程中金絲雀值,獲得檢測結(jié)果;

步驟4、根據(jù)檢測結(jié)果通過遠程線程回調(diào)控制目標(biāo)進程的啟停,并由檢測結(jié)果選擇地輸出模擬棧上rop攻擊代碼和溢出點。

上述方法中,所述的步驟1,還包括以下步驟:

步驟1.1、獲得目標(biāo)進程的句柄,用遠程進程根據(jù)句柄索引出目標(biāo)進程;

步驟1.2、在遠程進程中開辟出一段內(nèi)存并根據(jù)目標(biāo)進程動態(tài)鏈接庫名稱長度確定內(nèi)存區(qū)間,在該內(nèi)存中寫入動態(tài)鏈接庫的名稱;

步驟1.3、使用庫加載函數(shù)和遠程線程創(chuàng)建函數(shù)根據(jù)動態(tài)鏈接庫的名稱創(chuàng)建出遠程線程;

步驟1.4、關(guān)閉目標(biāo)進程的句柄,再通過遠程線程獲得目標(biāo)進程的指令流。

上述方法中,所述的步驟2,其中,對call指令和ret指令之間的指令流進行比對。

上述方法中,所述的步驟1.3,注入遠程線程時,結(jié)合遠程線程創(chuàng)建函數(shù)參數(shù)使用/stack開關(guān)指明已提交的堆棧大小值,重載向堆棧所提交地址空間的內(nèi)存數(shù)量,實質(zhì)并顯著地避免了所使用的遠程線程注入造成目標(biāo)進程中出現(xiàn)棧溢出。

上述方法中,所述的步驟1.3,注入遠程線程時,將遞歸類函數(shù)去除遞歸特征并將局部對象改為靜態(tài)局部對象,實質(zhì)并顯著地避免了所使用的遠程線程注入造成目標(biāo)進程中出現(xiàn)棧溢出。

上述方法中,所述的步驟4,啟停操作,已知目標(biāo)進程名或進程id的情況下,linux下可以直接通過調(diào)用system函數(shù)運行kill進程id命令停止目標(biāo)進程,windows下可使用powershell,原理類似;已知目標(biāo)進程可執(zhí)行文件位置的情況下,linux下可以直接通過system函數(shù)運行./file_position啟動目標(biāo)進程,windows下可使用powershell,原理類似。

與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果:

利用線程注入到目標(biāo)進程(要保護的進程),開辟一個模擬??臻g,監(jiān)控模擬目標(biāo)進程的指令流程,通過獲取rop攻擊的call和ret指令間的有效代碼串連,在模擬棧上執(zhí)行,再使用傳統(tǒng)的溢出防護機制,從而達到檢測rop攻擊的目的,而本領(lǐng)域技術(shù)中,不同程序模塊之間(特別是共享函數(shù)庫的模塊)數(shù)據(jù)的結(jié)構(gòu)是相同的,在不破壞數(shù)據(jù)情況下不能對一個結(jié)構(gòu)中的數(shù)據(jù)進行重新排布,緩沖后在一個結(jié)構(gòu)中的任何數(shù)據(jù)是不可能使用金絲雀值檢測的方法進行防護的,因此本發(fā)明通過模擬棧重新排布數(shù)據(jù)并加入金絲雀值,從而克服了現(xiàn)有技術(shù)由于數(shù)據(jù)結(jié)構(gòu)限制而不能對結(jié)構(gòu)中數(shù)據(jù)的棧溢出進行防護的技術(shù)壁壘;

本發(fā)明不影響原程序的最終構(gòu)成,以外部線程注入監(jiān)控目標(biāo)程序的運行,不用改變現(xiàn)有的棧溢出防護機制;

本發(fā)明具有較好的準確性,模擬棧的設(shè)計可充分利用現(xiàn)有的多種棧溢出檢測機制,從而提高準確性;

本發(fā)明具有較大的適用性,程序的防護和程序的運行具有較大的獨立性,因而可適用于多種類型的軟件程序。

附圖說明

圖1為本發(fā)明的模塊示意圖;

圖2為寄存器指向堆棧示意圖;

圖3為函數(shù)調(diào)用源碼示意圖;

圖4為堆棧結(jié)構(gòu)示意圖;

圖5為監(jiān)控窗口示意圖;

圖6為執(zhí)行strcpy后的監(jiān)控窗口示意圖。

具體實施方式

本說明書中公開的所有特征,或公開的所有方法或過程中的步驟,除了互相排斥的特征和/或步驟以外,均可以以任何方式組合。

下面結(jié)合附圖對本發(fā)明做進一步說明:

棧溢出漏洞的原理

1)關(guān)于棧,程序的堆棧是由處理器直接支持,在interx86的系統(tǒng)中,堆棧在內(nèi)存中是從高地址向低地址擴展,如圖2:

與堆棧操作相關(guān)的兩個寄存器是ebp和esp,esp總是指向堆棧棧頂,push時,esp-4,然后拷貝數(shù)據(jù)到esp指向的地址,pop時先把esp指向的數(shù)據(jù)拷貝到內(nèi)存地址或寄存器,然后esp+4,棧中存儲了函數(shù)的參數(shù),函數(shù)的局部變量,調(diào)用函數(shù)前寄存器的值,函數(shù)的返回地址以及用于結(jié)構(gòu)化異常處理的數(shù)據(jù),ebp寄存器用于訪問堆棧中的數(shù)據(jù),函數(shù)的參數(shù)地址比ebp的值高,函數(shù)局部變量的地址比ebp的值低,因而可通過ebp與偏移地址來訪問,下面是一組函數(shù)調(diào)用和它的堆棧結(jié)構(gòu)圖;

ebp寄存器的值總是指向先前的ebp,這樣就形成了一個函數(shù)調(diào)用鏈,調(diào)試器正是利用這個跟蹤函數(shù)堆棧調(diào)用順序。

2)棧溢出攻擊

實際情景中,攻擊者可以使用待定的腳本語言,通過網(wǎng)絡(luò)遠程向?qū)ν馓峁I(yè)務(wù)的服務(wù)器進行攻擊,利用對棧中數(shù)據(jù)的填充越界,也就是常說的shellcode,實現(xiàn)有效的漏洞攻擊;

下面以一個例子簡要說明棧溢出攻擊:

a.漏洞源碼:

b.源碼說明:在verify_password中,直接將字符串password復(fù)制到buffer中,而沒有檢測password的長度是否超過buffer的大小,因而數(shù)據(jù)越界可覆蓋返回地址,造成棧溢出攻擊;

c.調(diào)試跟蹤查看驗證:strcpy執(zhí)行前的返回地址為0x004109e8,strcpy執(zhí)行后,返回地址被password變量超出的部分覆蓋為0x77d456f7(jmpesp的地址),而jmpesp后正是注入的功能代碼,此處作演示目的彈出一個messagebox。

3)現(xiàn)有的棧溢出防護機制

棧溢出典型的攻擊行為主要有以下三種:

a.修改相鄰數(shù)據(jù)

b.修改函數(shù)返回地址

c.修改seh(structuredexceptionhandling)

現(xiàn)有棧溢出防護機制:

a.棧不可執(zhí)行機制:操作系統(tǒng)利用cpu硬件的特性,將棧段代碼設(shè)置為不可執(zhí)行;

b.windows的緩沖區(qū)安全監(jiān)測機制(gs):gs會在函數(shù)調(diào)用前往函數(shù)棧幀內(nèi)壓入一個隨機數(shù)(canary),然后等函數(shù)返回前,會對canary進行核查,判斷canary是否被修改,因為canary的地址是(前棧幀ebp-4),所以如果溢出攻擊想要覆蓋返回地址或者異常處理句柄的話,就會路過canary,系統(tǒng)檢測到canary被修改之后,在函數(shù)返回前就會直接終止程序;

c.內(nèi)存布局隨機化機制

內(nèi)存布局隨機化就是將程序的加載位置、堆棧位置以及動態(tài)鏈接庫的映射位置隨機化,這樣攻擊者就無法知道程序的運行代碼和堆棧上變量的地址。

本發(fā)明利用線程注入到目標(biāo)進程(要保護的進程),開辟一個模擬??臻g,監(jiān)控模擬目標(biāo)進程的指令流程,通過獲取rop攻擊的call和ret指令間的有效代碼串連,在模擬棧上執(zhí)行,再使用傳統(tǒng)的溢出防護機制,從而達到檢測rop攻擊的目的。

實施例1

1.rop攻擊防護系統(tǒng)利用遠程線程注入到目標(biāo)進程

使用dll遠程注入技術(shù):

1)openprocess獲得要注入進程的句柄;

2)virtualallocex在遠程進程中開辟出一段內(nèi)存,長度為strlen(dllname)+1;

3)writeprocessmemory將dll的名字寫入第二步開辟出的內(nèi)存中;

4)createremotethread將loadlibrarya作為線程函數(shù),參數(shù)為dll的名稱,創(chuàng)建新線程;

5)closehandle關(guān)閉線程句柄。

2.監(jiān)控目標(biāo)進程的指令流程獲取call和ret間的指令

注入的線程可模仿ollydbg附加監(jiān)控目標(biāo)進程,從而獲取程序執(zhí)行指令。

3.比對正常函數(shù)調(diào)用的特征指令,提取疑似異常的指令序列

設(shè)計特征提取算法,建立正常函數(shù)調(diào)用的特征數(shù)據(jù)庫,比對獲取的異常調(diào)用間的指令序列。

4.模擬棧嘗試指令序列的多種拼接方案,試運行,嘗試拼接,開啟試運行線程,可能的匯編實現(xiàn):

__asm{

leaeax,simulation_stack//模擬棧首地址

pusheax

ret//將simulation_stack的地址pop到eip,從而執(zhí)行模擬棧的可疑指令序列

}。

5.傳統(tǒng)檢測機制檢測模擬棧的運行情況

這里可借鑒windows的緩沖區(qū)安全監(jiān)測機制(gs),往模擬棧壓入一個canary,然后等函數(shù)返回前,會對canary進行核查,判斷canary是否被修改,從而判斷是否發(fā)生rop攻擊。

6.根據(jù)檢測結(jié)果回調(diào)控制目標(biāo)進程的啟停,并輸出模擬棧上的rop攻擊代碼與溢出點。

以上所述,僅為本發(fā)明的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何屬于本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1