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

緩沖區溢出分析與防御

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

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

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

緩沖區溢出內存模型和分類

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

在繼續進行緩沖區溢出分析之前,先給出緩沖區溢出的內存模型和常見緩沖區溢出攻擊的分類。

(一)緩沖區溢出內存模型

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

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

當發生函數調用時,編譯器所執行的步驟如下:

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

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

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

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

圖1 被調用函數執行時的堆棧情況

(二)緩沖區溢出分類

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

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

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

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

圖2 堆分配示意圖

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

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

圖3 堆覆蓋前堆映像

圖4 覆蓋后的堆映像

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

圖5 BSS攻擊示例

緩沖區溢出攻擊

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

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

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

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

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

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

(二)shellcode編碼方式

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

(1)異或防范

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

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

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

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

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

(2)指令微調

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

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

(3)內存搜索

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

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

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

緩沖區溢出攻擊防護

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

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

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

(2)基于可執行代碼的分析轉換。

在不能得到源碼的情況下,最直接的辦法就是對可執行碼進行分析、轉換,來檢測和預防緩沖區溢出。它包括以下內容:定位邊界函數、保護返回地址、檢測系統調用、緩沖區代碼的反匯編檢查等方式。

(3)擴展編譯器功能。

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

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

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

(5)堆和棧不可執行。

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

(6)抽象執行網絡數據。

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

(7)軟件測試。

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

(8)打亂和加密。

該技術使得攻擊代碼即使注入,也不能運行。它主要包括以下內容:打亂內存地址、打亂系統調用入口、對段設置保護屬性、加密可執行代碼等方法。

(9)基于硬件的支持。

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

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

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

主站蜘蛛池模板: 亚卅精品无码久久毛片乌克兰| 中文字幕久久波多野结衣| 成·人免费午夜无码视频在线观看 | 亚洲AV无码精品无码久久蜜桃| 四虎国产在线观看| 中文毛片无遮挡播放免费| 欧美日韩国产精品va| 国产精品色婷婷在线观看| 又黄又湿又爽的视频| 91蝌蚪视频在线观看| 丁香亚洲综合五月天婷婷| 久久精品丝袜高跟鞋| 精品国产自在在线在线观看| 日本免费福利视频| 中文无码精品A∨在线观看不卡 | 无码久看视频| 亚洲手机在线| 麻豆精品在线播放| 免费高清自慰一区二区三区| 国产成人艳妇AA视频在线| 成人另类稀缺在线观看| 国产99视频精品免费视频7 | 亚洲天堂网视频| 欧美国产日本高清不卡| 日本午夜影院| 成人免费黄色小视频| 精品国产免费观看一区| 日韩在线欧美在线| 91视频青青草| 五月天福利视频| 亚洲精品片911| 亚洲国产成人精品青青草原| 亚洲精品视频免费观看| 国产国产人成免费视频77777| 亚洲成人播放| 欧洲亚洲欧美国产日本高清| 亚洲国产亚综合在线区| 日本妇乱子伦视频| 美女一区二区在线观看| 日韩国产 在线| 国产成人综合网在线观看| 一本大道AV人久久综合| 中文字幕有乳无码| 找国产毛片看| 欧美人与动牲交a欧美精品| 国产精品熟女亚洲AV麻豆| 亚洲综合精品香蕉久久网| 小13箩利洗澡无码视频免费网站| 色综合久久无码网| 国产激情无码一区二区APP| 午夜精品福利影院| 国产成人精品三级| 国产欧美日韩视频怡春院| 亚洲欧美一区在线| 国内熟女少妇一线天| 九九热精品视频在线| 亚洲综合经典在线一区二区| 欧美三级不卡在线观看视频| 最新精品久久精品| 黄色一级视频欧美| 免费a在线观看播放| 国产精品亚洲五月天高清| 国产日韩欧美一区二区三区在线| 亚洲欧美人成电影在线观看| 91在线播放国产| 亚洲国产成人超福利久久精品| 国产精品亚洲专区一区| 国产黑丝一区| 波多野结衣一区二区三区四区| 手机成人午夜在线视频| 亚洲人成在线精品| 乱码国产乱码精品精在线播放| 欧美色丁香| 2021国产v亚洲v天堂无码| 国产欧美日韩va另类在线播放| 华人在线亚洲欧美精品| 免费可以看的无遮挡av无码| 欧美精品综合视频一区二区| 亚洲av无码片一区二区三区| 这里只有精品在线| 国产成人精品一区二区秒拍1o| 中文字幕人妻av一区二区|