一種緩沖區(qū)溢出檢測(cè)方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明提供一種緩沖區(qū)溢出檢測(cè)方法,應(yīng)用于信息安全領(lǐng)域,包括以下步驟:當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù);通過(guò)HOOK惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出。通過(guò)實(shí)施本發(fā)明的技術(shù)方案,實(shí)現(xiàn)了緩沖區(qū)溢出的有效檢測(cè)。
【專利說(shuō)明】一種緩沖區(qū)溢出檢測(cè)方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于信息安全領(lǐng)域,尤其涉及一種緩沖區(qū)溢出檢測(cè)方法及系統(tǒng)。
【背景技術(shù)】
[0002]1988年11月,許多組織不得不因?yàn)椤癕orris蠕蟲(chóng)”而切斷Internet連接,“Morris螺蟲(chóng)”是23歲的程序員Robert Tappan Morris編寫(xiě)的用于攻擊VAX和Sun機(jī)器的程序。據(jù)有關(guān)方面估計(jì),這個(gè)程序大約使得整個(gè)Internet的10%崩潰。2001年7月,另一個(gè)名為“Code Red”的螺蟲(chóng)病毒最終導(dǎo)致了全球運(yùn)行微軟的IIS Web Server的300,000多臺(tái)計(jì)算機(jī)受到攻擊。2003年I月,“Slammer” (也稱為“Sapphire”)螺蟲(chóng)利用Microsoft SQLServer2000中的一個(gè)缺陷,使得南韓和日本的部分Internet崩潰,中斷了芬蘭的電話服務(wù),并且使得美國(guó)航空訂票系統(tǒng)、信用卡網(wǎng)絡(luò)和自動(dòng)出納機(jī)運(yùn)行緩慢。所有這些攻擊以及其他許多攻擊,都利用了一個(gè)稱為緩沖區(qū)溢出的程序缺陷。
[0003]緩沖區(qū)溢出是指當(dāng)計(jì)算機(jī)向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)時(shí)超過(guò)了緩沖區(qū)本身的容量溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上,理想的情況是程序檢查數(shù)據(jù)長(zhǎng)度并不允許輸入超過(guò)緩沖區(qū)長(zhǎng)度的字符,但是絕大多數(shù)程序都會(huì)假設(shè)數(shù)據(jù)長(zhǎng)度總是與所分配的儲(chǔ)存空間相匹配,這就為緩沖區(qū)溢出埋下隱患.操作系統(tǒng)所使用的緩沖區(qū)又被稱為〃堆棧在各個(gè)操作進(jìn)程之間,指令會(huì)被臨時(shí)儲(chǔ)存在〃堆?!ó?dāng)中,〃堆?!ㄒ矔?huì)出現(xiàn)緩沖區(qū)溢出。
[0004]在當(dāng)前網(wǎng)絡(luò)與分布式系統(tǒng)安全中,被廣泛利用的50%以上都是緩沖區(qū)溢出,其中,最著名的例子是1988年利用fingerd漏洞的蠕蟲(chóng)。而緩沖區(qū)溢出中,最為危險(xiǎn)的是堆棧溢出,因?yàn)槿肭终呖梢岳枚褩R绯?,在函?shù)返回時(shí)改變返回程序的地址,讓其跳轉(zhuǎn)到任意地址,帶來(lái)的危害一種是程序崩潰導(dǎo)致拒絕服務(wù),另外一種就是跳轉(zhuǎn)并且執(zhí)行一段惡意代碼,比如得到shell,然后為所欲為。
[0005]截止到當(dāng)前,CVE收錄基于Microsoft Windows操作系統(tǒng)的緩沖區(qū)溢出漏洞達(dá)472個(gè),利用緩沖區(qū)溢出漏洞可以攻擊操作系統(tǒng)以及應(yīng)用程序,嚴(yán)重危害信息安全。
【發(fā)明內(nèi)容】
[0006]本發(fā)明提供一種緩沖區(qū)溢出檢測(cè)方法及系統(tǒng),以解決上述問(wèn)題。
[0007]本發(fā)明提供一種緩沖區(qū)溢出檢測(cè)方法,上述方法包括以下步驟:
[0008]當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù);
[0009]通過(guò)Η00Κ惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出。
[0010]本發(fā)明還提供一種緩沖區(qū)溢出檢測(cè)系統(tǒng),包括:調(diào)用裝置、判斷裝置;調(diào)用裝置與判斷裝置連接;
[0011]所述調(diào)用裝置,用于當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù);
[0012]所述判斷裝置,用于通過(guò)Η00Κ惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出。[0013]通過(guò)實(shí)施本發(fā)明的技術(shù)方案,實(shí)現(xiàn)了緩沖區(qū)溢出的有效檢測(cè)。
【專利附圖】
【附圖說(shuō)明】
[0014]此處所說(shuō)明的附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā)明的示意性實(shí)施例及其說(shuō)明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中:
[0015]圖1所示為本發(fā)明實(shí)施例1的緩沖區(qū)溢出檢測(cè)流程圖;
[0016]圖2所示為本發(fā)明實(shí)施例2的溢出檢測(cè)系統(tǒng)結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0017]下文中將參考附圖并結(jié)合實(shí)施例來(lái)詳細(xì)說(shuō)明本發(fā)明。需要說(shuō)明的是,在不沖突的情況下,本申請(qǐng)中的實(shí)施例及實(shí)施例中的特征可以相互組合。
[0018]本發(fā)明的核心思想是:
[0019]當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù);通過(guò)HOOK惡意代碼調(diào)用的系統(tǒng)API函數(shù),檢查系統(tǒng)API函數(shù)的返回地址,如果返回地址在系統(tǒng)API函數(shù)調(diào)用棧上,或者返回地址所在虛擬內(nèi)存頁(yè)是非protect,說(shuō)明了發(fā)生了堆棧溢出,也就是緩沖區(qū)溢出。
[0020]本發(fā)明提供了一種緩沖區(qū)溢出檢測(cè)方法,包括以下步驟:
[0021]當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù);
[0022]通過(guò)HOOK惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出。
[0023]其中,當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù)的過(guò)程為:Shell codeCall Win32 系統(tǒng) API 函數(shù)即 LoadLibraryW ;其中,LoadLibraryff 為函數(shù)名。
[0024]其中,通過(guò)HOOK惡意代碼調(diào)用的系統(tǒng)API函數(shù)的過(guò)程為:通過(guò)動(dòng)態(tài)鏈接庫(kù)DLL使用 Microsoft Detours 庫(kù),Η00Κ 操作系統(tǒng)關(guān)鍵的 API 函數(shù)即 Η00Κ — LoadLibraryW。
[0025]其中,檢查系統(tǒng)API函數(shù)的返回地址之前,還包括:注入dll到被檢測(cè)的進(jìn)程中。
[0026]其中,通過(guò)Η00Κ惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出的過(guò)程為:
[0027]若返回地址在系統(tǒng)API函數(shù)調(diào)用棧上,或者返回地址所在虛擬內(nèi)存頁(yè)是非protect,則緩沖區(qū)溢出。
[0028]其中,在Η00Κ處理函數(shù)中,根據(jù)esp/rsp寄存器獲取到調(diào)用的系統(tǒng)API函數(shù)的返回值retAddr并根據(jù)retAddr的情況,判斷被檢測(cè)進(jìn)程是否存在緩沖溢出:
[0029]情況一:檢查返回地址retAddr所在的虛擬內(nèi)存頁(yè)面是否為protecte page,如果不是,則存在緩沖區(qū)堆溢出,調(diào)用ExitPiOcess結(jié)束被檢測(cè)進(jìn)程;
[0030]情況二:獲取當(dāng)前函數(shù)調(diào)用堆棧棧底地址StackBottomAddr和棧頂?shù)刂稴tackTopAddr,如果返回地址retAddr在這兩個(gè)地址的區(qū)間,則存在緩沖區(qū)棧溢出,調(diào)用ExitProcess結(jié)束被檢測(cè)進(jìn)程;
[0031]情況三:其他情況直接返回。
[0032]圖1所示為本發(fā)明實(shí)施例1的緩沖區(qū)溢出檢測(cè)流程圖,詳細(xì)說(shuō)明如下:
[0033]步驟101:Shell code(惡意代碼)Call(調(diào)用)Win32 系統(tǒng)API 函數(shù)(LoadLibraryW);其中,LoadLibraryff為函數(shù)名;[0034]步驟102:通過(guò)DLL(Dynamic Link Library,動(dòng)態(tài)鏈接庫(kù))使用Microsoft Detours庫(kù),HOOK操作系統(tǒng)關(guān)鍵的API函數(shù)即HOOK — LoadLibraryff ;
[0035]步驟103:注入dll到被檢測(cè)的進(jìn)程中;
[0036]步驟104:在Η00Κ處理函數(shù)中,根據(jù)esp/rsp寄存器獲取到調(diào)用的系統(tǒng)API函數(shù)的返回值retAddr并根據(jù)retAddr的情況,判斷被檢測(cè)進(jìn)程是否存在緩沖溢出:
[0037]情況一:檢查返回地址retAddr所在的虛擬內(nèi)存頁(yè)面是否為protecte page,如果不是,則存在緩沖區(qū)堆溢出,調(diào)用ExitPiOcess結(jié)束被檢測(cè)進(jìn)程。
[0038]情況二:獲取當(dāng)前函數(shù)調(diào)用堆棧棧底地址StackBottomAddr和棧頂?shù)刂稴tackTopAddr,如果返回地址retAddr在這兩個(gè)地址的區(qū)間,則存在緩沖區(qū)棧溢出,調(diào)用ExitProcess結(jié)束被檢測(cè)進(jìn)程。
[0039]情況三:其他情況直接返回。
[0040]圖2所示為本發(fā)明實(shí)施例2的溢出檢測(cè)系統(tǒng)結(jié)構(gòu)圖,包括:調(diào)用裝置201、判斷裝置202 ;調(diào)用裝置201與判斷裝置202連接;
[0041]所述調(diào)用裝置201,用于當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù);
[0042]所述判斷裝置202,用于通過(guò)Η00Κ惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出。
[0043]其中,所述調(diào)用裝置201,還用于當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù)的過(guò)程為:Shell code Call Win32系統(tǒng)API函數(shù)即LoadLibraryW ;其中,LoadLibraryff 為函數(shù)名。
[0044]其中,所述判斷裝置202,還用于通過(guò)Η00Κ惡意代碼調(diào)用的系統(tǒng)API函數(shù)的過(guò)程為:通過(guò)動(dòng)態(tài)鏈接庫(kù)DLL使用Microsoft Detours庫(kù),Η00Κ操作系統(tǒng)關(guān)鍵的API函數(shù)即Η00Κ—LoadLibraryW0
[0045]其中,所述判斷裝置202,還用于通過(guò)Η00Κ惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出的過(guò)程為:若返回地址在系統(tǒng)API函數(shù)調(diào)用棧上,或者返回地址所在虛擬內(nèi)存頁(yè)是非protect,則緩沖區(qū)溢出。
[0046]通過(guò)實(shí)施本發(fā)明的技術(shù)方案,實(shí)現(xiàn)了緩沖區(qū)溢出的有效檢測(cè)。
[0047]以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種緩沖區(qū)溢出檢測(cè)方法,其特征在于,包括以下步驟: 當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù); 通過(guò)HOOK惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于:當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù)的過(guò)程為:Shell code Call Win32系統(tǒng)API函數(shù)即LoadLibraryW ;其中,LoadLibraryff 為函數(shù)名。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于:通過(guò)HOOK惡意代碼調(diào)用的系統(tǒng)API函數(shù)的過(guò)程為:通過(guò)動(dòng)態(tài)鏈接庫(kù)DLL使用Microsoft Detours庫(kù),HOOK操作系統(tǒng)關(guān)鍵的API函數(shù)即 HOOK — LoadLibraryW。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于:檢查系統(tǒng)API函數(shù)的返回地址之前,還包括:注入dll到被檢測(cè)的進(jìn)程中。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于:通過(guò)Η00Κ惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出的過(guò)程為: 若返回地址在系統(tǒng)API函數(shù)調(diào)用棧上,或者返回地址所在虛擬內(nèi)存頁(yè)是非protect,則緩沖區(qū)溢出。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于:在Η00Κ處理函數(shù)中,根據(jù)esp/rsp寄存器獲取到調(diào)用的系統(tǒng)API函數(shù)的返回值retAddr并根據(jù)retAddr的情況,判斷被檢測(cè)進(jìn)程是否存在緩沖溢出: 情況一:檢查返回地址retAddr所在的虛擬內(nèi)存頁(yè)面是否為protecte page,如果不是,則存在緩沖區(qū)堆溢出,調(diào)用ExitPiOcess結(jié)束被檢測(cè)進(jìn)程; 情況二:獲取當(dāng)前函數(shù)調(diào)用堆棧棧底地址StackBottomAddr和棧頂?shù)刂稴tackTopAddr,如果返回地址retAddr在這兩個(gè)地址的區(qū)間,則存在緩沖區(qū)棧溢出,調(diào)用ExitProcess結(jié)束被檢測(cè)進(jìn)程; 情況三:其他情況直接返回。
7.一種緩沖區(qū)溢出檢測(cè)系統(tǒng),其特征在于,包括:調(diào)用裝置、判斷裝置;調(diào)用裝置與判斷裝置連接; 所述調(diào)用裝置,用于當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù); 所述判斷裝置,用于通過(guò)HOOK惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出。
8.根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于:所述調(diào)用裝置,還用于當(dāng)發(fā)生緩沖區(qū)溢出時(shí),惡意代碼會(huì)調(diào)用系統(tǒng)API函數(shù)的過(guò)程為:Shell code Call Win32系統(tǒng)API函數(shù)即LoadLibraryff ;其中,LoadLibraryff 為函數(shù)名。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于:所述判斷裝置,還用于通過(guò)HOOK惡意代碼調(diào)用的系統(tǒng)API函數(shù)的過(guò)程為:通過(guò)動(dòng)態(tài)鏈接庫(kù)DLL使用Microsoft Detours庫(kù),HOOK操作系統(tǒng)關(guān)鍵的API函數(shù)即HOOK — LoadLibraryW。
10.根據(jù)權(quán)利要求9所述的系統(tǒng),其特征在于:所述判斷裝置,還用于通過(guò)Η00Κ惡意代碼調(diào)用的系統(tǒng)API函數(shù)并檢查系統(tǒng)API函數(shù)的返回地址并根據(jù)反饋地址,判斷緩沖區(qū)是否溢出的過(guò)程為:若返回地址在系統(tǒng)API函數(shù)調(diào)用棧上,或者返回地址所在虛擬內(nèi)存頁(yè)是非protect,則緩沖區(qū)溢出。`
【文檔編號(hào)】G06F21/52GK103559439SQ201310583180
【公開(kāi)日】2014年2月5日 申請(qǐng)日期:2013年11月19日 優(yōu)先權(quán)日:2013年11月19日
【發(fā)明者】方雪靜 申請(qǐng)人:浪潮(北京)電子信息產(chǎn)業(yè)有限公司