




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、深 圳 大 學(xué) 實 驗 報 告 課 程 名 稱: 計算機系統(tǒng)(2) 實驗項目名稱: 緩沖區(qū)溢出攻擊實驗 學(xué) 院: 計算機與軟件學(xué)院 專 業(yè): 計算機科學(xué)與技術(shù) 指 導(dǎo) 教 師: 羅秋明 報告人: 實 驗 時 間: 2016年5月8日 實驗報告提交時間: 2016年5月22日 教務(wù)處制一、 實驗?zāi)繕?biāo):1. 理解程序函數(shù)調(diào)用中參數(shù)傳遞機制;2. 掌握緩沖區(qū)溢出攻擊方法;3. 進(jìn)一步熟練掌握GDB調(diào)試工具和objdump反匯編工具。二、實驗環(huán)境:1. 計算機(Intel CPU)2. Linux64位操作系統(tǒng)(CentOs)3. GDB調(diào)試工具4. objdump反匯編工具三、實驗內(nèi)容本實驗設(shè)計為一
2、個黑客利用緩沖區(qū)溢出技術(shù)進(jìn)行攻擊的游戲。我們僅給黑客(同學(xué))提供一個二進(jìn)制可執(zhí)行文件bufbomb和部分函數(shù)的C代碼,不提供每個關(guān)卡的源代碼。程序運行中有3個關(guān)卡,每個關(guān)卡需要用戶輸入正確的緩沖區(qū)內(nèi)容,否則無法通過管卡!要求同學(xué)查看各關(guān)卡的要求,運用GDB調(diào)試工具和objdump反匯編工具,通過分析匯編代碼和相應(yīng)的棧幀結(jié)構(gòu),通過緩沖區(qū)溢出辦法在執(zhí)行了getbuf()函數(shù)返回時作攻擊,使之返回到各關(guān)卡要求的指定函數(shù)中。第一關(guān)只需要返回到指定函數(shù),第二關(guān)不僅返回到指定函數(shù)還需要為該指定函數(shù)準(zhǔn)備好參數(shù),最后一關(guān)要求在返回到指定函數(shù)之前執(zhí)行一段匯編代碼完成全局變量的修改。實驗代碼bufbomb和相關(guān)工
3、具(sendstring/makecookie)的更詳細(xì)內(nèi)容請參考“實驗四 緩沖區(qū)溢出攻擊實驗.pptx”。本實驗要求解決關(guān)卡1、2、3,給出實驗思路,通過截圖把實驗過程和結(jié)果寫在實驗報告上。四、實驗步驟和結(jié)果步驟1 返回到smoke()1.1 解題思路首先弄清楚getbuf()的棧幀結(jié)構(gòu),知道存放字符數(shù)組buf地址的單元和存放getbuf()返回地址的單元之間相差多少個字節(jié)。假設(shè)兩者之間相差x個字節(jié)。然后找到smoke()函數(shù)的入口地址。該值為4個字節(jié)。再構(gòu)造exploit.txt,前x個字節(jié)隨意填,然后再填入4個字節(jié)的smoke()地址,注意是小端方式存儲。這樣操作完成,就可以得到預(yù)期結(jié)果
4、了。1.2 解題過程首先進(jìn)入GDB對bufbomb進(jìn)行調(diào)試,先在調(diào)用getbuf()處設(shè)置斷點,然后運行。注:此時的輸入文件exploit_raw.txt文件中是隨便填的,并不影響我調(diào)用smoke(),因為我會在gdb中使用set指令直接修改getbuf()的返回地址。此時查看運行程序的調(diào)用棧幀結(jié)構(gòu),如下所示:上圖說明當(dāng)getbuf()執(zhí)行完后,會返回到test()函數(shù)中(返回到地址0x08048db2,我們要修改存放這個值的地址單元,改為smoke的入口地址值)。分別進(jìn)入getbuf和test的幀中,查看esp的值,如下所示,它們兩個之間的差值就是getbuf的幀大小,為0x30。查看get
5、buf()的匯編代碼,可以知道函數(shù)getbuf()的幀(大小為0x30)的具體分配:返回地址4個字節(jié),將%ebp壓棧占去4個字節(jié),然后esp減去0x28。接著看方框2中的兩條指令可知,是在為調(diào)用Gets()函數(shù)構(gòu)造參數(shù),它將ebp偏移-0x18處的地址作為Gets的參數(shù),用作字符數(shù)組的buf地址。具體的結(jié)構(gòu)如下所示:由getbuf的棧幀結(jié)構(gòu)可得如下表格:輸入的字符數(shù)量被破壞的狀態(tài)0-11無12-23分配后但未使用的空間24-27保存的%ebp舊值28-31Getbuf的返回地址32+調(diào)用者test()的狀態(tài)在還沒有執(zhí)行Gets()時查看getbuf()的幀結(jié)構(gòu)里面存的值,如下所示: 黑色方框是
6、gets()函數(shù)讀取字符串所存放的地方,大小為12個字節(jié),藍(lán)色方框則是getbuf()的返回地址。使用objdump查看函數(shù)smoke()的入口地址,如下所示:由于我是隨便填的exploit_raw.txt(但是肯定字符小于12個),肯定不會破壞緩沖區(qū),getbuf執(zhí)行完了只會返回調(diào)用它的函數(shù)test中。但是我使用set指令將getbuf()的返回地址改成了smoke()的入口地址:然后繼續(xù)執(zhí)行程序,getbuf()執(zhí)行完就跳到smoke()函數(shù)中了,如下圖所示:執(zhí)行正確!現(xiàn)在已經(jīng)知道了getbuf()具體的棧幀結(jié)構(gòu),就可以構(gòu)造exploit.txt了可以知道,至少要輸入32個字符(即32個字
7、節(jié))才能把getbuf()的返回地址覆蓋掉。如下圖所示:其中前28個字節(jié)無所謂,可以隨便填,但最后4個字節(jié)一定要是smoke()的開始地址0x08048eb0。由于是采用小端方式存儲,所以改地址要寫成如下形式(低字節(jié)在前)。再將exploit.txt轉(zhuǎn)成exploit_raw.txt。1.3 最終結(jié)果截圖程序成功地跳到了smoke()函數(shù)中:步驟2 返回到fizz()并準(zhǔn)備相應(yīng)參數(shù)2.1 解題思路分析fizz()函數(shù),得到它需要一個參數(shù),為huanggang的cookie值。根據(jù)步驟1分析得到的getbuf棧幀結(jié)構(gòu),可以得到fizz()地址和cookie參數(shù)放在棧幀中的具體位置。再獲取fizz
8、()函數(shù)的入口地址和huanggang的cookie值,用于構(gòu)造exploit.txt。就可以運行了。2.2 解題過程Fizz()函數(shù)的匯編轉(zhuǎn)為C語言大致如下:即在調(diào)用fizz()函數(shù)之前,先要構(gòu)造一個參數(shù)cookie,分析棧幀結(jié)構(gòu),如下所示。Cookie參數(shù)存在 存放fizz()入口地址的單元 的上方。所以我們構(gòu)造exploit.txt時,需要36個字節(jié),其中前28個隨便填,第29到32個字節(jié)填fizz函數(shù)的入口地址值,第33到36字節(jié)填huanggang生成的cookie值。分別找出fizz()地址值和cookie值,如下所示:接著構(gòu)造exploit.txt,如下所示:再將exploit.
9、txt轉(zhuǎn)成exploit_raw.txt。2.3 最終結(jié)果截圖成功跳轉(zhuǎn)到fizz()函數(shù)中。步驟3 返回到bang()且修改global_value3.1 解題思路寫一段將cookie值賦給global_value,并進(jìn)入bang()函數(shù)的匯編指令,將其匯編再反匯編得到指令的二進(jìn)制代碼。再將得到的二進(jìn)制代碼通過Gets()函數(shù)存到數(shù)組buf的緩沖區(qū)中,與此同時,修改getbuf()的返回地址為buf的地址(即插入代碼的入口)。Gets()得到的字符串包含注入代碼,注入代碼的入口,以及一些填充用的字符。3.2 解題過程先找出bang()函數(shù)的地址值、變量global_value和cookie的地
10、址:使用gdb進(jìn)行調(diào)試,當(dāng)運行到getbuf()里面,并將Gets()執(zhí)行完后,使用set命令將函數(shù)getbuf()的返回地址值改為bang()的入口地址,并使用set命令將global_value的值設(shè)為cookie值。如下所示:然后運行,函數(shù)跳轉(zhuǎn)到bang()中,并且執(zhí)行正確。如下圖所示:程序運行情況已經(jīng)了解,接下來就需要構(gòu)建exploit.txt了。使用自己注入的代碼完成上面的set指令。編寫如下匯編代碼,功能:將cookie值賦給global_value,然后進(jìn)入函數(shù)bang()中。mov 0x0804ad4,%eax/把cookie值放到臨時寄存器中mov %eax,0x0804a1
11、c4/把臨時寄存器中的值賦給global_value。push $0x08048e10/把bang()函數(shù)的入口地址壓棧。ret/ 跳轉(zhuǎn)到注入代碼的首地址(即buf數(shù)組地址)使用gcc將其編譯成機器碼,再使用objdump進(jìn)行反匯編,操作如下:注意:在使用gcc編譯時加入-m32來要求生成32位機器碼,再反匯編。這樣就得到了注入指令的機器碼。注入代碼有16個字節(jié),我們需要覆蓋到buf地址開始后的32個字節(jié),才能修改getbuf()的返回地址。所以前16個字節(jié)為注入代碼,中間12個字節(jié)為填充字節(jié),隨便填,最后4個字節(jié)填注入代碼的入口地址,即數(shù)組buf的地址。構(gòu)造的exploit.txt文件如下:
12、Linux 內(nèi)存地址有隨機化機制,如果隨機化機制打開,那么每次運行程序,getbuf()函數(shù)中的字符數(shù)組 buf地址無法確定(注入代碼開始地址無法確定),這樣的話,注入代碼就無法正確寫入跳轉(zhuǎn)地址。所以需要先關(guān)閉Linux 內(nèi)存地址隨機化機制,才能完成實驗??梢酝ㄟ^設(shè)置kernel.randomize_va_space內(nèi)核參數(shù)來設(shè)置內(nèi)存地址隨機化的行為。3.3 最終結(jié)果截圖成功將global_value值設(shè)置為cookie值:五、實驗總結(jié)與體會通過本次實驗,加深了對函數(shù)調(diào)用時堆棧情況的了解,在步驟3中,開始怎么做也不對。然后查詢資料,發(fā)現(xiàn)Linux有內(nèi)存地址隨機化機制,因此在運行時,buf數(shù)組的首地址是不一樣的,即注入代碼首地址不能確定
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)村畜禽養(yǎng)殖場環(huán)保設(shè)施建設(shè)與管理指南與手冊
- 武漢冷鏈物流公司
- 包裝工程與設(shè)計作業(yè)指導(dǎo)書
- 跨境電商貨運險
- 企業(yè)合規(guī)經(jīng)營實踐指南
- 安全專項整治三年行動方案
- 江西雨水收集系統(tǒng)
- 新能源汽車充電保護(hù)
- 醫(yī)療行業(yè)醫(yī)療器械采購指南
- 智能家居控制系統(tǒng)展覽會
- 常用漢字3000個按使用頻率排序
- GB/T 912-2008碳素結(jié)構(gòu)鋼和低合金結(jié)構(gòu)鋼熱軋薄鋼板和鋼帶
- GB/T 26480-2011閥門的檢驗和試驗
- 中共一大會址
- 云南省煙草買賣合同(標(biāo)準(zhǔn)版)
- 2023個人獨資企業(yè)清算報告(精選4篇)
- 衛(wèi)生統(tǒng)計學(xué)(全套課件)
- 2021年6月浙江省高考讀后續(xù)寫課件-高考英語復(fù)習(xí)備考
- 小學(xué)古詩詞80首(硬筆書法田字格)
- 兒歌:媽媽過生日
評論
0/150
提交評論