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

        ?

        緩沖區(qū)溢出攻擊研究?

        2019-05-07 06:30:12袁連海李湘文
        艦船電子工程 2019年4期
        關(guān)鍵詞:程序

        袁連海 李湘文 徐 晶

        (成都理工大學(xué)工程技術(shù)學(xué)院 樂山 614000)

        1 引言

        應(yīng)用程序在運(yùn)行時(shí),操作系統(tǒng)將為其分配一片連續(xù)的內(nèi)存區(qū)域來存儲各種各樣的數(shù)據(jù),這片內(nèi)存區(qū)域叫做緩沖區(qū)。緩沖區(qū)溢出是用戶向緩沖區(qū)中寫入的數(shù)據(jù)超過緩沖區(qū)所能容納的最大容量,使得寫入的數(shù)據(jù)超過了定義的內(nèi)存邊界,從而將數(shù)據(jù)寫進(jìn)其他區(qū)域,在向已經(jīng)分配的同定存儲空間中存儲多于申請大小的數(shù)據(jù)時(shí),會發(fā)生緩沖區(qū)溢出。緩沖區(qū)溢出攻擊是攻擊者故意將大于緩沖區(qū)定義長度的數(shù)據(jù)寫入到緩沖區(qū),覆蓋其他區(qū)域的數(shù)據(jù),達(dá)到破壞性目的的操作。程序中存在緩沖區(qū)溢出漏洞是十分嚴(yán)重的安全問題。緩沖區(qū)溢出已經(jīng)成為一種十分普遍和危險(xiǎn)的安全漏洞,存在于各種操作系統(tǒng)和應(yīng)用軟件中。入侵者可以利用此漏洞攻擊用戶,從而造成了極大的經(jīng)濟(jì)損失和危害。攻擊者可以通過緩沖區(qū)溢出攻擊更改緩沖區(qū)的數(shù)據(jù)、注入惡意代碼、改變程序的控制權(quán)、使未授權(quán)的用戶獲得管理員權(quán)限,以致可以非法執(zhí)行任意代碼。攻擊者可以利用緩沖區(qū)溢出漏洞攻擊用戶,嚴(yán)重時(shí)可以導(dǎo)致程序不能正常運(yùn)行、計(jì)算機(jī)關(guān)機(jī)和系統(tǒng)重啟等結(jié)果。攻擊者還可以利用該漏洞運(yùn)行非法指令,獲得系統(tǒng)超級用戶權(quán)限,進(jìn)行各種各樣的非法操作。利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、重新啟動、執(zhí)行惡意代碼等后果。緩沖區(qū)溢出中最危險(xiǎn)的是堆棧溢出,入侵者可以利用堆棧溢出,在函數(shù)返回時(shí)改變返回程序的地址,讓其跳轉(zhuǎn)到任意地址,更為嚴(yán)重的是,它可被利用來執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操作[1]。

        緩沖區(qū)溢出攻擊在各種操作系統(tǒng)和應(yīng)用軟件中廣泛存在,緩沖區(qū)溢出漏洞是網(wǎng)絡(luò)信息安全中最危險(xiǎn)的安全漏洞之一。在目前網(wǎng)絡(luò)與操作系統(tǒng)安全領(lǐng)域,有50%以上的安全問題都是由于存在緩沖區(qū)溢出漏洞造成。從緩沖區(qū)溢出攻擊第一次出現(xiàn)到現(xiàn)在,大量信息安全的研究者致力于如何盡量避免緩沖區(qū)溢出的產(chǎn)生,及時(shí)發(fā)現(xiàn)軟件中緩沖區(qū)溢出的漏洞,有效防御緩沖溢出攻擊的研究,產(chǎn)生了不少有用、有效的緩沖區(qū)溢出防御的方法和技術(shù)[2]。

        2 進(jìn)程內(nèi)存分配

        緩沖區(qū)溢出通常在采用C和C++語言編寫的應(yīng)用程序中存在,原因是這類編譯器著重強(qiáng)調(diào)程序的運(yùn)行效率,而缺乏檢查內(nèi)存是否超越邊界的機(jī)制,這樣應(yīng)用程序就可能存在十分嚴(yán)重的安全問題。為更好地理解緩沖區(qū)溢出攻擊是如何實(shí)現(xiàn)的,先讓我們來了解C程序編寫的進(jìn)程在執(zhí)行時(shí)內(nèi)存分布狀況。程序運(yùn)行時(shí),程序是分別加載到內(nèi)存中幾個(gè)內(nèi)存分區(qū)的,包括代碼段、數(shù)據(jù)段、BSS段、堆、和棧。上述內(nèi)存區(qū)分別有對應(yīng)的功能,編譯器在編譯程序時(shí)要將程序載入相應(yīng)的內(nèi)存區(qū)域。

        圖1 操作系統(tǒng)進(jìn)程內(nèi)存分配區(qū)

        代碼段又叫做文本段,在這個(gè)內(nèi)存區(qū)域,主要存放可執(zhí)行的進(jìn)程的指令,包括用戶程序代碼和編譯器生成的相關(guān)輔助代碼,其大小取決于具體程序,代碼段的存放起始位置一般是固定的,這要根據(jù)系統(tǒng)是32位或者64位,代碼段通常是不可寫入,只能讀取,這是為了防止程序代碼被意外修改。數(shù)據(jù)段緊挨著代碼段,數(shù)據(jù)段用來存放已經(jīng)初始化,但初始化值不為0的變量,程序中定義的已經(jīng)初始化的靜態(tài)變量、已經(jīng)初始化的全局變量以及常量都保存在數(shù)據(jù)段區(qū)域。BSS段存放沒有初始化的全局變量和靜態(tài)變量,這些變量運(yùn)行時(shí)初始化為0。堆內(nèi)存區(qū)用來存放在程序中動態(tài)申請的內(nèi)存區(qū)域,在C語言中,調(diào)用malloc()函數(shù)返回的內(nèi)存地址就存放在堆里面,釋放堆里面的內(nèi)存需要調(diào)用函數(shù)free()來釋放內(nèi)存。棧內(nèi)存區(qū)存放函數(shù)的局部變量、函數(shù)的參數(shù)及編譯器自身產(chǎn)生的不可見的信息,如從被調(diào)用函數(shù)返回到調(diào)用函數(shù)的地址和一些狀態(tài)寄存器的值。圖1顯示在Linux操作系統(tǒng)中典型的C程序的內(nèi)存分布情況,在其他操作系統(tǒng)如UNIX和Windows操作系統(tǒng)中的進(jìn)程的內(nèi)存分配情況基本類似。

        為了更進(jìn)一步進(jìn)行描述,由C或者C++編譯器編譯的程序內(nèi)存占用包括以下幾個(gè)部分:棧由編譯器自動分配釋放,通常存放函數(shù)的參數(shù)值、局部變量等,操作方式和數(shù)據(jù)結(jié)構(gòu)中的棧相似。堆內(nèi)存區(qū)經(jīng)常由程序員分配和釋放,如果程序員不釋放,程序結(jié)束時(shí)操作系統(tǒng)進(jìn)行回收。全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,靜態(tài)區(qū)包括未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,程序結(jié)束后由操作系統(tǒng)釋放;字符串常量區(qū)存放常量,程序結(jié)束后由系統(tǒng)釋放;程序代碼段存放二進(jìn)制代碼。例如,下面一段C程序的各種變量的內(nèi)存分配區(qū)域如下。

        3 緩沖區(qū)溢出攻擊原理

        進(jìn)程的內(nèi)存分配情況在邏輯上基本分為三部分,分別是代碼區(qū)域、動態(tài)數(shù)據(jù)區(qū)域以及靜態(tài)數(shù)據(jù)區(qū)域。進(jìn)程的每個(gè)線程都有私有的棧,所以每個(gè)線程雖然代碼一樣,但本地變量的數(shù)據(jù)都是互不干擾。動態(tài)數(shù)據(jù)區(qū)一般就是堆棧。全局變量和靜態(tài)變量分配在靜態(tài)數(shù)據(jù)區(qū),本地變量分配在動態(tài)數(shù)據(jù)區(qū),即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變量。緩沖區(qū)溢出主要發(fā)生在上述內(nèi)存不同區(qū)域中,具體可分為以下3種:1)基于數(shù)據(jù)段的緩沖區(qū)溢出;2)基于Heap的緩沖區(qū)溢出;3)基于Stack的緩沖區(qū)溢出。還有一些比較特別的緩沖區(qū)溢出,如BSS溢出,通常情況下,針對緩沖區(qū)溢出漏洞的利用大多數(shù)是棧溢出,堆溢出的利用相當(dāng)困難[3]。

        緩沖區(qū)溢出攻擊是利用程序不對輸入的數(shù)據(jù)進(jìn)行邊界檢查的缺陷,向一個(gè)給定緩沖區(qū)中寫入過量的數(shù)據(jù),當(dāng)數(shù)據(jù)量超過給定緩沖區(qū)的大小時(shí),輸入數(shù)據(jù)溢出并覆蓋緩沖區(qū)鄰近的數(shù)據(jù)。黑客利用這種方法,精心設(shè)計(jì)寫入的數(shù)據(jù),可導(dǎo)致程序去執(zhí)行惡意代碼、讓系統(tǒng)死機(jī)或非法獲得系統(tǒng)訪問權(quán)。在C或者C++語言編寫的程序中,系統(tǒng)分配的緩沖區(qū)允許位于數(shù)據(jù)段、堆、棧以及BSS段,而與程序執(zhí)行過程相關(guān)的一些數(shù)據(jù)變量,包括函數(shù)參數(shù)指針、函數(shù)的返回內(nèi)存地址等數(shù)據(jù)也是可以存放在這些內(nèi)存區(qū)域。因此,當(dāng)控制程序執(zhí)行過程的一些關(guān)鍵的數(shù)據(jù)很容易受到緩沖區(qū)溢出攻擊,這時(shí),其值就有可能發(fā)生改變,結(jié)果是令正在執(zhí)行的指令轉(zhuǎn)向另外的代碼,例如可以去運(yùn)行非法的程序代碼,造成用戶的損失。

        棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),是操作系統(tǒng)在建立某個(gè)進(jìn)程時(shí)或者線程(在支持多線程的操作系統(tǒng)中是線程)為這個(gè)進(jìn)程分配的內(nèi)存區(qū)域,該存儲區(qū)域具有先進(jìn)后出的特點(diǎn),系統(tǒng)在編譯的時(shí)候可以指定棧的大小。本質(zhì)上棧是由寄存器EBP和ESP指向的一片內(nèi)存空間(前者指向棧底,后者指向棧頂),通常由高地址向低地址增長的內(nèi)存空間,棧中保存一些臨時(shí)的數(shù)據(jù),例如一個(gè)函數(shù)中的臨時(shí)變量以及函數(shù)的返回地址。

        在編程中,例如C/C++中,所有的局部變量都是從棧中分配內(nèi)存空間,實(shí)際上也不是什么分配,只是從棧頂向上用就行,在退出函數(shù)的時(shí)候,只是修改棧指針就可以把棧中的內(nèi)容銷毀,所以速度最快。自動開辟空間,用來分配局部變量、類的引用(指向堆空間段),棧使用的是一級緩存,通常在被調(diào)用時(shí)處于存儲空間中,調(diào)用完畢立即釋放。棧是由操作系統(tǒng)分配為程序運(yùn)行過程中的進(jìn)程分配的內(nèi)存區(qū)域。當(dāng)程序中執(zhí)行函數(shù)調(diào)用的時(shí)候,執(zhí)行流程是:第一是將函數(shù)的參數(shù)入棧,接著將指令寄存器中的內(nèi)容入棧,作為返回地址(RET),再接著將基址寄存器(EBP)入棧,再把當(dāng)前的棧指針(ESP)的內(nèi)容拷貝到EBP,做為新的基地址;最后把ESP減去恰當(dāng)?shù)臄?shù)值,為本地變量留出一定的存儲空間[3]。

        因?yàn)楹瘮?shù)內(nèi)的局部變量的內(nèi)存分配是發(fā)生在棧里的,因此,如果某一函數(shù)內(nèi)部聲明緩沖區(qū)變量,那么,該變量所占用的內(nèi)存空間是在該函數(shù)被調(diào)用時(shí)所建立的棧。由于對緩沖區(qū)變量的一些操作(例如,字符串復(fù)制STRCPY)是從低內(nèi)存地址向高內(nèi)存地址,而內(nèi)存中所保存的函數(shù)調(diào)用的返回地址(RET)通常就位于該緩沖區(qū)的上面(高地址),這樣就可能覆蓋函數(shù)的返回地址。當(dāng)用戶復(fù)制的內(nèi)容大于目標(biāo)緩沖區(qū)大小限制時(shí),會出現(xiàn)改寫函數(shù)保存在函數(shù)棧中的返回地址,這樣就可能使程序的執(zhí)行流程按照攻擊者的目的執(zhí)行。下面通過對一個(gè)簡單的緩沖區(qū)溢出代碼來敘述緩沖區(qū)溢出原理[5]。

        程序中包含一個(gè)個(gè)字節(jié)的緩沖區(qū),編譯運(yùn)行以上代碼,將命令行的第一個(gè)參數(shù)復(fù)制進(jìn)緩沖區(qū),由于程序沒有進(jìn)行邊界檢查,所以當(dāng)argv[1]的字符數(shù)目超過5時(shí),就會造成緩沖區(qū)溢出。在理論上程序的輸入?yún)?shù)超過5個(gè)字節(jié)就會出現(xiàn)緩沖區(qū)溢出,但因?yàn)榫幾g器不同版本原因,實(shí)際上復(fù)制的字符數(shù)目超過9個(gè)字節(jié)才能真正覆蓋緩沖區(qū)。通過實(shí)際運(yùn)行結(jié)果可以看到:當(dāng)輸入5個(gè)“B”的時(shí)候,程序會正常退出,8個(gè)字符也正常輸出,當(dāng)字符數(shù)目達(dá)到9個(gè)時(shí),運(yùn)行程序會出現(xiàn)段錯(cuò)誤SEGMENT FAUIT。

        緩沖區(qū)溢出攻擊的類型包括以下幾種[3]:棧溢出攻擊、本地指針溢出攻擊、本地函數(shù)指針溢出攻擊和BSS函數(shù)指針溢出攻擊。棧溢出攻擊是最常見、最主要的緩沖區(qū)溢出攻擊形式,這種攻擊方式通過改寫棧中的返回地址、前幀基址指針、函數(shù)指針以及在棧中植入攻擊代碼等來實(shí)施攻擊。堆BSS的溢出攻擊相對較難,攻擊的數(shù)量也少一些。wOOw00是一種堆溢出攻擊,通過溢出改寫存在堆或BSS中的函數(shù)指針來獲得控制。Matt Conover等做了深入的分析和研究[3]。

        造成緩沖區(qū)溢出的因素通常包括以下幾種情況[6]:第一是編程時(shí)采用不帶類型安全檢測的程序設(shè)計(jì)語言。雖然C和C++語言允許編程人員直接訪問內(nèi)存和寄存器,可以開發(fā)接近硬件運(yùn)行能力性能、運(yùn)行速度快的應(yīng)用程序,但是這兩種語言不進(jìn)行類型安全檢查以及檢測數(shù)組安全邊界,在包含字符串以及數(shù)組操作時(shí),很容易造成緩沖區(qū)溢出,所以大部分出現(xiàn)緩沖區(qū)溢出漏洞的程序都是采用C和C++語言。第二種情況是編譯器把程序緩沖區(qū)分配在內(nèi)存中關(guān)鍵數(shù)據(jù)結(jié)構(gòu)附件或者相鄰的位置。最后是開發(fā)者采用了不安全的方式訪問緩沖區(qū)。假設(shè)應(yīng)用程序需要訪問數(shù)據(jù),而用戶在將數(shù)據(jù)復(fù)制到指定的緩沖區(qū)位置卻沒有考慮目標(biāo)緩沖區(qū)大小時(shí),可能會出現(xiàn)緩沖區(qū)溢出漏洞。

        4 緩沖區(qū)溢出防御

        對于緩沖區(qū)溢出檢測和防御,眾多軟硬件生產(chǎn)廠家做了很多措施來預(yù)防緩沖區(qū)溢出漏洞。例如微軟公司在開發(fā)工具中增加編譯選項(xiàng)來檢測程序是否存在棧溢出,在操作系統(tǒng)中增加了結(jié)構(gòu)化異常處理覆蓋保護(hù)機(jī)制,通過阻止修改結(jié)構(gòu)化異常處理增強(qiáng)系統(tǒng)的安全性,在硬件方面,64位CPU引入了NX(No-eXecute)機(jī)制,在內(nèi)存中區(qū)分?jǐn)?shù)據(jù)區(qū)與代碼區(qū),當(dāng)攻擊者利用溢出使CPU跳轉(zhuǎn)到數(shù)據(jù)區(qū)去執(zhí)行時(shí),就會異常終止[6]。

        造成緩沖區(qū)溢出的主要原因是編程人員存在不好的編程習(xí)慣,因此,防御程序存在緩沖區(qū)溢出漏洞的最主要的措施是提高程序員代碼編寫規(guī)范、養(yǎng)成良好的編程習(xí)慣。在人的因素解決后,可以從技術(shù)方面進(jìn)行緩沖區(qū)溢出防御,包括編譯器、操作系統(tǒng)等方面。是傳統(tǒng)上系統(tǒng)級防范緩沖區(qū)溢出漏洞攻擊的三種最常用的方法。它們都不需要程序員對自己的代碼做任何修改,也基本不會帶來程序性能的降低。單獨(dú)一種機(jī)制可以在一定程度上降低緩沖區(qū)溢出漏洞所帶來的風(fēng)險(xiǎn),多種機(jī)制結(jié)合可使防范效果更加有效。比較經(jīng)典的緩沖區(qū)溢出漏洞防御措施如下[11]。

        1)不可執(zhí)行棧

        一些程序?yàn)榱颂岣邎?zhí)行效率,有時(shí)程序會動態(tài)生成和執(zhí)行代碼。如JAVA采用just-in-time編譯技術(shù)動態(tài)產(chǎn)生的代碼可以提高性能。在Linux操作系統(tǒng)中在發(fā)送信號時(shí),發(fā)送進(jìn)程要往棧中插入代碼并且觸發(fā)中斷,從而執(zhí)行棧中包含的代碼,并往接收進(jìn)程發(fā)送信號,這時(shí)操作系統(tǒng)會修改棧的可執(zhí)行屬性,使其變成可執(zhí)行。編譯器也會在其棧中存儲可執(zhí)行的代碼以便復(fù)用。所以,可執(zhí)行的棧雖然具有一定的優(yōu)點(diǎn),但也留下了一定的安全隱患。為了減少可執(zhí)行的棧帶來的安全漏洞,可以讓棧改變?yōu)椴豢蓤?zhí)行。將棧改變?yōu)椴豢蓤?zhí)行通常有兩種方法:鏈接器和操作系統(tǒng)的保護(hù)。鏈接器的保護(hù)是在編譯器編譯源代碼時(shí),可以采用execstack選項(xiàng)來控制編譯生成的目標(biāo)文件為堆棧段不可執(zhí)行。鏈接器鏈接目標(biāo)文件時(shí),如果某個(gè)目標(biāo)文件的堆棧段被標(biāo)記了堆棧段可執(zhí)行,則生成的庫或可執(zhí)行文件的堆棧段會標(biāo)記為可執(zhí)行;如果所有目標(biāo)文件都標(biāo)記了堆棧段不可執(zhí)行,則鏈接生成的庫或可執(zhí)行文件的堆棧段就會標(biāo)記為不可執(zhí)行。Linux系統(tǒng)提供了棧不可執(zhí)行的措施,以防止攻擊者將攻擊代碼通過棧溢出存儲到進(jìn)入棧,進(jìn)而防止執(zhí)行攻擊代碼。

        2)隨機(jī)化進(jìn)程地址

        由于計(jì)算機(jī)系統(tǒng)具有一定的相似性,這樣就存在安全隱患,攻擊者可以通過一臺計(jì)算機(jī)上分析程序運(yùn)行行為,設(shè)計(jì)攻擊方法來攻擊另一臺計(jì)算機(jī),所以,可以采用隨機(jī)分配進(jìn)程地址空間來避免不同計(jì)算機(jī)系統(tǒng)的相似性,從而預(yù)防緩沖區(qū)溢出漏洞,常見的方法包括:棧地址隨機(jī)化以及局部變量地址隨機(jī)化等方法。攻擊者為了在棧中插入可運(yùn)行的攻擊代碼,不僅需要插入攻擊代碼,還要插入攻擊代碼所在的地址值作為函數(shù)的返回地址。如果應(yīng)用程序在每次執(zhí)行時(shí)分配的棧地址都是相同的,攻擊者就很容易獲得函數(shù)的返回地址在棧上的存儲地址和插入棧中在棧上的存儲地址,也就很容易將固定的攻擊代碼改為在棧上的地址。隨機(jī)化棧地址的另外作用是攻擊者需要利用棧上某個(gè)變量時(shí),由于該變量的地址不是固定的,所以攻擊者獲得需要的變量就比較困難。編譯器在編譯程序時(shí),給每個(gè)局部變量預(yù)留大小隨機(jī)的一段存儲空間,因此,每個(gè)局部變量的地址也是隨機(jī)的;另外,隨機(jī)分配棧地址的作用是有限的,因?yàn)楣粽呖梢赃M(jìn)行多次嘗試,從而得到正確的地址[11]。

        3)編譯器引進(jìn)安全檢查機(jī)制

        編譯器為了檢測程序執(zhí)行時(shí)是否存在緩沖區(qū)溢出,一些編譯器提供了驗(yàn)證碼檢測機(jī)制。在編譯時(shí),編譯器在調(diào)用函數(shù)后和退出函數(shù)前都要插入一些代碼。在調(diào)用函數(shù)后,在棧頂部和函數(shù)返回地址之間放入隨機(jī)的驗(yàn)證碼,退出函數(shù)前,插入的代碼檢查該驗(yàn)證碼是否被修改,如果被修改,則報(bào)告異常。通常緩沖區(qū)溢出時(shí),會從緩沖區(qū)的低地址到高地址依次覆蓋,因此如果攻擊者要覆蓋寫返回地址,則必須覆蓋隨機(jī)驗(yàn)證碼,從而可以通過檢查緩沖區(qū)被寫前后的驗(yàn)證碼是否一致判斷是否發(fā)生了溢出。

        5 研究熱點(diǎn)與展望

        緩沖區(qū)溢出攻擊在程序中普遍存在以及具有較大的破壞性,許多研究者對如何有效地防御緩沖區(qū)溢出攻擊進(jìn)行了長期的研究。通過緩沖區(qū)溢出攻擊原理我們知道,攻擊者要利用緩沖區(qū)溢出進(jìn)行攻擊,攻擊者經(jīng)常要在一開始就通過緩沖區(qū)溢出植入攻擊執(zhí)行代碼,接著會改變程序的正常執(zhí)行流程,最終讓自己的攻擊代碼得以執(zhí)行。研究者通常對上述攻擊環(huán)節(jié)中的幾個(gè)步驟進(jìn)行研究,阻斷任何一個(gè)環(huán)節(jié)從而達(dá)到防止緩沖區(qū)溢出攻擊的發(fā)生。

        緩沖區(qū)溢出攻擊防御分為兩大類:靜態(tài)防御和動態(tài)防御。靜態(tài)防御方法是通過源代碼找到程序的漏洞并進(jìn)行修改,雖然要找出所有的源代碼漏洞幾乎是不可能的,但是找到已知攻擊漏洞特征再進(jìn)行修改,就可以大大降低程序被攻擊的可能性。不足之處是需要程序源代碼。獲取源代碼有時(shí)對用戶來說是不可能的,另一個(gè)缺點(diǎn)是需要不斷升級已知攻擊數(shù)據(jù)庫,一旦發(fā)現(xiàn)攻擊漏洞后,用戶需要知道怎么去修補(bǔ)漏洞。而動態(tài)防御是運(yùn)行有漏洞的程序時(shí),自動生成一個(gè)保護(hù)環(huán)境,讓利用漏洞進(jìn)行攻擊的行為不能發(fā)生。

        動態(tài)防御研究方面,由Crispin Cowan等開發(fā)了一種編譯器技術(shù),該技術(shù)不必修改程序源代碼,可以有效預(yù)防針對棧的返回地址的緩沖區(qū)溢出漏洞攻擊。在這類攻擊中,攻擊者通常先對棧的局域變量區(qū)寫入,再從高地址向低地址重寫基址指針和返回地址。通過在前幀基址指針與返回地址之間加入一個(gè)稱為偵探字段的虛構(gòu)域,在返回地址前,需要檢查偵探字段是否和以前一致,如果不一致則報(bào)警并終止程序的執(zhí)行。Stack Shield屬于GCC編譯器的補(bǔ)丁,它能防止針對返回地址和函數(shù)指針的溢出攻擊。采用的策略如下:當(dāng)調(diào)用函數(shù)時(shí),返回的地址在壓入棧的同時(shí)復(fù)制到一個(gè)受保護(hù)的全局?jǐn)?shù)組里面,當(dāng)函數(shù)返回時(shí),通過比較棧中的返回地址是否和全局?jǐn)?shù)組中的一致,來判斷是否受到攻擊。

        在靜態(tài)防御研究方面,文獻(xiàn)[13]采用一種通過對編譯以后的可執(zhí)行源代碼靜態(tài)分析的策略,通過對函數(shù)名的檢測得出哪些屬于危險(xiǎn)函數(shù)調(diào)用,經(jīng)過對可執(zhí)行代碼反匯編,獲得匯編代碼,最后判斷危險(xiǎn)函數(shù)是否引起緩沖區(qū)溢出。文獻(xiàn)[14]通過建模源程序代碼,獲得抽象的語法樹、符號表、控制流圖、函數(shù)調(diào)用圖,并使用區(qū)間運(yùn)算技術(shù)來分析和計(jì)算程序變量及表達(dá)式的取值范圍,而且在函數(shù)分析過程中引入函數(shù)摘要概念來替換實(shí)際的函數(shù)調(diào)用。文獻(xiàn)[15]也是通過靜態(tài)語法樹檢查惡意攻擊代碼。文獻(xiàn)[16]提出了使用靜態(tài)特征匹配來查找被檢測程序源代碼中的攻擊代碼,實(shí)現(xiàn)的一種工具能夠有效判斷許多種常見的惡意代碼。文獻(xiàn)[17]通過把基于源代碼分析的緩沖區(qū)溢出攻擊問題轉(zhuǎn)化成為一個(gè)和危險(xiǎn)函數(shù)約束條件相關(guān)的不等式組求解的數(shù)學(xué)問題,設(shè)計(jì)出了基于不等式方程組來建立緩沖區(qū)溢出檢測模型。文獻(xiàn)[18]得出源代碼中經(jīng)常引起緩沖區(qū)溢出的代碼的典型特征,例如緩沖區(qū)的坐標(biāo)變量值、危險(xiǎn)函數(shù)調(diào)用情況、指針增減操作、使用指針的循環(huán)語句等。通過以上特征,把緩沖區(qū)溢出歸類成5種典型的基本類型,還提出了各自的預(yù)防策略。文獻(xiàn)[12]提出一種漏洞挖掘方法,該方法基于遺傳算法,根據(jù)緩沖區(qū)溢出攻擊的典型特征,結(jié)合靜態(tài)分析的控制流思想,該方法同模擬退火算法相比,具有更高的完備性和更快的收斂速度。但是它并沒有去除程序中的漏洞,在平常環(huán)境下漏洞依然存在。動態(tài)防御不需要程序的源代碼??梢苑烙碌膼阂獯a對已受保護(hù)的目標(biāo)的攻擊,但是對未保護(hù)的新目標(biāo)攻擊則無能為力。

        6 結(jié)語

        在網(wǎng)絡(luò)和信息技術(shù)日益發(fā)達(dá)的當(dāng)今社會,網(wǎng)絡(luò)攻防技術(shù)不斷發(fā)展,為了提高系統(tǒng)軟件和應(yīng)用軟件的安全性能,研究者需要進(jìn)一步在軟件安全漏洞的系統(tǒng)分析、漏洞檢測、問題發(fā)現(xiàn)以及安全防范等各種關(guān)鍵技術(shù)進(jìn)行深入研究。論文對進(jìn)程的內(nèi)存分布、緩沖區(qū)溢出攻擊的基本原理、攻擊種類以及預(yù)防方法進(jìn)行了詳細(xì)介紹,對當(dāng)前主流的緩沖區(qū)溢出攻擊防御方法進(jìn)行了敘述,歸納總結(jié)了緩沖區(qū)溢出防御的基本方法。有效地防范軟件系統(tǒng)的緩沖區(qū)溢出漏洞攻擊涉及各種復(fù)雜的技術(shù)和方法,開發(fā)者需要綜合運(yùn)用各種防御方法,從多個(gè)層面和多種角度出發(fā),實(shí)現(xiàn)緩沖區(qū)溢出漏洞攻擊的有效防御。但是到目前為止還沒有一個(gè)完整的針對緩沖區(qū)溢出攻擊的解決方法,軟件開發(fā)者需要清晰地意識到緩沖區(qū)溢出攻擊的普遍性和危害性,在編程時(shí)增強(qiáng)安全意識,養(yǎng)成良好的編寫安全應(yīng)用程序的思想,寫出高質(zhì)量的軟件,切除緩沖區(qū)溢出的根源。測試軟件時(shí)要全面和充分地進(jìn)行漏洞測試和分析。

        猜你喜歡
        程序
        給Windows添加程序快速切換欄
        電腦愛好者(2020年6期)2020-05-26 09:27:33
        試論我國未決羈押程序的立法完善
        失能的信仰——走向衰亡的民事訴訟程序
        “程序猿”的生活什么樣
        英國與歐盟正式啟動“離婚”程序程序
        基于VMM的程序行為異常檢測
        偵查實(shí)驗(yàn)批準(zhǔn)程序初探
        我國刑事速裁程序的構(gòu)建
        創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
        恐怖犯罪刑事訴訟程序的完善
        亚洲综合av永久无码精品一区二区| 日本福利视频免费久久久 | 国产亚洲中文字幕久久网 | 性高湖久久久久久久久| 无码国产亚洲日韩国精品视频一区二区三区 | 国产一区二区视频在线免费观看| 成年女人色毛片| 女同啪啪免费网站www| 国产免费视频一区二区| 漂亮人妻被强了中文字幕| 亚洲a∨无码男人的天堂| 欧美人成人亚洲专区中文字幕| 国产成人自拍小视频在线| 中文字幕午夜精品久久久| 永久黄网站免费视频性色| 欧美va免费精品高清在线| 国产av熟女一区二区三区老牛| 在线精品国产亚洲av蜜桃| 日韩人妻无码精品-专区| 亚洲V在线激情| 国产在线观看黄片视频免费| 婷婷成人丁香五月综合激情| 玩两个丰满老熟女| 久久AⅤ无码精品色午麻豆| 亚洲sm另类一区二区三区| 国产精品成人aaaaa网站| 99福利在线| 午夜一区二区三区在线观看| 欧美白人战黑吊| 国产女女精品视频久热视频| 亚洲AV日韩AV高潮喷潮无码| 久久久麻豆精亚洲av麻花| 中文字幕人妻无码一夲道| 国产乱人伦AV在线麻豆A| 中文字幕日韩精品中文字幕| 亚洲av中文无码乱人伦下载| 一卡二卡三卡视频| 亚洲国产精品美女久久久| 国产小视频在线看不卡| 精品久久久中文字幕人妻| 国产成人一区二区三区影院免费|