軟件逆向工程原理與實(shí)踐課件:ROP攻擊_第1頁(yè)
軟件逆向工程原理與實(shí)踐課件:ROP攻擊_第2頁(yè)
軟件逆向工程原理與實(shí)踐課件:ROP攻擊_第3頁(yè)
軟件逆向工程原理與實(shí)踐課件:ROP攻擊_第4頁(yè)
軟件逆向工程原理與實(shí)踐課件:ROP攻擊_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ROP攻擊9.1ROP攻擊的發(fā)展9.2ROP攻擊的變種9.3思考與練習(xí)

9.1ROP攻擊的發(fā)展

利用緩沖區(qū)溢出漏洞進(jìn)行攻擊變得日益普遍,這是因?yàn)榫彌_區(qū)溢出漏洞具有極大的破壞力和隱蔽性,它可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)死機(jī)或重啟。更為嚴(yán)重的是,攻擊者可以利用它執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)的超級(jí)特權(quán),進(jìn)行各種非法操作。而利用緩沖區(qū)溢出漏洞的攻擊包括多種類型,其中就包括了注入代碼型與代碼重用型攻擊。由此發(fā)展的多種攻擊有緩沖區(qū)溢出攻擊、格式化字符串漏洞攻擊、return-into-libc攻擊和ROP攻擊等。

1.緩沖區(qū)溢出攻擊

緩沖區(qū)溢出攻擊是幾種最常見(jiàn)的利用程序缺陷實(shí)施攻擊的方法之一。

緩沖區(qū)溢出是指當(dāng)程序向緩沖區(qū)內(nèi)填充數(shù)據(jù)時(shí),數(shù)據(jù)長(zhǎng)度超過(guò)了緩沖區(qū)本身的容量,溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上。理想的情況是:程序會(huì)檢查數(shù)據(jù)長(zhǎng)度,不允許輸入長(zhǎng)度超過(guò)緩沖區(qū)長(zhǎng)度。但是絕大多數(shù)程序都會(huì)假設(shè)數(shù)據(jù)長(zhǎng)度總是與所分配的儲(chǔ)存空間相匹配,這就為緩沖區(qū)溢出創(chuàng)造了條件。

緩沖區(qū)溢出漏洞具有極大的破壞力和隱蔽性。緩沖區(qū)溢出攻擊的隱蔽性主要表現(xiàn)在:

(1)一般程序員很難發(fā)覺(jué)自己編寫的程序中存在緩沖區(qū)溢出漏洞,從而疏忽檢測(cè);

(2)攻擊者所發(fā)送的溢出字符串在形式上跟普通的字符串幾乎無(wú)區(qū)別,傳統(tǒng)的防御工具(如防火墻)不會(huì)認(rèn)為其為非法請(qǐng)求,從而不會(huì)進(jìn)行阻攔;

(3)通過(guò)緩沖區(qū)溢出注入的ShellCode代碼執(zhí)行時(shí)間一般較短,在執(zhí)行中系統(tǒng)不一定報(bào)告錯(cuò)誤,并且可能不會(huì)影響到正常程序的運(yùn)行;

(4)攻擊者通過(guò)緩沖區(qū)溢出改變程序執(zhí)行流程,使ShellCode代碼能夠執(zhí)行本來(lái)不被允許或沒(méi)有權(quán)限的操作,而防火墻認(rèn)為其是合法的;

(5)攻擊的隨機(jī)性和不可預(yù)測(cè)性使得防御攻擊變得異常艱難,在沒(méi)有攻擊時(shí),存在漏洞的程序并不會(huì)有什么變化(這和木馬有著本質(zhì)的區(qū)別),這也是緩沖區(qū)溢出很難被發(fā)現(xiàn)的原因;

(6)緩沖區(qū)溢出漏洞的普遍存在,使得針對(duì)這種漏洞的攻擊防不勝防(各種補(bǔ)丁程序也可能存在著這種漏洞)。

在緩沖區(qū)溢出攻擊中,顧名思義,就是利用緩沖區(qū)溢出的方式,攻擊者可以將自己的數(shù)據(jù)寫到內(nèi)存的任何地方。

例如,StackGuard是一種較早的防御緩沖區(qū)溢出攻擊的方法。它會(huì)在函數(shù)調(diào)用棧寫入返回地址的時(shí)候,加入一個(gè)叫canary的值,當(dāng)函數(shù)調(diào)用結(jié)束返回時(shí),程序會(huì)檢測(cè)這個(gè)canary,如果這個(gè)值被修改了,則系統(tǒng)會(huì)檢測(cè)到緩沖區(qū)溢出攻擊,然后系統(tǒng)會(huì)通知安全軟件,并終止該進(jìn)程。canary的值采用隨機(jī)數(shù)模式,可以防御大部分的攻擊,但它也不是絕對(duì)安全的,攻擊者仍然可以通過(guò)不覆蓋canary的方式來(lái)改寫返回地址的值。

PointGuard是另一種防御緩沖區(qū)溢出攻擊的防御方法。它利用一種加密方法將存入內(nèi)存的地址(數(shù)據(jù))加密,并且只有當(dāng)內(nèi)存中的值被載入寄存器時(shí)才進(jìn)行解密操作。這樣,在不知道加密方法的情況下,即使棧中的地址(數(shù)據(jù))被修改了,但是通過(guò)密鑰解密以后的地址,被解密為隨機(jī)的地址,從而不會(huì)去執(zhí)行攻擊者的惡意代碼。但是,如果攻擊者通過(guò)別的攻擊方式獲得了加密方法,則該防御方式就會(huì)失效。

2.return-into-libc攻擊

return-into-libc攻擊是在緩沖區(qū)溢出攻擊原理的基礎(chǔ)上發(fā)展而來(lái)的,它包含有緩沖區(qū)溢出攻擊精髓的部分,同時(shí)還在一定程度上解決了緩沖區(qū)溢出攻擊的不足之處。最早的緩沖區(qū)溢出攻擊需要在漏洞程序中添加惡意代碼ShellCode,只有執(zhí)行這些惡意代碼,才能達(dá)到攻擊者的攻擊目的。

return-into-libc攻擊就是一種不需要對(duì)緩沖區(qū)同時(shí)寫和執(zhí)行(或者先寫后執(zhí)行)的攻擊方式,它只需要通過(guò)緩沖區(qū)溢出來(lái)篡改跳轉(zhuǎn)地址,然后將程序引導(dǎo)到系統(tǒng)中已存在的動(dòng)態(tài)函數(shù)庫(kù)當(dāng)中,去執(zhí)行函數(shù)庫(kù)中已有的函數(shù)代碼來(lái)達(dá)到攻擊的目的。

盡管return-into-libc攻擊繞過(guò)了WX(WXORX)防御,但是相比于注入代碼型攻擊,它卻有了更多限制,主要表現(xiàn)在兩個(gè)方面:

(1)在一個(gè)return-into-libc攻擊中,攻擊者只能調(diào)用庫(kù)函數(shù),當(dāng)一個(gè)函數(shù)執(zhí)行完,繼續(xù)調(diào)用下一個(gè)函數(shù),而不能像注入代碼型攻擊一樣,可以調(diào)用注入的任意代碼;

(2)在return-into-libc攻擊中,攻擊者只能調(diào)用程序代碼段或者函數(shù)庫(kù)中存在的函數(shù),所以通過(guò)將某一個(gè)或幾個(gè)關(guān)鍵函數(shù)(例如system()函數(shù))從函數(shù)庫(kù)中移除,可以限制攻擊者的攻擊行為。

而ROP攻擊不要求調(diào)用函數(shù)庫(kù)中的函數(shù),而是對(duì)有用指令序列進(jìn)行任意組合,加大了其攻擊能力,所以通過(guò)移除庫(kù)函數(shù)的方法來(lái)限制攻擊者的行為,對(duì)ROP攻擊是不起作用的。

3.ROP攻擊

ROP全稱為Return-OrientedProgrammming(面向返回的編程),是一種新型的基于代碼重用技術(shù)的攻擊。它是在return-into-libc攻擊的基礎(chǔ)上發(fā)展而來(lái),但更復(fù)雜、功能更強(qiáng)大的非注入代碼型攻擊。return-into-libc攻擊通常只能跳轉(zhuǎn)到動(dòng)態(tài)函數(shù)庫(kù)的某個(gè)函數(shù)入口執(zhí)行完整的函數(shù)代碼,而ROP攻擊通過(guò)對(duì)return-into-libc攻擊的進(jìn)一步擴(kuò)展,將return-into-libc攻擊中重用動(dòng)態(tài)庫(kù)函數(shù)的模式修改為重用函數(shù)中代碼片段的形式,可供選擇的范圍更廣,粒度更細(xì),防范的難度也更大。

ROP攻擊的大體思路是攻擊者掃描已有的動(dòng)態(tài)鏈接庫(kù)和可執(zhí)行文件,提取出可以利用的指令片段(這些指令片段被稱為gadget)。

在第一代ROP攻擊中,這些指令片段以ret指令結(jié)尾,即用ret指令實(shí)現(xiàn)指令片段執(zhí)行流的銜接。操作系統(tǒng)通過(guò)棧來(lái)進(jìn)行函數(shù)的調(diào)用和返回,而函數(shù)的調(diào)用和返回是通過(guò)壓棧和出棧來(lái)實(shí)現(xiàn)的。每個(gè)程序都會(huì)維護(hù)一個(gè)程序運(yùn)行棧,這個(gè)棧為所有函數(shù)共享。每次函數(shù)調(diào)用時(shí),系統(tǒng)會(huì)分配一個(gè)棧幀給當(dāng)前被調(diào)用函數(shù),用于參數(shù)的傳遞、局部變量的維護(hù)、返回地址的填入等。

而ROP攻擊則是利用以ret指令結(jié)尾的程序片段,操作棧的相關(guān)數(shù)據(jù),從而改變程序的執(zhí)行流程,使其去執(zhí)行相應(yīng)的指令片段集(gadgets),實(shí)施攻擊者的預(yù)設(shè)目標(biāo)。ROP攻擊不同于return-into-libc攻擊之處在于,ROP攻擊是利用以ret指令結(jié)尾的函數(shù)代碼片段集,而不是整個(gè)函數(shù)本身去完成預(yù)定的操作。從廣義角度講,return-to-libc攻擊是ROP攻擊的特例。最初,ROP攻擊在x86體系結(jié)構(gòu)下實(shí)現(xiàn),隨后擴(kuò)展到ARM等多種體系結(jié)構(gòu)。由于ROP不需要向被攻擊程序中注入惡意代碼,因而,它可以繞過(guò)W

X的防御技術(shù)。

如圖9-1所示是ROP攻擊模型。

圖9-1ROP攻擊模型

1)加載/存儲(chǔ)(load/store)

(1)加載一個(gè)常數(shù)??梢允褂谩皃op%reg;ret”的指令序列形式。如圖9-2所示是將常數(shù)“0xaabbccdd”加載到寄存器“%eax”中。

(2)從內(nèi)存中加載??梢允褂谩癿ovl32(%edx),%edx;ret”指令序列形式,將內(nèi)存中的內(nèi)容加載到寄存器“%edx”中。

(3)存儲(chǔ)到內(nèi)存??梢允褂谩癿ovl%edx,30(%eax);ret”指令序列形式,將寄存器“%edx”中的內(nèi)容存儲(chǔ)到內(nèi)存中。

圖9-2加載常數(shù)

2)算術(shù)和邏輯運(yùn)算(arithmeticandlogic)

(1)加法??梢允褂谩癮ddl(%eax),%edx;push%edi;ret”的指令序列形式。

(2)減法??梢允褂谩皀eg%edx;ret”的指令序列形式。

(3)異或。可以使用“xorl(%eax),%edx;ret”的指令序列形式。

3)控制流(controlflow)

(1)無(wú)條件跳轉(zhuǎn)。在ROP攻擊中,棧指針(%esp)取代了指令指針(%eip)的作用,來(lái)控制程序的執(zhí)行流程,通過(guò)簡(jiǎn)單的無(wú)條件跳轉(zhuǎn)來(lái)改變“%esp”的值,可以使其指向一個(gè)新的指令集。如圖9-3所示是使用“pop%esp;ret”指令序列,造成的一個(gè)無(wú)限循環(huán)。

(2)條件跳轉(zhuǎn)。條件跳轉(zhuǎn)指令如cmp指令、jcc指令等,由于它們跳轉(zhuǎn)造成的是指令指針(%eip)的改變,所以條件跳轉(zhuǎn)指令在ROP攻擊中用處不大。

圖9-3使用“pop%esp;ret”指令序列的無(wú)限循環(huán)

4)函數(shù)調(diào)用(functioncalls)

在return-into-libc攻擊中,可以通過(guò)從函數(shù)庫(kù)中移除相應(yīng)的函數(shù)限制攻擊的進(jìn)行,但是在ROP攻擊中,卻可以調(diào)用庫(kù)中的任意指令片段,不受限制。

9.2ROP攻擊的變種

由于第一代ROP攻擊精心選擇的指令工具集都以ret指令結(jié)尾,其構(gòu)造的工具集會(huì)包含許多ret指令,這在正常的系統(tǒng)中是不合理的。所以,研究人員提出了一種通過(guò)檢測(cè)系統(tǒng)指令執(zhí)行流程中ret指令調(diào)用的頻繁程度,從而檢測(cè)ROP攻擊的技術(shù)方法。還有的方法通過(guò)改寫內(nèi)核系統(tǒng)中所有的ret指令,使攻擊者無(wú)法找到可用的指令片段構(gòu)造攻擊。而最新的代碼重用型攻擊變種已經(jīng)不再依賴于ret指令,而是改為利用類似的跳轉(zhuǎn)指令(比如間接jmp或“pop+jmp”指令)來(lái)串接指令片段(即gadgets)。

9.2.1非ret指令結(jié)尾的ROP攻擊

第一代ROP攻擊看似完美地解決了注入代碼型攻擊的缺點(diǎn),但實(shí)際上它自身也有很大的缺點(diǎn)。這個(gè)缺點(diǎn)就是每一條指令序列都需要以ret指令結(jié)尾,這樣就導(dǎo)致了在組合成的工具集中含有大量的ret指令,研究人員能夠通過(guò)對(duì)ret指令的使用頻繁程度來(lái)檢測(cè)系統(tǒng)是否遭受到ROP攻擊。

(1)針對(duì)第一個(gè)不同點(diǎn),研究人員建議使用一種檢測(cè)技術(shù)去檢測(cè)指令流中頻繁的ret返回指令。例如,在動(dòng)態(tài)二進(jìn)制指令流的框架下,當(dāng)發(fā)現(xiàn)三個(gè)連續(xù)的指令序列均以ret指令結(jié)尾,而每個(gè)指令序列由五條或少于五條指令組成時(shí),就觸發(fā)一個(gè)警告。

(2)針對(duì)第二個(gè)不同點(diǎn),即使沒(méi)有合法的call調(diào)用指令,攻擊者也能頻繁地使用ret返回指令,這在一個(gè)程序的返回地址棧中違反了last-infirst-out的原理,研究人員建議使用一種方法去檢測(cè)在通過(guò)call調(diào)用指令和ret返回指令的程序中,那些違反了last-infirst-out的棧原理的指令流。

(3)更為徹底的一種防御方法是研究人員將庫(kù)中全部的ret指令消除(或替換),從而可以有效地干預(yù)ROP構(gòu)造攻擊的基礎(chǔ)。

盡管上述防御方法都能很好地防御ROP攻擊,但是攻擊者又提出新的方法來(lái)實(shí)施攻擊,同時(shí)確保不被上述的防御方法探測(cè)到。攻擊者通過(guò)對(duì)防御方法的研究發(fā)現(xiàn),頻繁的ret返回指令調(diào)用使得防御軟件能夠檢測(cè)到攻擊,那么攻擊者通過(guò)開(kāi)發(fā)出不使用返回指令的ROP攻擊就可以跳過(guò)這種防御。由此,一種新的攻擊方式誕生了,它叫做非ret指令結(jié)尾的ROP攻擊,英文名是Return-OrientedProgramming

withoutReturns,它是ROP攻擊的一個(gè)變種。

非ret指令結(jié)尾的ROP攻擊是在指令序列中找到類似返回指令的指令序列來(lái)代替返回指令,就可以使得ROP攻擊不需要使用ret返回指令,從而使得檢測(cè)ret返回指令頻率的防御方式無(wú)效,以達(dá)到越過(guò)防御措施的攻擊方法。

在x86架構(gòu)上,可以使用類似于ret返回指令的指令序列,例如“popreg;jmp*reg”的指令序列。通過(guò)這樣的方式,就不需要頻繁地調(diào)用ret返回指令來(lái)組建工具集,從而使得針對(duì)第一代ROP攻擊的防御方法失效。

如圖9-4所示是非ret指令結(jié)尾的ROP攻擊模型。

圖9-4非ret指令結(jié)尾的ROP攻擊模型

在圖9-4中,Trampoline就是所謂的“更新-加載-轉(zhuǎn)移序列”,它替換了ROP攻擊中的ret返回指令。在被攻擊的目標(biāo)程序或函數(shù)庫(kù)中,找出Trampoline序列,對(duì)于每一個(gè)待執(zhí)行的指令序列,它們都以間接jmp指令結(jié)尾,而每一個(gè)間接jmp指令均指向Trampoline序列,通過(guò)執(zhí)行Trampoline序列可以得到下一個(gè)要執(zhí)行的指令序列。

9.2.2JOP攻擊

JOP攻擊全稱為Jump-OrientedProgramming。

JOP攻擊和ROP攻擊的原理類似,都是在系統(tǒng)的可執(zhí)行代碼中尋找有用的指令片段,而后將其組合成為一套能執(zhí)行某個(gè)特定功能的工具集。不同的地方在于,ROP攻擊使用的指令片段以ret指令結(jié)尾,而JOP攻擊使用的指令片段改為以間接jmp跳轉(zhuǎn)指令為結(jié)尾,并通過(guò)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論