緩沖區(qū)溢出攻擊與防范實(shí)驗(yàn)報(bào)告_第1頁(yè)
緩沖區(qū)溢出攻擊與防范實(shí)驗(yàn)報(bào)告_第2頁(yè)
緩沖區(qū)溢出攻擊與防范實(shí)驗(yàn)報(bào)告_第3頁(yè)
緩沖區(qū)溢出攻擊與防范實(shí)驗(yàn)報(bào)告_第4頁(yè)
緩沖區(qū)溢出攻擊與防范實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、緩沖區(qū)溢出攻擊與防范實(shí)驗(yàn)報(bào)告 計(jì)算機(jī)網(wǎng)絡(luò)(2)班 V200748045黃香娥1·緩沖區(qū)溢出的概念: 緩沖區(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ū)溢出。2·緩沖區(qū)溢出的危害: 在當(dāng)前網(wǎng)絡(luò)與分布式系統(tǒng)安全

2、中,被廣泛利用的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,然后為所欲為。3·緩沖區(qū)溢出原理: 由一個(gè)小程序來(lái)看: /test.c#include "stdio.h" #include "stdlib.h" #include "string.h" void overflow(

3、void) char buf10; strcpy(buf,"0123456789123456789"); /end overflow int main(void) overflow(); return 0; /end main按F11進(jìn)入"Step into"調(diào)試模式,如下:按F11跟蹤進(jìn)入overflow,讓程序停在6,現(xiàn)在再看一下幾個(gè)主要參數(shù) :esp=0x0012ff30,eip發(fā)生了變化,其它未變。很顯然堆棧里壓了一個(gè)dword(4字節(jié))數(shù)據(jù),看看它是什么,打開(kāi)memory窗口, 輸入esp,右擊窗口內(nèi)容,選"Long Hex Form

4、at",當(dāng)前的堆棧頂內(nèi)容0x0040108d, 現(xiàn)在請(qǐng)看一下call overflow的下一行,如果找不到請(qǐng)從頭搜索"15:"字符串, 可以看到堆棧壓入的是call overflow的下一指令地址,也就是我們通常說(shuō)的"函數(shù)返回地址"。 再按F11(執(zhí)行push ebp),再看一下幾個(gè)主要參數(shù):esp=0x0012ff2c,現(xiàn)在堆棧頂中是ebp的值0x0012ff80, 現(xiàn)在在看寄存器中只有eip變成了紅色,即發(fā)生了變化,其他的幾個(gè)參數(shù)均沒(méi)有變!很顯然堆棧里壓了一個(gè)dword(4字節(jié))數(shù)據(jù),看看它是什么,打開(kāi)memory窗口, 輸入esp,右擊窗

5、口內(nèi)容,選"Long Hex Format",再按F11(執(zhí)行push ebp),再看一下幾個(gè)主要參數(shù):再按F11(執(zhí)行下面的語(yǔ)句),程序?qū)?dāng)前esp值保存在ebp中: mov ebp,esp 然后就開(kāi)始分配局部變量了,sub esp,4ch;分配了76(0x4c)個(gè)字節(jié),隨后的7句指令:將這76個(gè)字節(jié)以dword(4)為單位填充為0xcccccccc,共填充76/4=19(0x13)次讓我們?cè)趫?zhí)行完rep stos dword ptr edi時(shí)先停下來(lái).在watch窗口里加入eip和一個(gè)表達(dá)式 "ebp-0ch",會(huì)發(fā)現(xiàn)在"ebp-0ch&q

6、uot;和buf的地址一樣,這就是編譯程序在堆棧中為我們分配的局部?jī)?nèi)存變量的起始地址,在memory窗口里輸入ebp-0ch (變量起始地址),右擊窗口選"Byte Format",可以看到里面有12個(gè)字節(jié)是被0xcc填充過(guò)的.在watch窗口加入ebp和buf,并在memory窗口輸入"buf"看一下strcpy函數(shù)執(zhí)行以前的堆棧情況,選擇 "Long Hex Format",可以看到當(dāng)前的堆棧情況如下:再往下看,右擊選"Long Hex Format"看到它們分別是 0x0012ff80和0x0040108d,

7、這就是"老的ebp"和"函數(shù)返回地址",繼續(xù)跟蹤將執(zhí)行以下幾個(gè)動(dòng)作,恢復(fù)主要寄存器內(nèi)容,add esp 4ch銷(xiāo)毀了局部?jī)?nèi)存變量恢復(fù)老的ebp(這時(shí)堆棧頂?shù)膬?nèi)容為0x0040108d),再ret返回,ret相當(dāng)于執(zhí)行了一次"pop eip",并沒(méi)有這樣的指令,這是由系統(tǒng)自己來(lái)完成大的。執(zhí)行完這條指令后eip的內(nèi)容變?yōu)?x0040108d,這時(shí)已經(jīng)回到了主函數(shù)中,在主函數(shù)中將執(zhí)行幾乎同樣的動(dòng)作,最后完成程序執(zhí)行。4·防止緩沖區(qū)溢出: 緩沖區(qū)溢出主要是一個(gè) C/C+ 問(wèn)題。盡管在通常情況下它很容易修補(bǔ)。但它們?nèi)匀皇且环N對(duì)安全代碼

8、的威脅。不管是用戶也好,程序的攻擊者也好,當(dāng)提供的數(shù)據(jù)長(zhǎng)度大于應(yīng)用程序預(yù)期的長(zhǎng)度時(shí),便會(huì)發(fā)生緩沖區(qū)溢出,此時(shí)數(shù)據(jù)會(huì)溢出到內(nèi)部存儲(chǔ)器空間。有兩種緩沖區(qū)溢出不明顯且難以修復(fù)。一是開(kāi)發(fā)人員沒(méi)有預(yù)料到外部提供的數(shù)據(jù)會(huì)比內(nèi)部緩沖區(qū)大。溢出導(dǎo)致了內(nèi)存中其他數(shù)據(jù)結(jié)構(gòu)的破壞,這種破壞通常會(huì)被攻擊者利用,以運(yùn)行惡意代碼。二是數(shù)組索引錯(cuò)誤也會(huì)造成緩沖區(qū)下溢和超限,但這種情況沒(méi)那么普遍。請(qǐng)看以下 C+ 代碼片段: void DoSomething(char *cBuffSrc, DWORD cbBuffSrc) char cBuffDest32; memcpy(cBuffDest,cBuffSrc,cbBuffSr

9、c);問(wèn)題在哪里呢?事實(shí)上,如果 cBuffSrc 和 cbBuffSrc 來(lái)自可信賴的源(例如不信任數(shù)據(jù)并因此而驗(yàn)證數(shù)據(jù)的有效性和大小的代碼),則這段代碼沒(méi)有任何問(wèn)題。然而,如果數(shù)據(jù)來(lái)自不可信賴的源,也未得到驗(yàn)證,那么攻擊者(不可信賴源)很容易就可以使 cBuffSrc 比 cBuffDest 大,同時(shí)也將 cbBuffSrc 設(shè)定為比 cBuffDest 大。當(dāng) memcpy 將數(shù)據(jù)復(fù)制到 cBuffDest 中時(shí),來(lái)自 DoSomething 的返回地址就會(huì)被更改,因?yàn)?cBuffDest 在函數(shù)的堆棧框架上與返回地址相鄰,此時(shí)攻擊者即可通過(guò)代碼執(zhí)行一些惡意操作。彌補(bǔ)的方法就是不要信任用

10、戶的輸入,并且不信任 cBuffSrc 和 cbBuffSrc 中攜帶的任何數(shù)據(jù): void DoSomething(char *cBuffSrc, DWORD cbBuffSrc) const DWORD cbBuffDest = 32; char cBuffDestcbBuffDest; #ifdef _DEBUG memset(cBuffDest, 0x33, cbBuffSrc); #endif memcpy(cBuffDest, cBuffSrc, min(cbBuffDest, cbBuffSrc);此函數(shù)展示了一個(gè)能夠減少緩沖區(qū)溢出的正確編寫(xiě)的函數(shù)的三個(gè)特性。首先,它要求調(diào)用者提

11、供緩沖區(qū)的長(zhǎng)度。當(dāng)然,您不能盲目相信這個(gè)值!接下來(lái),在一個(gè)調(diào)試版本中,代碼將探測(cè)緩沖區(qū)是否真的足夠大,以便能夠存放源緩沖區(qū)。如果不能,則可能觸發(fā)一個(gè)訪問(wèn)沖突并把代碼載入調(diào)試器。在調(diào)試時(shí),您會(huì)驚奇地發(fā)現(xiàn)竟有如此多的錯(cuò)誤。最后也是最重要的是,對(duì) memcpy 的調(diào)用是防御性的,它不會(huì)復(fù)制多于目標(biāo)緩沖區(qū)存放能力的數(shù)據(jù)。5·實(shí)驗(yàn)環(huán)境: 要求如下:1. windows2000或者windowsXP操作系統(tǒng),不要安裝殺毒與防火墻軟件2. VC6.0開(kāi)發(fā)環(huán)境,OllyDbg調(diào)試工具3. 安裝有Xscan掃描工具以及Sniffer4.5網(wǎng)絡(luò)監(jiān)聽(tīng)工具4. 安裝有Foxmail郵件收發(fā)客戶端5. 安裝I

12、ceSword系統(tǒng)信息查看工具6. 安裝有灰鴿子遠(yuǎn)程控制軟件6·Foxmail5.0緩沖區(qū)溢出分析(1)FoxMail簡(jiǎn)介:是一個(gè)中文版電子郵件客戶端軟件,支持全部的 Internet 電子郵件功能。程序小巧,可以快速地發(fā)送,收取,解碼信件;遠(yuǎn)程郵件管理,瀏覽信件條目后再?zèng)Q定下載或直接刪除;此外還有本地郵箱加密功能,多地址簿功能,同時(shí)支持 MIME 和 UUEncode 郵件格式,支持 HTML 郵件直接查看(需安裝了IE),郵箱助理自動(dòng)分發(fā)新收到的郵件到不同的郵箱,支持多個(gè)郵箱帳戶,內(nèi)置 BIG5 碼與GB 碼轉(zhuǎn)換功能,直接閱讀或發(fā)送 BIG5 碼的郵件,可以從 Outlook、E

13、xchange 等導(dǎo)入/導(dǎo)出郵件,支持 message/partial 格式郵件,自動(dòng)重組被分割的郵件,包含郵箱監(jiān)視器 Notifier,等等。(2)Foxmail5.0緩沖區(qū)溢出過(guò)程: 先新建一個(gè)郵件,保存為test.eml。用文本編輯器打開(kāi)該郵件,設(shè)置From:字段內(nèi)容為400個(gè)字節(jié),由重復(fù)的0123456789構(gòu)成,然后用foxmail導(dǎo)入,就會(huì)發(fā)現(xiàn)出現(xiàn)異常。如圖所示: 由圖可以看出,出現(xiàn)了0x36353433寫(xiě)錯(cuò)誤,這個(gè)地址換成字符也就是6543,這說(shuō)明郵件頭不僅僅已經(jīng)覆蓋了EIP,還覆蓋了一些變量,導(dǎo)致函數(shù)返回時(shí)候恢復(fù)這些變量不對(duì),結(jié)果就寫(xiě)錯(cuò)誤,我們可以嘗試逐步縮短郵件頭,不要覆蓋E

14、IP后面的數(shù)據(jù),經(jīng)試驗(yàn)會(huì)發(fā)現(xiàn)整個(gè)From字段為266時(shí)候,出現(xiàn)了如圖下圖的結(jié)果:從圖中可以看出,當(dāng)前的EIP被覆蓋為0x39383736了,這個(gè)時(shí)候只需要將該地址數(shù)值設(shè)置為0x7ffa4512就可以跳轉(zhuǎn)到JMP ESP了。將郵件頭最后的四個(gè)字節(jié)修改為0x7ffa4512,用OllyDbg調(diào)試工具打開(kāi)foxmail,在0x7ffa4512地址設(shè)置執(zhí)行斷點(diǎn),經(jīng)驗(yàn)證,會(huì)發(fā)現(xiàn)導(dǎo)入郵件時(shí)候會(huì)中斷在這里,繼續(xù)往下執(zhí)行,會(huì)發(fā)現(xiàn)到了ESP所指向的地址,而該地址前面也就是所填充的From數(shù)據(jù)內(nèi)容。由此可知,可以將ShellCode直接放置在0x7ffa4512后面,重新導(dǎo)入,執(zhí)行。在用OllyDbg調(diào)試過(guò)程中會(huì)發(fā)現(xiàn)如果EIP地址后面跟的ShellCode太長(zhǎng),就會(huì)寫(xiě)異常,最后調(diào)整可知,EIP后面只能跟4字節(jié)才能正確實(shí)現(xiàn)JMP ESP跳轉(zhuǎn)。這就意味著ShellCode不能跟在EIP后面。可以采取變通的方法,EIP后面的四個(gè)字節(jié)替換為JMP指令,將ShellCode放在EIP前面,由JMP轉(zhuǎn)到She

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論