亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

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

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

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

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

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

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

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

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

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

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

        (2)被調(diào)用者。首先,被調(diào)用者將BP寄存器內(nèi)容壓入堆棧來保存調(diào)用者的堆?;罚⒏露褩V羔樀脚f的基址。設(shè)置BP內(nèi)容為自己的堆棧基址,亦即當(dāng)前的堆棧指針。然后,被調(diào)用者按照局部變量的聲明移動(dòng)堆棧指針,為所有非靜態(tài)局部變量分配足夠的空間。執(zhí)行被調(diào)用函數(shù)的操作。

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

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

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

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

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

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

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

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

        圖2 堆分配示意圖

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

        通過事先向buf2 中寫入10個(gè)B,之后再往buf1 寫入10個(gè)A,可知堆的情況如圖3所示。如果此時(shí)溢出指針buf1,將buf1當(dāng)中寫入18個(gè)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兩個(gè)數(shù)組位于BSS段。如果buf1寫入的數(shù)據(jù)足夠長(zhǎng)(>10),例如12個(gè)字節(jié),則會(huì)覆蓋buf2的內(nèi)容,如圖5所示。通過溢出靜態(tài)字符數(shù)組buf1 ,可改寫其相鄰區(qū)域字符數(shù)組buf2 的值。利用這點(diǎn),攻擊者可以通過改寫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)存在了,那么就比較簡(jiǎn)單了——對(duì)代碼傳遞一些參數(shù),然后使程序跳轉(zhuǎn)到目標(biāo)攻擊代碼就可以了。(b)植入法。如果攻擊代碼在系統(tǒng)中不存在,則需要攻擊者來植入到緩沖區(qū)當(dāng)中。植入到地方可以是堆棧(自動(dòng)變量)、堆(動(dòng)態(tài)分配的)和靜態(tài)數(shù)據(jù)區(qū)(初始化或者未初始化的數(shù)據(jù));植入的字符串是可以在這個(gè)所攻擊的目標(biāo)的硬件平臺(tái)上運(yùn)行的指令序列。

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

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

        (二)shellcode編碼方式

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

        (1)異或防范

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        (3)擴(kuò)展編譯器功能。

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

        (4)運(yùn)行時(shí)攔截并檢查。

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

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

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

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

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

        (7)軟件測(cè)試。

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

        (8)打亂和加密。

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

        (9)基于硬件的支持。

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

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

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

        国产精品女同一区二区免| 精品88久久久久88久久久| 亚洲成a∨人片在线观看无码 | 亚洲色欲色欲欲www在线| 中文字幕东京热一区二区人妻少妇 | 久久AV中文综合一区二区| 日本大片在线一区二区三区| 亚洲av无一区二区三区| 亚洲乱亚洲乱妇无码麻豆| 亚洲av久久无码精品九九| 欧美精品高清在线xxxx| 精品无码国产污污污免费网站| 人妻少妇人人丰满视频网站| 亚洲高清在线视频网站| 久久黄色精品内射胖女人| 小雪好紧好滑好湿好爽视频| 看国产黄大片在线观看| 日韩在线精品在线观看| 91精品国产色综合久久不| 色婷婷久久亚洲综合看片| 成人爽a毛片在线视频| 国产最新AV在线播放不卡| 黑人一区二区三区在线| 国产一区二区三区在线男友| 曰韩无码av一区二区免费| 天堂8中文在线最新版在线| 中文字幕人成人乱码亚洲 | 欧洲熟妇色 欧美| 国产精品久久久久久2021| 亚洲视频在线免费观看一区二区| av免费在线免费观看| 国产莉萝无码av在线播放| 樱花AV在线无码| 国产亚洲av人片在线播放| 久久精品国产亚洲av高清三区 | 天堂丝袜美腿在线观看| 无码人妻精品一区二区三| 人妻无码中文专区久久五月婷| 国产69口爆吞精在线视频喝尿| 美女丝袜诱惑在线播放蜜桃| 视频在线观看一区二区三区|