版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
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)的超級特權(quán),進(jìn)行各種非法操作。而利用緩沖區(qū)溢出漏洞的攻擊包括多種類型,其中就包括了注入代碼型與代碼重用型攻擊。由此發(fā)展的多種攻擊有緩沖區(qū)溢出攻擊、格式化字符串漏洞攻擊、return-into-libc攻擊和ROP攻擊等。
1.緩沖區(qū)溢出攻擊
緩沖區(qū)溢出攻擊是幾種最常見的利用程序缺陷實(shí)施攻擊的方法之一。
緩沖區(qū)溢出是指當(dāng)程序向緩沖區(qū)內(nèi)填充數(shù)據(jù)時(shí),數(shù)據(jù)長度超過了緩沖區(qū)本身的容量,溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上。理想的情況是:程序會(huì)檢查數(shù)據(jù)長度,不允許輸入長度超過緩沖區(qū)長度。但是絕大多數(shù)程序都會(huì)假設(shè)數(shù)據(jù)長度總是與所分配的儲(chǔ)存空間相匹配,這就為緩沖區(qū)溢出創(chuàng)造了條件。
緩沖區(qū)溢出漏洞具有極大的破壞力和隱蔽性。緩沖區(qū)溢出攻擊的隱蔽性主要表現(xiàn)在:
(1)一般程序員很難發(fā)覺自己編寫的程序中存在緩沖區(qū)溢出漏洞,從而疏忽檢測;
(2)攻擊者所發(fā)送的溢出字符串在形式上跟普通的字符串幾乎無區(qū)別,傳統(tǒng)的防御工具(如防火墻)不會(huì)認(rèn)為其為非法請求,從而不會(huì)進(jìn)行阻攔;
(3)通過緩沖區(qū)溢出注入的ShellCode代碼執(zhí)行時(shí)間一般較短,在執(zhí)行中系統(tǒng)不一定報(bào)告錯(cuò)誤,并且可能不會(huì)影響到正常程序的運(yùn)行;
(4)攻擊者通過緩沖區(qū)溢出改變程序執(zhí)行流程,使ShellCode代碼能夠執(zhí)行本來不被允許或沒有權(quán)限的操作,而防火墻認(rèn)為其是合法的;
(5)攻擊的隨機(jī)性和不可預(yù)測性使得防御攻擊變得異常艱難,在沒有攻擊時(shí),存在漏洞的程序并不會(huì)有什么變化(這和木馬有著本質(zhì)的區(qū)別),這也是緩沖區(qū)溢出很難被發(fā)現(xiàn)的原因;
(6)緩沖區(qū)溢出漏洞的普遍存在,使得針對這種漏洞的攻擊防不勝防(各種補(bǔ)丁程序也可能存在著這種漏洞)。
在緩沖區(qū)溢出攻擊中,顧名思義,就是利用緩沖區(qū)溢出的方式,攻擊者可以將自己的數(shù)據(jù)寫到內(nèi)存的任何地方。
例如,StackGuard是一種較早的防御緩沖區(qū)溢出攻擊的方法。它會(huì)在函數(shù)調(diào)用棧寫入返回地址的時(shí)候,加入一個(gè)叫canary的值,當(dāng)函數(shù)調(diào)用結(jié)束返回時(shí),程序會(huì)檢測這個(gè)canary,如果這個(gè)值被修改了,則系統(tǒng)會(huì)檢測到緩沖區(qū)溢出攻擊,然后系統(tǒng)會(huì)通知安全軟件,并終止該進(jìn)程。canary的值采用隨機(jī)數(shù)模式,可以防御大部分的攻擊,但它也不是絕對安全的,攻擊者仍然可以通過不覆蓋canary的方式來改寫返回地址的值。
PointGuard是另一種防御緩沖區(qū)溢出攻擊的防御方法。它利用一種加密方法將存入內(nèi)存的地址(數(shù)據(jù))加密,并且只有當(dāng)內(nèi)存中的值被載入寄存器時(shí)才進(jìn)行解密操作。這樣,在不知道加密方法的情況下,即使棧中的地址(數(shù)據(jù))被修改了,但是通過密鑰解密以后的地址,被解密為隨機(jī)的地址,從而不會(huì)去執(zhí)行攻擊者的惡意代碼。但是,如果攻擊者通過別的攻擊方式獲得了加密方法,則該防御方式就會(huì)失效。
2.return-into-libc攻擊
return-into-libc攻擊是在緩沖區(qū)溢出攻擊原理的基礎(chǔ)上發(fā)展而來的,它包含有緩沖區(qū)溢出攻擊精髓的部分,同時(shí)還在一定程度上解決了緩沖區(qū)溢出攻擊的不足之處。最早的緩沖區(qū)溢出攻擊需要在漏洞程序中添加惡意代碼ShellCode,只有執(zhí)行這些惡意代碼,才能達(dá)到攻擊者的攻擊目的。
return-into-libc攻擊就是一種不需要對緩沖區(qū)同時(shí)寫和執(zhí)行(或者先寫后執(zhí)行)的攻擊方式,它只需要通過緩沖區(qū)溢出來篡改跳轉(zhuǎn)地址,然后將程序引導(dǎo)到系統(tǒng)中已存在的動(dòng)態(tài)函數(shù)庫當(dāng)中,去執(zhí)行函數(shù)庫中已有的函數(shù)代碼來達(dá)到攻擊的目的。
盡管return-into-libc攻擊繞過了WX(WXORX)防御,但是相比于注入代碼型攻擊,它卻有了更多限制,主要表現(xiàn)在兩個(gè)方面:
(1)在一個(gè)return-into-libc攻擊中,攻擊者只能調(diào)用庫函數(shù),當(dāng)一個(gè)函數(shù)執(zhí)行完,繼續(xù)調(diào)用下一個(gè)函數(shù),而不能像注入代碼型攻擊一樣,可以調(diào)用注入的任意代碼;
(2)在return-into-libc攻擊中,攻擊者只能調(diào)用程序代碼段或者函數(shù)庫中存在的函數(shù),所以通過將某一個(gè)或幾個(gè)關(guān)鍵函數(shù)(例如system()函數(shù))從函數(shù)庫中移除,可以限制攻擊者的攻擊行為。
而ROP攻擊不要求調(diào)用函數(shù)庫中的函數(shù),而是對有用指令序列進(jìn)行任意組合,加大了其攻擊能力,所以通過移除庫函數(shù)的方法來限制攻擊者的行為,對ROP攻擊是不起作用的。
3.ROP攻擊
ROP全稱為Return-OrientedProgrammming(面向返回的編程),是一種新型的基于代碼重用技術(shù)的攻擊。它是在return-into-libc攻擊的基礎(chǔ)上發(fā)展而來,但更復(fù)雜、功能更強(qiáng)大的非注入代碼型攻擊。return-into-libc攻擊通常只能跳轉(zhuǎn)到動(dòng)態(tài)函數(shù)庫的某個(gè)函數(shù)入口執(zhí)行完整的函數(shù)代碼,而ROP攻擊通過對return-into-libc攻擊的進(jìn)一步擴(kuò)展,將return-into-libc攻擊中重用動(dòng)態(tài)庫函數(shù)的模式修改為重用函數(shù)中代碼片段的形式,可供選擇的范圍更廣,粒度更細(xì),防范的難度也更大。
ROP攻擊的大體思路是攻擊者掃描已有的動(dòng)態(tài)鏈接庫和可執(zhí)行文件,提取出可以利用的指令片段(這些指令片段被稱為gadget)。
在第一代ROP攻擊中,這些指令片段以ret指令結(jié)尾,即用ret指令實(shí)現(xiàn)指令片段執(zhí)行流的銜接。操作系統(tǒng)通過棧來進(jìn)行函數(shù)的調(diào)用和返回,而函數(shù)的調(diào)用和返回是通過壓棧和出棧來實(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不需要向被攻擊程序中注入惡意代碼,因而,它可以繞過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)加法。可以使用“addl(%eax),%edx;push%edi;ret”的指令序列形式。
(2)減法??梢允褂谩皀eg%edx;ret”的指令序列形式。
(3)異或??梢允褂谩皒orl(%eax),%edx;ret”的指令序列形式。
3)控制流(controlflow)
(1)無條件跳轉(zhuǎn)。在ROP攻擊中,棧指針(%esp)取代了指令指針(%eip)的作用,來控制程序的執(zhí)行流程,通過簡單的無條件跳轉(zhuǎn)來改變“%esp”的值,可以使其指向一個(gè)新的指令集。如圖9-3所示是使用“pop%esp;ret”指令序列,造成的一個(gè)無限循環(huán)。
(2)條件跳轉(zhuǎn)。條件跳轉(zhuǎn)指令如cmp指令、jcc指令等,由于它們跳轉(zhuǎn)造成的是指令指針(%eip)的改變,所以條件跳轉(zhuǎn)指令在ROP攻擊中用處不大。
圖9-3使用“pop%esp;ret”指令序列的無限循環(huán)
4)函數(shù)調(diào)用(functioncalls)
在return-into-libc攻擊中,可以通過從函數(shù)庫中移除相應(yīng)的函數(shù)限制攻擊的進(jìn)行,但是在ROP攻擊中,卻可以調(diào)用庫中的任意指令片段,不受限制。
9.2ROP攻擊的變種
由于第一代ROP攻擊精心選擇的指令工具集都以ret指令結(jié)尾,其構(gòu)造的工具集會(huì)包含許多ret指令,這在正常的系統(tǒng)中是不合理的。所以,研究人員提出了一種通過檢測系統(tǒng)指令執(zhí)行流程中ret指令調(diào)用的頻繁程度,從而檢測ROP攻擊的技術(shù)方法。還有的方法通過改寫內(nèi)核系統(tǒng)中所有的ret指令,使攻擊者無法找到可用的指令片段構(gòu)造攻擊。而最新的代碼重用型攻擊變種已經(jīng)不再依賴于ret指令,而是改為利用類似的跳轉(zhuǎn)指令(比如間接jmp或“pop+jmp”指令)來串接指令片段(即gadgets)。
9.2.1非ret指令結(jié)尾的ROP攻擊
第一代ROP攻擊看似完美地解決了注入代碼型攻擊的缺點(diǎn),但實(shí)際上它自身也有很大的缺點(diǎn)。這個(gè)缺點(diǎn)就是每一條指令序列都需要以ret指令結(jié)尾,這樣就導(dǎo)致了在組合成的工具集中含有大量的ret指令,研究人員能夠通過對ret指令的使用頻繁程度來檢測系統(tǒng)是否遭受到ROP攻擊。
(1)針對第一個(gè)不同點(diǎn),研究人員建議使用一種檢測技術(shù)去檢測指令流中頻繁的ret返回指令。例如,在動(dòng)態(tài)二進(jìn)制指令流的框架下,當(dāng)發(fā)現(xiàn)三個(gè)連續(xù)的指令序列均以ret指令結(jié)尾,而每個(gè)指令序列由五條或少于五條指令組成時(shí),就觸發(fā)一個(gè)警告。
(2)針對第二個(gè)不同點(diǎn),即使沒有合法的call調(diào)用指令,攻擊者也能頻繁地使用ret返回指令,這在一個(gè)程序的返回地址棧中違反了last-infirst-out的原理,研究人員建議使用一種方法去檢測在通過call調(diào)用指令和ret返回指令的程序中,那些違反了last-infirst-out的棧原理的指令流。
(3)更為徹底的一種防御方法是研究人員將庫中全部的ret指令消除(或替換),從而可以有效地干預(yù)ROP構(gòu)造攻擊的基礎(chǔ)。
盡管上述防御方法都能很好地防御ROP攻擊,但是攻擊者又提出新的方法來實(shí)施攻擊,同時(shí)確保不被上述的防御方法探測到。攻擊者通過對防御方法的研究發(fā)現(xiàn),頻繁的ret返回指令調(diào)用使得防御軟件能夠檢測到攻擊,那么攻擊者通過開發(fā)出不使用返回指令的ROP攻擊就可以跳過這種防御。由此,一種新的攻擊方式誕生了,它叫做非ret指令結(jié)尾的ROP攻擊,英文名是Return-OrientedProgramming
withoutReturns,它是ROP攻擊的一個(gè)變種。
非ret指令結(jié)尾的ROP攻擊是在指令序列中找到類似返回指令的指令序列來代替返回指令,就可以使得ROP攻擊不需要使用ret返回指令,從而使得檢測ret返回指令頻率的防御方式無效,以達(dá)到越過防御措施的攻擊方法。
在x86架構(gòu)上,可以使用類似于ret返回指令的指令序列,例如“popreg;jmp*reg”的指令序列。通過這樣的方式,就不需要頻繁地調(diào)用ret返回指令來組建工具集,從而使得針對第一代ROP攻擊的防御方法失效。
如圖9-4所示是非ret指令結(jié)尾的ROP攻擊模型。
圖9-4非ret指令結(jié)尾的ROP攻擊模型
在圖9-4中,Trampoline就是所謂的“更新-加載-轉(zhuǎn)移序列”,它替換了ROP攻擊中的ret返回指令。在被攻擊的目標(biāo)程序或函數(shù)庫中,找出Trampoline序列,對于每一個(gè)待執(zhí)行的指令序列,它們都以間接jmp指令結(jié)尾,而每一個(gè)間接jmp指令均指向Trampoline序列,通過執(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é)尾,并通過
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高壓下的親子關(guān)系管理技巧
- 職場新人如何快速適應(yīng)并激發(fā)工作動(dòng)力
- 提升孩子朗讀興趣的小學(xué)體育教學(xué)設(shè)計(jì)
- 二零二五年度報(bào)廢車輛回收處理及環(huán)保設(shè)施建設(shè)合同
- 二零二五年度電子借條合同模板(適用于教育基金貸款)
- 二零二五年度電商直播主播直播帶貨銷售合同
- 二零二五年度私人家教聘請合同-青少年國際視野拓展計(jì)劃
- 2025年度車輛抵押抵加工訂單款合同
- 2025年度房產(chǎn)抵押短期借款合同
- 2025年度湖南橋梁伸縮縫安裝與橋梁景觀照明設(shè)計(jì)合同
- 醫(yī)院定崗定編方案文檔
- 4-熔化焊與熱切割作業(yè)基礎(chǔ)知識(shí)(一)
- 2023年200MW儲(chǔ)能電站儲(chǔ)能系統(tǒng)設(shè)計(jì)方案
- 個(gè)人安全與社會(huì)責(zé)任的基本知識(shí)概述
- 建筑裝飾工程計(jì)量與計(jì)價(jià)試題一及答案
- 簡易勞務(wù)合同電子版
- 明代文學(xué)緒論
- 體育賽事的策劃、組織與實(shí)施 體育賽事利益相關(guān)者
- 分析化學(xué)(高職)PPT完整版全套教學(xué)課件
- 晚熟的人(莫言諾獎(jiǎng)后首部作品)
- m拱頂儲(chǔ)罐設(shè)計(jì)計(jì)算書
評論
0/150
提交評論