網(wǎng)絡(luò)安全第五講_第1頁(yè)
網(wǎng)絡(luò)安全第五講_第2頁(yè)
網(wǎng)絡(luò)安全第五講_第3頁(yè)
網(wǎng)絡(luò)安全第五講_第4頁(yè)
網(wǎng)絡(luò)安全第五講_第5頁(yè)
已閱讀5頁(yè),還剩48頁(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、第五章第五章 緩沖區(qū)溢出攻擊緩沖區(qū)溢出攻擊5 5第五章 緩沖區(qū)溢出攻擊 5.1緩沖區(qū)溢出程序的原理及要素緩沖區(qū)溢出程序的原理及要素5.2 攻擊攻擊UNIX5.3 緩沖區(qū)溢出攻擊概述緩沖區(qū)溢出攻擊概述5 55.4攻擊攻擊Windows 緩沖區(qū)溢出是一種非常普遍、非常危險(xiǎn)的漏洞,在各種操作系統(tǒng)、應(yīng)用軟件中廣泛存在。利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)宕機(jī)、重新啟動(dòng)等后果。更為嚴(yán)重的是,可以利用它執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操作。5.15.1緩沖區(qū)溢出攻擊概述緩沖區(qū)溢出攻擊概述 緩沖區(qū)溢出攻擊有多種英文名稱:buffer overflow,buffer overr

2、un,smash the stack,trash the stack,scribble the stack,mangle the stack,memory leak,overrun screw;它們指的都是同一種攻擊手段。 第一個(gè)緩沖區(qū)溢出攻擊Morris蠕蟲,發(fā)生在1988年,它曾造成了全世界6000多臺(tái)網(wǎng)絡(luò)服務(wù)器癱瘓。5.15.1緩沖區(qū)溢出攻擊概述緩沖區(qū)溢出攻擊概述 緩沖區(qū)溢出攻擊概述緩沖區(qū)溢出攻擊概述 歷史上最著名的例子 1988年,美國(guó)康奈爾大學(xué)的計(jì)算機(jī)科學(xué)系研究生、23歲的莫里斯利用Unix fingerd程序不限制輸入長(zhǎng)度的漏洞,輸入512個(gè)字符后使緩沖器溢出,同時(shí)編寫一段特別大的

3、惡意程序能以root(管理員)身份執(zhí)行,并感染到其他機(jī)器上。 它造成全世界6000多臺(tái)網(wǎng)絡(luò)服務(wù)器癱瘓。參考:/wiki/Robert_Tappan_Morris/wiki/Blaster_%28computer_worm%295.15.1 1996 Aleph One,Smashing the Stack for Fun and Profit,Phrack 49 1998 Dildog:提出利用棧指針的方法完成跳轉(zhuǎn) The Tao of Windows Buffer Overflows 1999 Dark

4、Spyrit:提出使用系統(tǒng)核心DLL中的Jmp ESP指令完成跳轉(zhuǎn),Phrack 55 M.Conover:基于堆的緩沖區(qū)溢出教程5.15.1緩沖區(qū)溢出攻擊概述緩沖區(qū)溢出攻擊概述 2001年始,微軟的IIS5.0一系列的漏洞被發(fā)現(xiàn),其中不少漏洞是由于Unicode的處理問(wèn)題造成的,在攻擊利用的時(shí)候與Windows所支持的語(yǔ)言字符集密切相關(guān)。(Widechar的字符串緩沖區(qū)溢出攻擊技術(shù)) 2003年8月引起全球轟動(dòng)的“沖擊波”病毒及變種,也是利用Windows RPC服務(wù)的緩沖區(qū)溢出漏洞來(lái)進(jìn)行傳播的。 2004年5月的“震蕩波”病毒及變種也是利用了Windows系統(tǒng)的緩沖區(qū)漏洞。 目前5.15.

5、1緩沖區(qū)溢出攻擊概述緩沖區(qū)溢出攻擊概述 緩沖區(qū)溢出攻擊概述緩沖區(qū)溢出攻擊概述 定義 緩沖區(qū)溢出攻擊是一種通過(guò)往程序的緩沖區(qū)寫超出其長(zhǎng)度的內(nèi)容,造成緩沖區(qū)溢出,從而破壞程序的堆棧,使程序轉(zhuǎn)而執(zhí)行其他預(yù)設(shè)指令,以達(dá)到攻擊目的的攻擊方法。 分類 基于堆棧的緩沖區(qū)溢出(棧溢出) 基于堆/BSS的緩沖區(qū)溢出 整數(shù)溢出5.15.1 緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 緩沖區(qū)溢出程序的原理 眾所周知,C語(yǔ)言不進(jìn)行數(shù)組的邊界檢查。 在許多C語(yǔ)言實(shí)現(xiàn)的應(yīng)用程序中,都假定緩沖區(qū)的長(zhǎng)度是足夠的,即它的長(zhǎng)度肯定大于要拷貝的字符串的長(zhǎng)度。事實(shí)并非如此事實(shí)并非如此5.25.2 緩沖區(qū)溢出程序原理及要素緩沖區(qū)

6、溢出程序原理及要素5.25.2例例1:#include void function(char *str) char buffer 9; strcpy(buffer,str);void main() char *input=1234567890; function(input); 緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素5.25.2例例2:#includeint main() char name8; printf(please type your name:); gets(name); printf(hello,%s!,name); return 0; 在C語(yǔ)言中,指針和數(shù)組越界不保護(hù)是

7、Buffer overflow的根源。 在C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中存在像strcpy,gets這樣問(wèn)題的標(biāo)準(zhǔn)函數(shù)還有strcat(), sprintf()和scanf()等。 要透徹地理解這種攻擊方式,需要計(jì)算機(jī)體系架構(gòu)方面的基礎(chǔ)知識(shí),理解CPU、寄存器、內(nèi)存是怎樣協(xié)同工作而讓程序流暢執(zhí)行的。5.25.2緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 緩沖區(qū)溢出攻擊背景知識(shí)與技巧 進(jìn)程內(nèi)存空間結(jié)構(gòu) 匯編語(yǔ)言基本知識(shí) 棧的基本結(jié)構(gòu) 函數(shù)調(diào)用過(guò)程 編譯器5.25.2進(jìn)程內(nèi)存空間結(jié)構(gòu)進(jìn)程內(nèi)存空間結(jié)構(gòu) 根據(jù)不同的操作系統(tǒng),一個(gè)進(jìn)程可能被分配到不同的內(nèi)存區(qū)域去執(zhí)

8、行。但是不管什么樣的操作系統(tǒng)、什么樣的計(jì)算機(jī)架構(gòu),進(jìn)程使用的內(nèi)存都可以按照功能大致分成以下4個(gè)部分: 代碼區(qū):這個(gè)區(qū)域存儲(chǔ)著被裝入執(zhí)行的二進(jìn)制機(jī)器代碼,處理器會(huì)到這個(gè)區(qū)域取指并執(zhí)行。 數(shù)據(jù)區(qū):用于存儲(chǔ)全局變量等。進(jìn)程內(nèi)存空間結(jié)構(gòu)進(jìn)程內(nèi)存空間結(jié)構(gòu) 堆區(qū):進(jìn)程可以在堆區(qū)動(dòng)態(tài)地請(qǐng)求一定大小的內(nèi)存,并在用完之后歸還給堆區(qū)。 棧區(qū):用于動(dòng)態(tài)地存儲(chǔ)函數(shù)之間的調(diào)用關(guān)系,以保證被調(diào)用函數(shù)在返回時(shí)恢復(fù)到調(diào)用函數(shù)中繼續(xù)執(zhí)行。Linux進(jìn)程內(nèi)存空間結(jié)構(gòu)進(jìn)程內(nèi)存空間結(jié)構(gòu)17Linux進(jìn)程內(nèi)存空間進(jìn)程內(nèi)存空間 Highest zone (0 xc0000000-3G) 進(jìn)程環(huán)境參數(shù): env strings &

9、 pointers 進(jìn)程參數(shù): argv strings & pointers, argc 棧 存儲(chǔ)函數(shù)參數(shù)、本地參數(shù)和棧狀態(tài)變量 (返回地址, ) LIFO, 向低地址增長(zhǎng) 堆 動(dòng)態(tài)分配變量 (malloc) 向高地址增長(zhǎng) .bss: uninitialized data .data: static initialized data .text(0 x80000000): 指令, 只讀數(shù)據(jù)Win32進(jìn)程內(nèi)存空間進(jìn)程內(nèi)存空間19Win32進(jìn)程內(nèi)存空間進(jìn)程內(nèi)存空間 系統(tǒng)核心內(nèi)存區(qū)間 0 xFFFFFFFF0 x80000000 (4G2G) 為Win32操作系統(tǒng)保留 用戶內(nèi)存區(qū)間 0 x

10、000000000 x80000000 (0G2G) 堆: 動(dòng)態(tài)分配變量(malloc), 向高地址增長(zhǎng) 靜態(tài)內(nèi)存區(qū)間: 全局變量、靜態(tài)變量 代碼區(qū)間: 從0 x00400000開始 棧: 向低地址增長(zhǎng) 單線程進(jìn)程: (棧底地址: 0 x0012FFXXXX) 多線程進(jìn)程擁有多個(gè)堆/棧匯編語(yǔ)言基礎(chǔ)知識(shí)匯編語(yǔ)言基礎(chǔ)知識(shí)-寄存器寄存器匯編語(yǔ)言基礎(chǔ)知識(shí)匯編語(yǔ)言基礎(chǔ)知識(shí)-匯編指令匯編指令22棧的基本結(jié)構(gòu)棧的基本結(jié)構(gòu) 棧LIFO抽象數(shù)據(jù)結(jié)構(gòu) 用于實(shí)現(xiàn)函數(shù)或過(guò)程調(diào)用 相關(guān)寄存器 BP (Base Pointer) = FP (Frame Pointer): 當(dāng)前棧底指針 SP (Stack Pointer

11、): 當(dāng)前棧頂指針 相關(guān)操作 PUSH: 壓棧 POP: 彈棧23函數(shù)調(diào)用過(guò)程函數(shù)調(diào)用過(guò)程 函數(shù)調(diào)用過(guò)程的三個(gè)步驟 prologue: 保存當(dāng)前的?;?(ebp). call: 調(diào)用參數(shù)和返回地址(eip)壓棧,跳轉(zhuǎn)到函數(shù)入口 return (or epilogue): 恢復(fù)調(diào)用者原有棧函數(shù)調(diào)用示例函數(shù)調(diào)用示例 int func_B(int arg_B1, int arg_B2)int var_B1, var_B2;var_B1=arg_B1+arg_B2;var_B2=arg_B1-arg_B2;return var_B1*var_B2;int func_A(int arg_A1, int

12、 arg_A2)int var_A;var_A = func_B(arg_A1,arg_A2) + arg_A1 ;return var_A;int main(int argc, char *argv)int var_main;var_main=func_A(4,3);return var_main這段代碼編譯后,各個(gè)函數(shù)對(duì)應(yīng)的機(jī)器指令在代碼區(qū)中可能是這樣分布的(我們可以簡(jiǎn)單地把它們?cè)趦?nèi)存代碼區(qū)中的分布位置理解成是散亂無(wú)關(guān)的)。25GCC編譯器基礎(chǔ)編譯器基礎(chǔ) 最著名的GNU的Ansi c/c+編譯器 gcc options filenames 編譯: gcc -c test.c 生成 test

13、.o 連接: gcc -o test test.o 同時(shí)搞定: gcc test.c -o test make: 用于控制編譯過(guò)程 Makefile How To26GDB調(diào)試器的使用調(diào)試器的使用 斷點(diǎn)相關(guān)指令 break/clear, disable/enable/delete watch 表達(dá)式值改變時(shí),程序中斷 執(zhí)行相關(guān)指令 run/continue/next/step attach 調(diào)試已運(yùn)行的進(jìn)程 finish/return 信息查看相關(guān)指令 info reg/break/files/args/frame/functions/ backtrace 函數(shù)調(diào)用棧 print /f exp

14、 顯示表達(dá)式的值 x /nfu addr 顯示指定內(nèi)存地址的內(nèi)容 list 列出源碼 disass func 反匯編指定函數(shù)27VC6.0命令行命令行 環(huán)境變量 我的電腦屬性高級(jí)環(huán)境變量 PATH: C:Program FilesMicrosoft Visual StudioVC98Bin; C:Program FilesMicrosoft Visual StudioCommonMSDev98Bin; INCLUDE: C:Program FilesMicrosoft Visual StudioVC98Include LIB: C:Program FilesMicrosoft Visual S

15、tudioVC98Lib 命令行指令 cl sourcefilename 編譯并鏈接28Win32平臺(tái)調(diào)試器平臺(tái)調(diào)試器 OllyDbg1.10漢化版 32-bit assembler level analysing debugger by Oleh Yuschuk Free 支持插件機(jī)制 OllyUni: 查找跳轉(zhuǎn)指令功能 Softice IDA Pro 我們用gcc -S 來(lái)獲得匯編語(yǔ)言輸出,可以看到main函數(shù)的開頭部分對(duì)應(yīng)如下語(yǔ)句: pushl %ebp movl %esp,%ebp subl $8,%esp 首先把EBP保存下來(lái),然后EBP等于現(xiàn)在的ESP,這樣EBP就可以用來(lái)訪問(wèn)本函

16、數(shù)的局部變量。 之后ESP減8,就是堆棧向上增長(zhǎng)8個(gè)字節(jié),用來(lái)存放name數(shù)組?,F(xiàn)在堆棧的布局如下: 由于我們輸入的name字符串太長(zhǎng),name數(shù)組容納不下,只好向內(nèi)存頂部繼續(xù)寫A 。 由于堆棧的生長(zhǎng)方向與內(nèi)存的生長(zhǎng)方向相反,這些A覆蓋了堆棧的老的元素。 EBP,ret都已經(jīng)被A覆蓋了。 在main返回的時(shí)候,就會(huì)把 AAAA 的ASCII碼:0 x41414141作為返回地址,CPU會(huì)試圖執(zhí)行0 x41414141處的指令,結(jié)果出現(xiàn)錯(cuò)誤,這就是一次堆棧溢出。 緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 前面的例子中,只是隨便往緩沖區(qū)填入過(guò)長(zhǎng)的數(shù)據(jù)造成它溢出,越界的數(shù)據(jù)破壞了棧中相鄰變量

17、的值,甚至破壞棧幀中所保存的EBP值、返回地址等重要數(shù)據(jù),一般只會(huì)導(dǎo)致程序出錯(cuò)并終止。但是不能達(dá)到攻擊的目的。 如果想要利用緩沖區(qū)溢出的漏洞進(jìn)行攻擊又該怎么辦呢?緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 第一種方法: 通過(guò)溢出改寫鄰接變量,導(dǎo)致程序流程發(fā)生改變。 這種漏洞利用方法對(duì)代碼環(huán)境的要求相對(duì)比較苛刻。 例子:突破密碼驗(yàn)證程序。#include #define PASSWORD 1234567int verify_password (char *password) int authenticated; char buffer8; / add local buff to be ov

18、erflowed authenticated=strcmp(password,PASSWORD); strcpy(buffer,password); /over flowed here! return authenticated;void main() int valid_flag=0; char password1024; while(1) printf(please input password: ); scanf(%s,password); valid_flag = verify_password(password); if(valid_flag) printf(incorrect pa

19、ssword!nn); else printf(Congratulation! You have passed the verification!n); break; 這段代碼執(zhí)行到 int verify_password (char *password) 時(shí)的棧幀狀態(tài)如下圖所示。分析分析:在verify_password 函數(shù)的棧幀中,局部變量authenticated恰好位于緩沖區(qū)buffer8的“下方”。authenticated為int類型,在內(nèi)存中占4個(gè)字節(jié)。所以,如果能夠讓buffer數(shù)組越界,buffer8、buffer9、buffer10、buffer11將寫入相鄰的變量aut

20、henticated中。如果我們輸入的密碼超過(guò)了7個(gè)字符(注意:字符串截?cái)喾鸑ULL將占用一個(gè)字節(jié)),則越界字符的ASCII碼會(huì)修改掉authenticated的值。如果這段溢出數(shù)據(jù)恰好把a(bǔ)uthenticated改為0,則程序流程將被改變。緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 第二種方法: 修改程序的返回地址,讓它去執(zhí)行一段精心準(zhǔn)備的惡意代碼。 具體包括: 得到有問(wèn)題程序返回點(diǎn)的精確位置。 編寫一個(gè)惡意代碼。 將返回點(diǎn)的地址覆蓋成裝載有惡意代碼的地址。緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 上述攻擊中的“惡意代碼”被稱為

21、ShellCode或者Payload。 ShellCode的作用:獲得操作系統(tǒng)的操作權(quán)。 ShellCode的形式char shellcode =xebx18x5ex89x76x08x31xc0 x88x46x07x89x46x0cxb0 x0bx89xf3x8dx4ex08x8dx56x0cxcdx80 xe8xecxffxffxff/bin/sh;操作系統(tǒng)的操作系統(tǒng)的Shell 操作系統(tǒng)中用戶與操作系統(tǒng)的交互方式(通過(guò)命令行的方式) Linux中叫做“Shell”,一般為“/bin/sh” Windows中稱作“命令提示符”,為“cmd.exe” 因此ShellCode一般在操作系統(tǒng)She

22、ll中運(yùn)行命令 如:文件操作、帳號(hào)操作等 緩沖區(qū)溢出程序原理及要素緩沖區(qū)溢出程序原理及要素 關(guān)鍵技術(shù)在程序的地址空間安排適當(dāng)?shù)拇a(ShellCode的編寫)將控制程序轉(zhuǎn)移到攻擊代碼的方式 Function Pointers Overwrite(覆蓋函數(shù)指針) Activation Records(覆蓋函數(shù)調(diào)用的返回地址) Longjmp buffers(利用跳轉(zhuǎn)指令) 植入碼和流程控制(覆蓋函數(shù)棧) 可執(zhí)行的地址空間 代碼段/數(shù)據(jù)段/堆棧段SHELLCODE的定位的定位 在1999年之前,很多人提出了不少方法來(lái)定位ShellCode,但都不太精確。 例如, NNNNNNSSSSSSSSSSS

23、RRRRRRRR型。 適合于大緩沖區(qū),“N”代表空指令,在實(shí)際運(yùn)行中,程序?qū)⑹裁匆膊蛔?,而是一直沿著這些NOPS運(yùn)行下去,直到遇到不是NOPS的指令再執(zhí)行之;“S”代表ShellCode;“R”代表覆蓋的返回地址,思路是把返回地址R覆蓋為NOPS的大概位置,這樣就會(huì)跳到Nop中,然后繼續(xù)執(zhí)行,直到我們的ShellCode中。SHELLCODE的定位的定位 RRRRRRNNNNNSSSSS型。思路是用大量的“R”填滿整個(gè)緩沖區(qū),然后大量的Nop,最后是ShellCode。這里,“R”往后跳到Nop中,再順著往下執(zhí)行就會(huì)到ShellCode中。但在Windows下,“R”中必定會(huì)含有0,這樣,整個(gè)構(gòu)造就會(huì)被截?cái)?,只能用于Unix中。SHELLCODE的定位的定位 隨著技術(shù)的發(fā)展,1999年Dark Spyrit:提出使用系統(tǒng)核心DLL中的Jmp ESP指令完成跳轉(zhuǎn),Phrack 55。 適用于Windows,因?yàn)閃indows的系統(tǒng)核心dll包括kernel32.dll、user32.

溫馨提示

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