C4-1-2 緩沖區(qū)溢出漏洞-堆溢出_第1頁
C4-1-2 緩沖區(qū)溢出漏洞-堆溢出_第2頁
C4-1-2 緩沖區(qū)溢出漏洞-堆溢出_第3頁
C4-1-2 緩沖區(qū)溢出漏洞-堆溢出_第4頁
C4-1-2 緩沖區(qū)溢出漏洞-堆溢出_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1軟件安全

C4典型軟件漏洞機(jī)理分析2提綱4.1緩沖區(qū)溢出漏洞緩沖區(qū)與內(nèi)存分布棧溢出堆溢出格式化串漏洞4.2Web應(yīng)用程序漏洞Web應(yīng)用安全概述SQL注入漏洞34.1.3堆溢出

上一節(jié)介紹了棧溢出的原理及利用方法。但近年來,另一種基于緩沖區(qū)溢出的攻擊逐漸成為主流。這種新興的攻擊手法的目標(biāo)從棧轉(zhuǎn)移到了Windows的堆管理器。盡管基于堆的攻擊要比棧攻擊困難很多,但是相對于棧上的攻擊更加難以防范,所以基于堆的攻擊仍然持續(xù)增長。程序在內(nèi)存中的映像……文本(代碼)段數(shù)據(jù)段堆棧段內(nèi)存低地址內(nèi)存高地址內(nèi)存遞增方向初始化數(shù)據(jù)段非初始化數(shù)據(jù)段(BSS)堆(Heap)棧(stack)堆的增長方向棧的增長方向內(nèi)核數(shù)據(jù)代碼0x800000000x7FFFFFFFPEB&TEB系統(tǒng)DLL代碼段54.1.3.1堆的基本知識堆與棧的區(qū)別棧變量包含函數(shù)內(nèi)部的普通變量、數(shù)組等。使用時不需額外的申請操作,由系統(tǒng)維護(hù)。堆是在程序運(yùn)行時動態(tài)分配的內(nèi)存。堆需要使用專有的函數(shù)進(jìn)行申請。(如C語言中的malloc函數(shù)和C++中的new函數(shù)等)一般用一個堆指針來使用申請得到的內(nèi)存。使用完畢后需要將堆指針傳給堆釋放函數(shù)回收這片內(nèi)存,否則會造成內(nèi)存泄露。64.1.3.1堆與棧的區(qū)別74.1.3.1堆的結(jié)構(gòu)堆塊與堆表堆塊:堆區(qū)的內(nèi)存按不同大小組織成塊,以堆塊為單位進(jìn)行標(biāo)識。一個堆塊包括兩個部分:塊首和塊身。塊首是一個堆塊頭部的幾個字節(jié),用來標(biāo)識這個堆塊自身的信息(大小、空閑或占用等)。塊身是緊跟在塊首后面的部分,也是最終分配給用戶使用的數(shù)據(jù)區(qū)。84.1.3.1堆的結(jié)構(gòu)堆塊與堆表堆表:位于堆區(qū)的起始位置,用于索引堆區(qū)中所有堆塊的重要信息(包括位置、大小、空閑與否等)。堆表的數(shù)據(jù)結(jié)構(gòu)決定了整個堆區(qū)的組織方式,是快速檢索空閑塊、保證堆分配效率的關(guān)鍵。堆表可能會采用平衡二叉樹等高級數(shù)據(jù)結(jié)構(gòu)用于優(yōu)化查找效率(往往不止一種數(shù)據(jù)結(jié)構(gòu))。94.1.3.1堆的結(jié)構(gòu)堆塊空閑態(tài):堆塊被鏈入空鏈表中,由系統(tǒng)管理。占有態(tài):堆塊會返回一個由程序員定義的句柄,由程序員管理。104.1.3.1堆的結(jié)構(gòu)空閑堆塊比占有堆塊多出了兩個4字節(jié)的指針,這兩個指針用于鏈接系統(tǒng)中的其他空閑堆塊。114.1.3.1堆的結(jié)構(gòu)堆表在Windows中,占用態(tài)的堆塊被使用它的程序索引;而堆表只檢索所有空閑塊的堆塊。最重要的堆表有兩種:空閑雙向鏈表freelist(簡稱空表)快速單向鏈表lookaside(簡稱快表)124.1.3.1堆的結(jié)構(gòu)空表空閑堆塊的塊首中包含一對重要的指針,這對指針用于將空閑堆塊組織成雙向鏈表。根據(jù)大小不同,空表總共被分成128條134.1.3.1堆的結(jié)構(gòu)空表堆表區(qū)中有一個128項(xiàng)的數(shù)組,稱作空表索引(每項(xiàng)包含兩個指針,標(biāo)識一條空表)空閑堆塊的大小=索引項(xiàng)×8(字節(jié))144.1.3.1堆的結(jié)構(gòu)快表Windows用來加速堆塊分配而采用的一種堆表。也有128條,組織結(jié)構(gòu)與空表類似,只是其中的堆塊按照單鏈表組織。由于在堆溢出中一般不利用快表,故不作詳述。154.1.3.2堆溢出的利用基本原理與DWORDSHOOT堆管理系統(tǒng)的三類操作堆塊分配(將堆塊從空表中“卸下”)堆塊釋放(把堆塊“鏈入”空表)堆塊合并(將若干塊先從空表中“卸下”,修改塊首信息,把更新后的塊“鏈入”空表)這三類操作歸根到底都是對空表鏈的修改164.1.3.2堆溢出的利用堆溢出利用的精髓

用精心構(gòu)造的數(shù)據(jù)去溢出覆蓋下一個堆塊的塊首,使其改寫塊首中的前向指針(flink)和后向指針(blink),然后在分配、釋放、合并等操作發(fā)生時伺機(jī)獲得一次向內(nèi)存任意地址寫入任意數(shù)據(jù)的機(jī)會(ArbitraryDwordReset,又稱DwordShoot)。通過這個機(jī)會,可以控制設(shè)計(jì)的目標(biāo)(任意地址),選擇適當(dāng)?shù)哪繕?biāo)數(shù)據(jù),從而劫持進(jìn)程,運(yùn)行shellcode。174.1.3.2堆溢出的利用舉例:如何通過節(jié)點(diǎn)的拆卸產(chǎn)生DwordShoot

拆卸節(jié)點(diǎn)node時發(fā)生如下操作:

node->blink->flink=node->flink;

node->flink->blink=node->blink;

當(dāng)精心構(gòu)造的數(shù)據(jù)淹沒前向指針和后向指針時,如果在flink放入4字節(jié)的任意惡意數(shù)據(jù)內(nèi)容,在blink放入目標(biāo)地址,當(dāng)執(zhí)行以上操作時,導(dǎo)致目標(biāo)地址的內(nèi)容被修改為該4字節(jié)的惡意數(shù)據(jù)。184.1.3.2堆溢出的利用舉例:如何通過節(jié)點(diǎn)的拆卸產(chǎn)生DwordShoot

194.1.3.2堆溢出的利用根據(jù)攻擊目標(biāo)和4字節(jié)惡意數(shù)據(jù)內(nèi)容的不同,常見的攻擊組合方式有以下幾種:

204.1.4格式化串漏洞格式化串漏洞并不算緩沖區(qū)溢出漏洞。為了能夠?qū)⒆址?、變量、地址等?shù)據(jù)按照指定格式輸出,通常使用包含格式化控制符的常量字符串作為格式化串,然后指定用相應(yīng)變量來代替格式化串中的格式化控制符。printf(“a=%d,b=%d”,a,b);printf(“a=%d,b=%d”);214.1.4格式化串漏洞224.1.4格式化串漏洞格式符除了常見的d、f、u、o、x之外,還有一些指針型的格式符:s----參數(shù)對應(yīng)的是指向字符串的指針;

n----參數(shù)對應(yīng)的是一個整數(shù)型指針,將這個參數(shù)之前輸出的字符的數(shù)量寫入該格式符對應(yīng)參數(shù)指向的地址中。inta=0;printf(”1234567890%n”,&a);234.1.4格式化串漏洞適當(dāng)利用%p、%s、%n等格式符,一個精心構(gòu)造的格式化串即可實(shí)現(xiàn)對程序內(nèi)存數(shù)據(jù)的任意讀、任意寫,從而造成信息泄露、數(shù)據(jù)篡改和程序流程的非法控制這類威脅。該系列函數(shù)可能產(chǎn)生格式化串漏洞:printf,fprintf,sprintf,snprintf,v

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論