999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

緩沖區(qū)溢出分析與防御

2011-12-31 00:00:00張君
信息化建設(shè) 2011年9期

從Morris編寫了第一個蠕蟲病毒以來,緩沖區(qū)溢出

攻擊已成為目前世界上最主要、最具威脅性的網(wǎng)絡(luò)攻擊之一。據(jù)初步估計,美國每年因網(wǎng)絡(luò)安全問題所造成的經(jīng)濟損失高達75億美元。在過去的10年中,利用緩沖區(qū)溢出漏洞進行網(wǎng)絡(luò)入侵占了網(wǎng)絡(luò)攻擊的70%以上。因此,深入研究緩沖區(qū)溢出的原理、其植入代碼的結(jié)構(gòu)特征,以及如何防范緩沖區(qū)溢出具有重要的意義。

緩沖區(qū)溢出內(nèi)存模型和分類

緩沖區(qū)溢出的根本原因有兩點:(1)缺少必要的邊界檢查。在C/C++等高級語言當中,數(shù)據(jù)被寫入到緩沖區(qū)的時候,并不做邊界檢查。這樣,一旦被復制的數(shù)據(jù)長度超過了緩沖區(qū)的大小,就必然會導致緩沖區(qū)溢出。(2)操作系統(tǒng)設(shè)計策略的隱患。這主要是指棧和堆數(shù)據(jù)區(qū)的可執(zhí)行屬性。Unix和Windows系統(tǒng)為了更好的性能和功能,往往在數(shù)據(jù)段當中動態(tài)放入可執(zhí)行的代碼,以保證程序的兼容性,從而使得堆和棧具有可執(zhí)行屬性。但是,賦予棧和堆的可執(zhí)行屬性并不是必要的。因為棧和堆的本質(zhì)功能只是用來存儲數(shù)據(jù),對其賦予可執(zhí)行權(quán)限對系統(tǒng)的安全性帶來了不可避免的安全隱患。

在繼續(xù)進行緩沖區(qū)溢出分析之前,先給出緩沖區(qū)溢出的內(nèi)存模型和常見緩沖區(qū)溢出攻擊的分類。

(一)緩沖區(qū)溢出內(nèi)存模型

我們以針對棧的緩沖區(qū)溢出進行說明。針對堆的緩沖區(qū)溢出形式并不相同,但是其基本思想是一致的。

在某些高級語言,例如C程序中,每當調(diào)用函數(shù)時,就會自動處理堆棧分配。堆棧起到了保存有關(guān)當前函數(shù)調(diào)用上下文的容器的作用。許多內(nèi)容都可能進入堆棧區(qū),通常其內(nèi)容與計算機體系結(jié)構(gòu)和編譯器相關(guān)。一般而言,如下內(nèi)容都將被儲存在堆棧中:函數(shù)的非靜態(tài)局部變量值、堆棧基址、當函數(shù)返回時程序應(yīng)該跳轉(zhuǎn)到的地址以及傳遞到函數(shù)中的參數(shù)。

當發(fā)生函數(shù)調(diào)用時,編譯器所執(zhí)行的步驟如下:

(1)調(diào)用者。首先,調(diào)用者將被調(diào)用的函數(shù)所需的所有參數(shù)都壓入堆棧,之后堆棧指針自動更改到指向當前棧頂。接著隨系統(tǒng)不同,調(diào)用者可能壓入一些其它數(shù)據(jù)來保護現(xiàn)場。完成后,調(diào)用者使用調(diào)用指令來調(diào)用函數(shù)。調(diào)用指令將返回地址(IP)壓入堆棧,并相應(yīng)更新堆棧指針。最后,調(diào)用指令將程序計數(shù)器設(shè)置為正被調(diào)用的函數(shù)地址,執(zhí)行權(quán)交給被調(diào)用函數(shù)。進入第(2)步操作。

(2)被調(diào)用者。首先,被調(diào)用者將BP寄存器內(nèi)容壓入堆棧來保存調(diào)用者的堆棧基址,并更新堆棧指針到舊的基址。設(shè)置BP內(nèi)容為自己的堆棧基址,亦即當前的堆棧指針。然后,被調(diào)用者按照局部變量的聲明移動堆棧指針,為所有非靜態(tài)局部變量分配足夠的空間。執(zhí)行被調(diào)用函數(shù)的操作。

(3)調(diào)用函數(shù)結(jié)束。當被調(diào)用函數(shù)執(zhí)行完畢后,調(diào)用者更新堆棧指針以指向返回地址IP,調(diào)用ret指令將程序控制權(quán)交給返回地址上的程序。然后恢復被保存的運行環(huán)境。

從以上的過程中可以看到,發(fā)生函數(shù)調(diào)用時的堆棧分配過程中,非靜態(tài)局部變量緩沖區(qū)的分配和填充不是同時進行的,并且依據(jù)不同的標準:局部變量緩沖區(qū)的分配是依據(jù)局部變量的聲明,而填充則是依據(jù)其實際被賦予的值。因此這個過程中就出現(xiàn)了安全漏洞。圖1說明了被調(diào)用函數(shù)執(zhí)行時的堆棧情況。

圖1 被調(diào)用函數(shù)執(zhí)行時的堆棧情況

(二)緩沖區(qū)溢出分類

根據(jù)緩沖區(qū)溢出攻擊手段的不同,主要分為以下三種方式:棧溢出、堆溢出和BSS 溢出,下面分別予以介紹。

(1)棧溢出。棧在函數(shù)調(diào)用的時候建立,包含以下信息:函數(shù)參數(shù)信息;函數(shù)返回地址信息;棧頂和棧底信息;局部變量的信息,具體可以參見圖1。

棧的生長方向是從內(nèi)存高地址向低地址生長的,其數(shù)據(jù)的壓入和彈出操作由PUSH和POP完成,并且遵循后進先出的原則。當函數(shù)被調(diào)用時,其函數(shù)參數(shù)、函數(shù)返回地址、棧幀信息和局部變量依次壓入到堆棧當中。這樣,通過向棧中壓入超長的數(shù)據(jù),就有可能改變函數(shù)的返回地址,從而使得函數(shù)在返回的時候執(zhí)行攻擊者所期望執(zhí)行的代碼。例如:假設(shè)函數(shù)存在某個數(shù)組參數(shù)s[20],則當執(zhí)行strcpy(s, attackstr)時,只要attackstr的長度足夠長(>20),就會覆蓋函數(shù)返回地址IP,從而達到攻擊目的。

(2)堆溢出。使用malloc()可以動態(tài)分配一段內(nèi)存,并向用戶返回一個內(nèi)存地址,而實際上這個地址前面通常還有8Bytes 的內(nèi)部結(jié)構(gòu),用來記錄分配的塊長度以及一些標志。圖2是一個已分配的堆的內(nèi)部結(jié)構(gòu)示意圖[4]。

圖2 堆分配示意圖

假設(shè)有如下定義:char * buf1 = ( char * )malloc (10) ; char * buf2 = ( char * )malloc (10) ;

通過事先向buf2 中寫入10個B,之后再往buf1 寫入10個A,可知堆的情況如圖3所示。如果此時溢出指針buf1,將buf1當中寫入18個A,則將buf1 的內(nèi)部保留的部分內(nèi)容改寫成了AAAAAAAA,參見圖4。攻擊者可以通過改寫指針或者函數(shù)指針等方式,可以使其指向特定的內(nèi)存地址并執(zhí)行指定代碼。

圖3 堆覆蓋前堆映像

圖4 覆蓋后的堆映像

(3)BSS溢出。BSS和靜態(tài)全局變量相關(guān)。例如,假設(shè)有如下定義:“static char buf1 [10], buf2 [12];”,則buf1和but2兩個數(shù)組位于BSS段。如果buf1寫入的數(shù)據(jù)足夠長(>10),例如12個字節(jié),則會覆蓋buf2的內(nèi)容,如圖5所示。通過溢出靜態(tài)字符數(shù)組buf1 ,可改寫其相鄰區(qū)域字符數(shù)組buf2 的值。利用這點,攻擊者可以通過改寫B(tài)SS 中的指針或函數(shù)指針等方式,改變程序原先的執(zhí)行流程,使指針跳轉(zhuǎn)到特定的內(nèi)存地址并執(zhí)行攻擊者指定的操作。

圖5 BSS攻擊示例

緩沖區(qū)溢出攻擊

(一)緩沖區(qū)溢出攻擊步驟

緩沖區(qū)溢出的關(guān)鍵,是要插入攻擊代碼(shellcode),并改變程序的控制流讓程序執(zhí)行shellcode。

(1)在程序的地址空間里安排攻擊代碼

在程序地址空間安排攻擊代碼又分為兩種情況:(a)直接使用法。如果攻擊代碼在系統(tǒng)中已經(jīng)存在了,那么就比較簡單了——對代碼傳遞一些參數(shù),然后使程序跳轉(zhuǎn)到目標攻擊代碼就可以了。(b)植入法。如果攻擊代碼在系統(tǒng)中不存在,則需要攻擊者來植入到緩沖區(qū)當中。植入到地方可以是堆棧(自動變量)、堆(動態(tài)分配的)和靜態(tài)數(shù)據(jù)區(qū)(初始化或者未初始化的數(shù)據(jù));植入的字符串是可以在這個所攻擊的目標的硬件平臺上運行的指令序列。

(2)控制程序轉(zhuǎn)移到攻擊代碼

改變程序控制流,使其執(zhí)行shellcode,是緩沖區(qū)溢出的另一個關(guān)鍵步驟。這也分為兩種情況:(a)函數(shù)指針法。void(*foo)() 聲明了返回值為void Function Pointers 的變量foo(可以指向任意函數(shù)地址的函數(shù)指針)。Function Pointers 可以用來定位任意地址空間,攻擊時只需要在任意空間里的Function Pointers 鄰近處找到一個能夠溢出的緩沖區(qū),然后用溢出來改變Function Pointers 。當程序通過Function Pointers 調(diào)用函數(shù),程序的流程就會被改變?nèi)?zhí)行shellcode。(b)返回地址法。當一個函數(shù)調(diào)用發(fā)生時,堆棧中會留駐一個返回地址(參見圖1)。執(zhí)行溢出改變返回地址即可。這樣的溢出方式也是較常見的。

(二)shellcode編碼方式

所謂的shellcode,就是為了達成攻擊目的的攻擊代碼。參考“緩沖區(qū)溢出攻擊步驟”一節(jié)當中在程序地址空間安排攻擊代碼的方式,shellcode有兩種主要形式:一種是直接在系統(tǒng)當中已經(jīng)存在了,此時,直接將控制流跳轉(zhuǎn)到存在的shellcode即可;另一種是系統(tǒng)當中不存在,此時就需要用戶以字符串的形式植入到系統(tǒng)當中,這些字符串必須是為了所攻擊的目標硬件平臺能夠運行的指令序列。如果是攻擊者人工植入shellcode,則必然涉及到shellcode的編碼方式以躲避一些安全防御系統(tǒng),如防火墻、入侵檢測系統(tǒng)等;同時還要滿足被攻擊平臺某些特定特征,如C語言字符串特征(“\\0”代表字符串結(jié)束),IIS攻擊shellcode不能有空格等。可見,對shellcode進行編碼是必要的,下面對shellocde的一些編碼方式進行總結(jié)。

(1)異或防范

異或方法的原理是,對于某個值X,選用任意的密鑰Y,都有如下的等式成立:X xor Y = Z 且Z xor Y= X,因而我們有X xor Y xor Y = X。也就是說,對于某個值X,選用任意的密鑰,進行兩次異或以后,得到結(jié)果與原來的X相同。利用這個原理,我們可以得到相應(yīng)的編碼思路如下:

(a)選擇密鑰Y:選擇某個shellcode 當中不存在的字符作為密鑰Y;

(b)編碼:把shellcode 當中的每個字符分別與選中的密鑰Y做一個異或操作,得到轉(zhuǎn)換后的shellcode ,我們稱之為encryptedshellcode ;

(c)解碼:編寫對encryptedshellcode 的解碼代碼,我們稱之為decode。由等式X xor Y xor Y = X,只要將encryptedshellcode再次進行一次編碼操作即可解碼。

(d)兩步操作之后得到的就是我們可以植入到被攻擊程序當中運行的最終shellcode 。

(2)指令微調(diào)

如果shellcode 只是偶爾幾個字節(jié)出了問題,那么我們可以采用簡單的微調(diào)法來進行處理,微調(diào)法的原理就是對不合要求的字符進行等價變換:包括指令變換和字符變換。例如,如果指令mov ax, 0不符合要求,則可以變換為xor ax, ax指令;又例如,假設(shè)指令Z=0x30不符合要求,則可以將Z進行拆分Z = A + B=0x01+0x29=0x02+0x28=…。

指令微調(diào)的基本思想是,將不符合要求的字節(jié)利用語義等價的指令進行代換即可。指令微調(diào)適用于不符合要求的自己比較少的情況。

(3)內(nèi)存搜索

內(nèi)存搜索法的實質(zhì)是把一個shellcode 分為了兩個部分。第一個部分是完成真正攻擊功能的shellcode,我們用shellcodeA表示;另一個部分是搜索具有攻擊功能shellcode 的搜索shellcode,我們用shellcodeS表示。

在攻擊的時候,由于多種原因:例如長度限制,防病毒軟件的原因等等,shellcodeA不能夠直接植入到緩沖區(qū)當中。那么,我們可以把shellcodeA放到內(nèi)存的某個位置。然后。把shellcodeS植入到緩沖區(qū)當中。這樣,當成功溢出程序以后,shellcodeS將會在內(nèi)存中搜索shellcodeA,并在搜尋到以后把控制權(quán)交給shellcodeA,由shellcodeA實現(xiàn)攻擊工作。

以上講了三種shellcode編碼方法。Shellcode作為攻擊的核心部分,為了逃避防火墻、入侵檢測系統(tǒng)等安全防護系統(tǒng),同時又符合被攻擊平臺的指令要求,尋求合適的編碼方式是非常必要的。

緩沖區(qū)溢出攻擊防護

緩沖區(qū)溢出是危害非常大的攻擊方式,因此,對其進行防護是非常重要的。根據(jù)相關(guān)文獻,緩沖區(qū)溢出攻擊有如下一些防護方式:

(1)基于源碼的靜態(tài)分析。

基于源碼的詞法分析、模型化、標記驅(qū)動、符號分析等靜態(tài)分析技術(shù)能在程序發(fā)布前檢測和修正緩沖區(qū)溢出脆弱性。它包括如下內(nèi)容:詞法分析、變量范圍模型化、基于前后條件的標記驅(qū)動、符號分析等方式。

(2)基于可執(zhí)行代碼的分析轉(zhuǎn)換。

在不能得到源碼的情況下,最直接的辦法就是對可執(zhí)行碼進行分析、轉(zhuǎn)換,來檢測和預(yù)防緩沖區(qū)溢出。它包括以下內(nèi)容:定位邊界函數(shù)、保護返回地址、檢測系統(tǒng)調(diào)用、緩沖區(qū)代碼的反匯編檢查等方式。

(3)擴展編譯器功能。

編譯器是源碼變成可執(zhí)行碼的橋梁。有很多緩沖區(qū)溢出脆弱性檢測和預(yù)防技術(shù)解決方案是通過擴展原編譯器,增加緩沖區(qū)邊界信息并插入邊界檢查代碼來實現(xiàn)的。它包括如下內(nèi)容:增加返回地址保護功能、擴展指針表示信息、插入內(nèi)存修改日志、增加安全類型等方法。

(4)運行時攔截并檢查。

運行時攔截危險函數(shù)并進行安全檢查是對原系統(tǒng)影響較小的軟件實現(xiàn)方法。它包括以下內(nèi)容:攔截脆弱函數(shù)、運行時防止溢出等。

(5)堆和棧不可執(zhí)行。

大部分基于堆棧緩沖區(qū)溢出脆弱性的攻擊依賴于堆棧可執(zhí)行。如果不允許堆棧執(zhí)行程序,就能防御這類攻擊。

(6)抽象執(zhí)行網(wǎng)絡(luò)數(shù)據(jù)。

所謂抽象執(zhí)行是指在檢查網(wǎng)絡(luò)數(shù)據(jù)時分析它是否表示了有效的機器指令,通過抽象執(zhí)行可以檢測網(wǎng)絡(luò)數(shù)據(jù)中是否包含帶有緩沖區(qū)溢出脆弱性的程序。數(shù)據(jù)請求包如果包含了緩沖區(qū)溢出脆弱性,那它的有效指令鏈會比正常的數(shù)據(jù)請求包中的有效指令鏈長很多,對可能包含緩沖區(qū)溢出脆弱性的數(shù)據(jù)包再在虛擬機上模擬執(zhí)行,以進一步驗證。

(7)軟件測試。

使用一些軟件測試技術(shù)也能檢測緩沖區(qū)溢出脆弱性,其主要缺點是需要測試者提供觸發(fā)脆弱性發(fā)生的測試數(shù)據(jù)。它主要包括以下內(nèi)容:基于錯誤注入的測試、基于屬性的測試、滲透測試等方法。

(8)打亂和加密。

該技術(shù)使得攻擊代碼即使注入,也不能運行。它主要包括以下內(nèi)容:打亂內(nèi)存地址、打亂系統(tǒng)調(diào)用入口、對段設(shè)置保護屬性、加密可執(zhí)行代碼等方法。

(9)基于硬件的支持。

硬件技術(shù)是最底層的技術(shù),如果能用于檢測和預(yù)防緩沖區(qū)溢出脆弱性,將是一個性能最高、解決最徹底的方案。它主要包括以下內(nèi)容:增加硬件堆棧、使用兩個堆棧、地址保護、地址完整性檢查等方法。

緩沖區(qū)溢出攻擊是一種常見而又危害巨大的攻擊方式。本文對緩沖區(qū)溢出的定義、緩沖區(qū)溢出攻擊分類、緩沖區(qū)溢出攻擊步驟和方法、緩沖區(qū)溢出攻擊防護等問題進行了研究和討論。在后續(xù)的研究中,我們將根據(jù)上述研究嘗試研究實際可用的緩沖區(qū)溢出攻擊防護系統(tǒng)。

(作者單位:浙江省電子與信息產(chǎn)品檢驗所)

主站蜘蛛池模板: 人妻中文久热无码丝袜| 免费一级全黄少妇性色生活片| 国产精品流白浆在线观看| 中文字幕啪啪| 五月六月伊人狠狠丁香网| 欧美精品aⅴ在线视频| 片在线无码观看| 亚洲色图综合在线| 欧美国产成人在线| 欧美日本在线一区二区三区| 国产成人一级| 国产在线日本| yjizz视频最新网站在线| 国产区网址| 国产自在线播放| 9久久伊人精品综合| 国产办公室秘书无码精品| 欧美在线天堂| 香蕉99国内自产自拍视频| 国产菊爆视频在线观看| 婷婷丁香色| 女人18毛片水真多国产| 国产女人18毛片水真多1| A级毛片无码久久精品免费| 青青青视频91在线 | 国产精品久久国产精麻豆99网站| 97精品伊人久久大香线蕉| 无码精品福利一区二区三区| 精品91视频| 69av在线| 日韩中文精品亚洲第三区| 超清无码一区二区三区| 99国产精品国产| 国内嫩模私拍精品视频| 精品1区2区3区| 亚洲成A人V欧美综合天堂| 高潮毛片免费观看| 国产成人免费视频精品一区二区| 色婷婷久久| 久久超级碰| 国产精品真实对白精彩久久| 欧美午夜久久| 老色鬼欧美精品| 日本免费一区视频| 毛片久久久| 制服丝袜国产精品| 亚洲国产日韩视频观看| 免费xxxxx在线观看网站| AV不卡无码免费一区二区三区| 自慰网址在线观看| 亚洲另类色| 激情成人综合网| 久久久久国产一区二区| 女人爽到高潮免费视频大全| 精品久久国产综合精麻豆| 午夜精品福利影院| 亚洲人成电影在线播放| 亚洲中文字幕在线精品一区| 99视频精品全国免费品| 亚洲高清国产拍精品26u| 内射人妻无套中出无码| 99这里只有精品免费视频| 亚洲色无码专线精品观看| 99久久精品无码专区免费| 亚洲国产精品VA在线看黑人| 日韩无码真实干出血视频| 性欧美精品xxxx| 欧美日一级片| 精品在线免费播放| 欧美区在线播放| 成人综合在线观看| 欧美成人影院亚洲综合图| 欧美精品1区| 五月天综合网亚洲综合天堂网| 日韩精品一区二区三区swag| 9啪在线视频| 日韩精品无码不卡无码| 夜夜爽免费视频| 精品久久人人爽人人玩人人妻| 成人免费网站久久久| 国产一级片网址| 亚洲综合色婷婷中文字幕|