緩沖區(qū)溢出攻擊與防范實驗報告_第1頁
緩沖區(qū)溢出攻擊與防范實驗報告_第2頁
緩沖區(qū)溢出攻擊與防范實驗報告_第3頁
緩沖區(qū)溢出攻擊與防范實驗報告_第4頁
緩沖區(qū)溢出攻擊與防范實驗報告_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、緩沖區(qū)溢出攻擊與防范實驗報告 計算機網(wǎng)絡(2)班 V200748045黃香娥1·緩沖區(qū)溢出的概念: 緩沖區(qū)溢出是指當計算機向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)時超過了緩沖區(qū)本身的容量溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上,理想的情況是程序檢查數(shù)據(jù)長度并不允許輸入超過緩沖區(qū)長度的字符,但是絕大多數(shù)程序都會假設數(shù)據(jù)長度總是與所分配的儲存空間想匹配,這就為緩沖區(qū)溢出埋下隱患.操作系統(tǒng)所使用的緩沖區(qū) 又被稱為"堆棧". 在各個操作進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現(xiàn)緩沖區(qū)溢出。2·緩沖區(qū)溢出的危害: 在當前網(wǎng)絡與分布式系統(tǒng)安全

2、中,被廣泛利用的50%以上都是緩沖區(qū)溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區(qū)溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數(shù)返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉并且執(zhí)行一段惡意代碼,比如得到shell,然后為所欲為。3·緩沖區(qū)溢出原理: 由一個小程序來看: /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進入"Step into"調(diào)試模式,如下:按F11跟蹤進入overflow,讓程序停在6,現(xiàn)在再看一下幾個主要參數(shù) :esp=0x0012ff30,eip發(fā)生了變化,其它未變。很顯然堆棧里壓了一個dword(4字節(jié))數(shù)據(jù),看看它是什么,打開memory窗口, 輸入esp,右擊窗口內(nèi)容,選"Long Hex Form

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

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

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

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

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

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

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ù)展示了一個能夠減少緩沖區(qū)溢出的正確編寫的函數(shù)的三個特性。首先,它要求調(diào)用者提

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

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

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

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

溫馨提示

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

評論

0/150

提交評論