格式化字符串攻擊_第1頁(yè)
格式化字符串攻擊_第2頁(yè)
格式化字符串攻擊_第3頁(yè)
格式化字符串攻擊_第4頁(yè)
格式化字符串攻擊_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、信息系統(tǒng)應(yīng)用安全論文選題:格式化漏洞原理及攻擊專(zhuān)業(yè): 班級(jí): 學(xué)號(hào): 姓名: 指導(dǎo)老師: 時(shí)間:2012年4月28日目 錄一、選題背景3二、實(shí)驗(yàn)原理32.1什么是格式化字符串攻擊32.2經(jīng)典的格式化字符串漏洞32.3 C99標(biāo)準(zhǔn)定義的格式化字符串函數(shù)32.4系統(tǒng)棧的工作原理42.5攻擊原理5三、實(shí)驗(yàn)設(shè)計(jì)53.1實(shí)驗(yàn)?zāi)康?3.2實(shí)驗(yàn)設(shè)計(jì)思路53.3實(shí)驗(yàn)環(huán)境63.4實(shí)驗(yàn)所用到的工具63.4.1 microsoft visual c+ 6.063.4.2 Immunity Debugger6四、實(shí)驗(yàn)驗(yàn)證74.1系統(tǒng)棧的具體工作74.2 printf函數(shù)漏洞104.2.1用printf函數(shù)讀取內(nèi)存數(shù)據(jù)

2、104.2.2用printf向指定內(nèi)存寫(xiě)數(shù)據(jù)114.2.3用printf向指定內(nèi)存寫(xiě)入指定數(shù)據(jù)114.3攻擊之一利用漏洞植入shellcode124.3.1編寫(xiě)shellcode124.3.2編寫(xiě)程序134.3.3獲得shellcode存放的內(nèi)存地址144.3.4找到存放函數(shù)返回地址的內(nèi)存地址154.3.5將存放返回地址單元內(nèi)容修改為shellcode地址154.3.6實(shí)驗(yàn)結(jié)果164.4攻擊之二使緩沖區(qū)溢出16五、結(jié)論或總結(jié)17一、經(jīng)驗(yàn)17二、教訓(xùn)18六、參考文獻(xiàn)18一、選題背景格式化函數(shù)是一系列ANSI C 函數(shù) (如printf 函數(shù)),它們可以接受可變數(shù)量的參數(shù),其中一個(gè)稱(chēng)為格式化字符串

3、參數(shù) (format string )。格式化函數(shù)對(duì)輸入的格式化字符串參數(shù)進(jìn)行解釋?zhuān)鶕?jù)該參數(shù)的要求使用其它的輸入?yún)?shù),形成輸出的字符串。格式化字符串函數(shù)幾乎被用在所有的C程序中,用來(lái)輸出、打印錯(cuò)誤信息或處理字符串。正因?yàn)檫@些函數(shù)使用的廣泛性,它們的漏洞對(duì)系統(tǒng)安全有重要的影響。攻擊者利用格式化字符串漏洞可以獲得系統(tǒng)的控制權(quán),這一點(diǎn)對(duì)于高可信軟件和服務(wù)器軟件來(lái)說(shuō)是致命的。(引用格式化字符串漏洞研究)二、實(shí)驗(yàn)原理2.1什么是格式化字符串攻擊格式化字符串漏洞同其他許多安全漏洞一樣是由于程序員的懶惰造成的。也許有個(gè)程序員正在編寫(xiě)代碼,他的任務(wù)是:打印輸出一個(gè)字符串或者把這個(gè)串拷貝到某緩沖區(qū)內(nèi)。為了節(jié)約

4、時(shí)間和提高效率,他可能將代碼:printf(%s, str);省略為printf(str); printf的第一個(gè)參數(shù)無(wú)論如何都會(huì)輸出的!實(shí)際上他傳入的一個(gè)他想要逐字打印的字符串被printf函數(shù)解釋為一個(gè)格式化字符串(format string)。函數(shù)在其中尋找特殊的格式字符比如%d。如果碰到格式字符,一個(gè)變量的參數(shù)值就從堆棧中取出。這樣程序員在不知不覺(jué)中打開(kāi)了一個(gè)安全漏洞,可以讓攻擊者控制程序的執(zhí)行。很明顯,攻擊者至少可以通過(guò)打印出堆棧中的這些值來(lái)偷看程序的內(nèi)存。但是有些事情就不那么明顯了,這個(gè)簡(jiǎn)單的錯(cuò)誤允許向運(yùn)行中程序的內(nèi)存里寫(xiě)入任意值,這樣修改函數(shù)返回地址也就不是件困難的事了。2.2經(jīng)

5、典的格式化字符串漏洞表一常見(jiàn)的格式化漏洞2.3 C99標(biāo)準(zhǔn)定義的格式化字符串函數(shù) int fprintf(FILE *stream, const char *format, . . . ) 根據(jù)format提供的控制信息將輸出內(nèi)容輸出到stream; int printf(const char *format, . . . ) 根據(jù)format提供的控制信息將輸出內(nèi)容輸出到stdout; int sprintf(char *str, const char *format, . . . ) 根據(jù)format提供的控制信息將輸出內(nèi)容輸出到s,以0 結(jié)尾; int snprintf(char *st

6、r, size_t size, const char *format, . . . ) 將不大于size個(gè)字節(jié)的內(nèi)容輸出到str (包括結(jié)尾的0 ); vfprintf(FILE *stream, const char *format, va_list arg) vprintf(const char *format, va_list arg) vsprintf(char *str, const char *format, va_list arg) vsnprintf(char *str, size_t size, const char *format, va_list arg) 以上4個(gè)函數(shù)用

7、固定長(zhǎng)度的arg參數(shù)取代了原來(lái)的變長(zhǎng)參數(shù)表,其它功能分別與fprintf, printf, sprintf, snprintf相同。這些函數(shù)的工作機(jī)制大體相同,我研究針對(duì)的是printf函數(shù)的漏洞分析和攻擊。2.4系統(tǒng)棧的工作原理在windows平臺(tái)下,高級(jí)語(yǔ)言寫(xiě)出的程序經(jīng)過(guò)編譯鏈接,最終會(huì)變成PE文件,當(dāng)PE文件被裝載運(yùn)行后,就成了所謂的進(jìn)程。進(jìn)程使用的內(nèi)存可以按照功能分為下面4個(gè)部分: 1代碼段:存儲(chǔ)著執(zhí)行程序的二進(jìn)制機(jī)器代碼,計(jì)算機(jī)會(huì)到這個(gè)區(qū)域取指令并執(zhí)行。 2數(shù)據(jù)段:用于存儲(chǔ)全局變量、靜態(tài)變量等數(shù)據(jù)。 3堆區(qū):進(jìn)程可以在通過(guò) malloc 等函數(shù)動(dòng)態(tài)地在堆區(qū)申請(qǐng)一定大小的內(nèi)存,并在用完

8、之后釋放內(nèi)存。 由程序員申請(qǐng)和釋放,若程序結(jié)束而有些存儲(chǔ)單元還未釋放,則一般由操作系統(tǒng)釋放。4堆棧區(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)分配。ESP:棧指針寄存器,總是指向系統(tǒng)棧的棧頂EBP:基址寄存器,總是指向函數(shù)棧幀的棧底EIP:指令寄存器,總是指向下一條等待的指令機(jī)器上的堆棧被認(rèn)為是反向的,即堆棧是由高端地址向下增長(zhǎng)的。即當(dāng)一個(gè)信息被壓棧時(shí),ESP 減少,新元素被寫(xiě)入目標(biāo)地址,當(dāng)一個(gè)信息被彈出時(shí),則從ESP 指針?biāo)赶虻牡刂分凶x出一個(gè)元素,ESP 增加,向上邊界移動(dòng)并壓縮堆棧。當(dāng)調(diào)用函數(shù)

9、時(shí):1)參數(shù)入棧,參數(shù)從右向左依次壓入系統(tǒng)棧2)返回地址入棧,母函數(shù)調(diào)用處下一條指令的地址3)棧幀調(diào)整,包括EBP入棧,將ESP值裝入EBP,更新棧底部,ESP減去所需空間大小,抬高棧頂。當(dāng)函數(shù)返回時(shí):1)保存返回值2)彈出當(dāng)前棧幀,恢復(fù)下一個(gè)棧幀,包括將ESP加上棧幀的大小,降低棧頂,回收當(dāng)前棧,將當(dāng)前棧底部保存的前棧幀EBP彈入EBP寄存器,將返回地址彈給EIP寄存器3)跳轉(zhuǎn),回到母函數(shù)中繼續(xù)執(zhí)行。2.5攻擊原理傳統(tǒng)的緩沖區(qū)溢出攻擊只能覆蓋緩沖區(qū)相鄰的內(nèi)存地址。而格式化字符串漏洞攻擊幾乎可以改寫(xiě)任何內(nèi)存地址。因此,除了修改函數(shù)的返回地址以外,利用格式化字符串漏洞還可以有其它的攻擊目標(biāo)和方法

10、。例如: 改寫(xiě)GOT段7 ; 改寫(xiě).dtors段8 ; 改寫(xiě)函數(shù)指針9 ; 利用可變長(zhǎng)度數(shù)組10 ;此次實(shí)驗(yàn),我采用的基本方案是:由于printf函數(shù)漏洞,可以查看和修改內(nèi)存的值,我們利用該性能可以修改調(diào)用函數(shù)的返回值,如果修改為我們惡意代碼的地址值,那在函數(shù)調(diào)用返回值,就不再跳轉(zhuǎn)到母函數(shù)執(zhí)行,而是執(zhí)行我們的惡意代碼,這樣我們就控制了程序。三、實(shí)驗(yàn)設(shè)計(jì)3.1實(shí)驗(yàn)?zāi)康?、了解系統(tǒng)棧的工作流程,特別注意返回地址的存放細(xì)節(jié)。2、使用具體例子介紹利用格式化字符串漏洞的基本方法。這些例子并不是實(shí)際的系統(tǒng)攻擊程序,而是為了說(shuō)明格式化字符串漏洞而編寫(xiě)的說(shuō)明性程序。2、利用格式化字符串漏洞嘗試植入shellc

11、ode。3.2實(shí)驗(yàn)設(shè)計(jì)思路由系統(tǒng)棧的工作原理可以發(fā)現(xiàn)存在一個(gè)重要的問(wèn)題,即棧和其它內(nèi)存區(qū)域一樣,只是存儲(chǔ)某些內(nèi)容,而沒(méi)有一個(gè)標(biāo)簽說(shuō)明某個(gè)地址的內(nèi)容是否printf 的參數(shù)。printf只是根據(jù)格式化字符串參數(shù)的控制要求從棧上取得其它參數(shù)。如果格式化字符串參數(shù)被故意或不故意的寫(xiě)錯(cuò)了,那么printf 函數(shù)就可能被利用來(lái)對(duì)系統(tǒng)進(jìn)行攻擊。普通的緩沖區(qū)溢出就是利用了堆棧生長(zhǎng)方向和數(shù)據(jù)存儲(chǔ)方向相反的特點(diǎn),用后存入的數(shù)據(jù)覆蓋先前壓棧的數(shù)據(jù)。而格式化字符串漏洞是因?yàn)閜rintf的%d(%x、%f等)格式檢測(cè)功能,使得內(nèi)存被非法讀取,而利用%n使得內(nèi)存內(nèi)容被非法寫(xiě)入,若黑客寫(xiě)入的內(nèi)存單元恰好是函數(shù)的返回地址,

12、即覆蓋返回地址,那程序的流程將會(huì)改變,這樣,子函數(shù)返回時(shí)就跳到了攻擊者指定的地址,就可以按照攻擊者的意愿做任何事情了。于是可以確定這樣的實(shí)驗(yàn)思路:1、確定函數(shù)調(diào)用過(guò)程,通過(guò)反匯編,查看寄存器、內(nèi)存內(nèi)容確定函數(shù)在調(diào)用過(guò)程中的ESP、EBP、EIP的變換,從而清晰了解具體調(diào)用過(guò)程,為之后的攻擊打下良好的理論基礎(chǔ)。2、分析printf函數(shù)漏洞,通過(guò)構(gòu)造一些針對(duì)的格式化字符串,嘗試一些強(qiáng)有力的格式化字符串的用法,查看輸出結(jié)果。3、嘗試?yán)胮rintf函數(shù)漏洞,找到子函數(shù)返回的EIP地址,并更改該地址,即植入shellcode。shellcode為簡(jiǎn)單的彈出cmd對(duì)話框。3.3實(shí)驗(yàn)環(huán)境3.3.1主機(jī)操作

13、系統(tǒng):Window7旗艦版處理器:3.3.2虛擬機(jī)環(huán)境Vmwork station 8.0操作系統(tǒng):Windows xp3IDE:microsoft visual c+ 6.0(debug版本和release版本都有用過(guò))3.4實(shí)驗(yàn)所用到的工具3.4.1 microsoft visual c+ 6.01)工具概述Visual c+ 6.0由microsoft開(kāi)發(fā),不僅僅是c+編譯器,而且是基于windows操作系統(tǒng)的可視化集成開(kāi)發(fā)環(huán)境。2)工作原理microsoft visual c+6.0可以建立win32 console application工程。該集成開(kāi)發(fā)環(huán)境可以查看高級(jí)語(yǔ)言對(duì)應(yīng)的匯編

14、代碼,能查看寄存器、內(nèi)存等內(nèi)容,是比較好的開(kāi)發(fā)工具。利用microsoft visual c+6.0 tools 的depends工具查看系統(tǒng)提供的函數(shù)的入口地址,編寫(xiě)shellcode時(shí)需要用到。3.4.2 Immunity Debugger1)工具概述Immunity Debugger具有功能圖表的強(qiáng)大的用戶(hù)界面、為入侵滲透行業(yè)專(zhuān)門(mén)為堆創(chuàng)建而制作的第一個(gè)對(duì)分析工具,支持python應(yīng)用程序編程接口,很容易進(jìn)行擴(kuò)展。1)工具的安裝該工具需要安裝以下軟件:python-2.5.2py2exe-0.6.9.win332-py2.4Immunity Debugger setup2)工作原理有多個(gè)功

15、能模塊:memory map內(nèi)存地圖-查看內(nèi)容的分布log data,記錄使用日志cpu-thread,代碼段,顯示執(zhí)行的代碼register(fpu),顯示寄存器的值call stack of main thread,查看棧信息 四、實(shí)驗(yàn)驗(yàn)證4.1系統(tǒng)棧的具體工作圖1.1-程序代碼A1)編譯運(yùn)行后,將xiaorong.exe在Immunity Debugger中調(diào)試可以清楚得看到PE header、text、data、rsrc、reloc等節(jié)信息以及其對(duì)應(yīng)的內(nèi)存地址。圖1.2-內(nèi)存地圖數(shù)據(jù)區(qū)地址:0x00422000-0x00424000代碼區(qū)地址:0x00401000-0x00421000

16、堆棧區(qū)地址:0x0012E000-0x001300002)上面只是幫助我們理解PE文件,接下來(lái),在vc6.0中進(jìn)行反匯編進(jìn)行深入地了解系統(tǒng)棧的工作,如下圖是反匯編結(jié)果:char string指令:圖1.3-程序A的匯編代碼1查看數(shù)據(jù)區(qū):圖1.4-字符串存放的數(shù)據(jù)區(qū)可以看到內(nèi)存地址為0x00422048里存放的是“Hello World!”數(shù)據(jù),因此我們可以這樣理解代碼:將內(nèi)存地址為0x00422048里存放的是“Hello World!”數(shù)據(jù)以雙字為單位(最后一部分以字為單位)復(fù)制到棧區(qū)。指令執(zhí)行完后棧區(qū)ebp-10h的數(shù)據(jù)如下:(ebp=0x0012ff80)圖1.5-棧區(qū)內(nèi)容由此說(shuō)明在ma

17、in函數(shù)中,將局部變量string數(shù)組壓入了堆棧。printf();指令:圖1.6-程序A的匯編代碼2該步驟中首先獲得了string這個(gè)變量在堆棧中的偏移地址,即ebp-10h,壓入堆棧,然后將格式化字符串的偏移地址壓入堆棧。查看數(shù)據(jù)區(qū):圖1.7-格式化字符串所在的數(shù)據(jù)區(qū)發(fā)現(xiàn)格式化字符串的存放地址在0x0042201c中,這樣理解代碼:將格式串的存放地址壓入了棧中:棧頂(0x0012ff1c)存放的即是地址0x0042201c.圖1.8-棧區(qū)在格式化字符串入棧后就調(diào)用了printf函數(shù),函數(shù)地址為0x00401090,可以在代碼區(qū)找到:圖1.9-程序A的子函數(shù)匯編代碼可以看到printf函數(shù)調(diào)

18、用時(shí)首先將ebp入棧,再將現(xiàn)在的棧頂?shù)刂焚x給ebp,即創(chuàng)建新的棧幀,再將esp地址減0ch,需要說(shuō)明的是棧的生長(zhǎng)方向是向低地址生長(zhǎng)的,然后保護(hù)寄存器現(xiàn)場(chǎng),再開(kāi)始執(zhí)行功能。printf()查看format格式串在棧中的位置:(0x0012ff1c),可以發(fā)現(xiàn)后面的四個(gè)字節(jié)是string在棧中的地址(0x0012ff70)圖1.10-棧區(qū)根據(jù)format中 (%)的數(shù)目來(lái)依次顯示堆棧中format參數(shù)后面地址的內(nèi)容,每次根據(jù)%格式移動(dòng)相應(yīng)的字節(jié)數(shù)(如%s為4個(gè)字節(jié),%f為8個(gè)字節(jié)),因而打印結(jié)果為00000000和00000000。程序的執(zhí)行結(jié)果:圖1.11-執(zhí)行結(jié)果由上述過(guò)程可以看到函數(shù)的調(diào)用過(guò)

19、程中堆棧情況:堆棧地址棧中內(nèi)容(以地址為首址的雙字內(nèi)容)說(shuō)明棧頂0x0012ff1480 FF 12 00(值為0x0012FF80)調(diào)用printf()時(shí)保持的ebp0x0012ff1858 10 40 00(值為0x00401058)調(diào)用printf()時(shí)保持的eip0x0012ff1c1C 20 42 00(值為0x0042201c)String: %s , arg2: %#p , arg3: 格式字符串的地址0x0012ff2070 FF 12 00(值為0x0012ff70)“Hello World!”的地址0x0012ff20-0x0012FF70若干00000000或者ccccc

20、cccMain函數(shù)為局部變量多留出的棧內(nèi)存0x0012FF7048 65 6C 6C 存放“Hello World!”0x0012FF80C0 FF 12 00棧底表2-程序A中棧的使用情況4.2printf函數(shù)漏洞4.2.1用printf函數(shù)讀取內(nèi)存數(shù)據(jù)圖2.1-程序B的代碼第一個(gè)printf函數(shù)調(diào)用正確,而第二個(gè)printf函數(shù)缺少了輸出數(shù)據(jù)的變量列表,結(jié)果如何?編譯運(yùn)行時(shí)可得如下圖2.1:圖2.2-程序B的執(zhí)行結(jié)果分析:1、用Immunity Debugger調(diào)試時(shí)得到的結(jié)果也為上圖,很奇怪地出現(xiàn)了4223040這個(gè)隨機(jī)數(shù)串,經(jīng)分析知:4223040(10)= 00407040(16),

21、在Immunity Debugger中可以看到:即“a=%d,b=%d”的地址(不是“a=%d,b=%d,c=%d”!)圖2.3-在immunity debugger中的棧的情況2、為什么b=53,c=54了呢?在調(diào)用第一個(gè)printf函數(shù)時(shí),參數(shù)從右向左入棧,(包括格式控制符“a=%d,b=%d”的地址),棧的狀態(tài)如圖,在第二次調(diào)用printf函數(shù)時(shí),參數(shù)中少了輸入數(shù)據(jù)列表部分,故只壓入格式控制符參數(shù),即“a=%d,b=%d,c=%d”的地址。盡管沒(méi)有輸出數(shù)據(jù)列表,但系統(tǒng)按“格式控制符指明的方式輸出了棧中緊隨其后的三個(gè)DWORD值其一指向格式化字符串的指針4223040(10);其二,即為變

22、量a的值5的ascII碼為53;其三為變量b的值6,ascii變量的值為54,便依次輸出了。由此可以得出一個(gè)結(jié)論:printf函數(shù)針對(duì)沒(méi)有數(shù)據(jù)列表與其對(duì)應(yīng)的情況下,每一個(gè)%d都會(huì)解析成從棧上往回讀一個(gè)雙字!4.2.2用printf向指定內(nèi)存寫(xiě)數(shù)據(jù)printf的%n格式符用法:寫(xiě)入數(shù)據(jù)。這個(gè)格式符的作用是將在這格式符之前已經(jīng)打印出的字符個(gè)數(shù)寫(xiě)入到對(duì)應(yīng)的參數(shù)中。注意:這里的已經(jīng)打印出來(lái)的字符是指在該格式化字符串中,實(shí)際打印到控制臺(tái)的字符的數(shù)目。代碼如下:圖2.4-程序C的代碼說(shuō)明:在編譯運(yùn)行后,得到結(jié)果如下圖:可以看到在“a=53”有4個(gè)字符長(zhǎng)度,故b的值由54改為了4.圖2.5-程序C的執(zhí)行結(jié)果

23、4.2.3用printf向指定內(nèi)存寫(xiě)入指定數(shù)據(jù)由4.3可以知道寫(xiě)入內(nèi)存的數(shù)據(jù)大小等于%n之前的格式字符串輸出的字符個(gè)數(shù),該格式符之前已經(jīng)打印出的字符個(gè)數(shù)寫(xiě)入到對(duì)應(yīng)的參數(shù)中。然后我們?cè)鯓涌刂苝rintf()已輸出的的字符數(shù)量就可以決定數(shù)據(jù)大小了。一般地址值都是比較大的數(shù)字,難道為了寫(xiě)內(nèi)存,我們要輸入浩大的數(shù)量的字符么?這時(shí)printf()的域?qū)捳f(shuō)明字符派上了大用處,比如printf(%100d,i);以100字符寬度輸出整數(shù)i。而用printf(%.100f,i)的形式則是以100位的小數(shù)輸出i;于是可以編寫(xiě)代碼如下:圖2.6-程序D的代碼編譯運(yùn)行結(jié)果:圖2.7-程序D的執(zhí)行結(jié)果說(shuō)明:“a=”再

24、加上以60字符寬度輸出整數(shù),故共62個(gè)字符輸出到控制臺(tái),因此,b=62。4.3攻擊之一-利用漏洞植入shellcode由系統(tǒng)棧的工作過(guò)程可知,在函數(shù)調(diào)用完成后有一個(gè)關(guān)鍵的值-EIP,因?yàn)镋IP,讓程序轉(zhuǎn)到母函數(shù)的代碼中執(zhí)行,如果在此期間,我們修改保持的EIP的值,讓其為我們存放shellcode的地址,這樣程序就可以直接轉(zhuǎn)到shellcode中執(zhí)行了!因此我們要解決的問(wèn)題:編寫(xiě)一定功能shellcode,并將其以二進(jìn)制代碼的字符數(shù)組形式存放在內(nèi)存。寫(xiě)一段程序,涉及到子函數(shù)的調(diào)用。獲得我們編寫(xiě)的shellcode存放的內(nèi)存地址找到在函數(shù)調(diào)用中存放函數(shù)返回地址的內(nèi)存地址。利用printf函數(shù)將步中

25、找到的地址內(nèi)容改為第中獲得的地址。4.3.1編寫(xiě)shellcode1、shellcode 中LoadLibrary和system 函數(shù)的地址也可能因系統(tǒng)不同而不同。利用老師給的GetAddr.exe程序,在cmd中查看相關(guān)函數(shù)地址:圖3.1-查看系統(tǒng)函數(shù)地址2、修改老師給的shellcode模板中的相關(guān)地址后得到的代碼:圖3.2-編寫(xiě)shellcode代碼4.3.2編寫(xiě)程序圖3.3-編寫(xiě)程序代碼main函數(shù)調(diào)用function函數(shù)。預(yù)期效果為:在function函數(shù)調(diào)用返回時(shí)轉(zhuǎn)到執(zhí)行shellcode,而不是繼續(xù)執(zhí)行主函數(shù)的return函數(shù)。在后面的分析中將具體解釋在function函數(shù)中的3

26、個(gè)printf函數(shù)的作用。在vc6.0中進(jìn)入調(diào)試狀態(tài),選擇如下選項(xiàng),進(jìn)入?yún)R編代碼:圖3.4-進(jìn)入?yún)R編代碼4.3.3獲得shellcode存放的內(nèi)存地址在主函數(shù)中找到shellcode的地址:圖3.5-找到shellcode的首地址圖3.6-找到shellcode的末尾地址由圖可知存放shellcode的單元為:0x0012FF14-0x0012FF7E因此shellcode地址為0x0012FF14。4.3.4找到存放函數(shù)返回地址的內(nèi)存地址1、單步調(diào)試,查看代碼段:可知函數(shù)返回地址是0x00401EB圖3.7-查看函數(shù)的返回地址2、進(jìn)入call函數(shù)調(diào)用程序中:圖3.8-看到存放返回地址的內(nèi)存由

27、函數(shù)調(diào)用的過(guò)程可知在function函數(shù)中函數(shù)的返回地址在buff后。在匯編代碼中可以看到EBP-4為buff的地址,(EBP為0x0012FEB8),如此buff地址為0x0012FEB4,在初始化buff后在內(nèi)存中查看,可以發(fā)現(xiàn)里面內(nèi)容真的是字符1!由此我們確定的buff地址是正確的!在附近找尋返回地址0x00401EB,發(fā)現(xiàn)在8字節(jié)后出現(xiàn)了該字符串! 因此存放返回地址的單元為0x0012FEBC-0x0012FEBF.4.3.5將存放返回地址單元內(nèi)容修改為shellcode地址由4.3.3知shellcode的地址為0x0012FF14,因此在0x0012FEBC-0x0012FEBF(

28、由4.3.4知)單元應(yīng)分別改為 14 FF 12 00.現(xiàn)在關(guān)鍵是怎么改寫(xiě)這四個(gè)單元的內(nèi)容呢?當(dāng)然,用到了printf函數(shù):現(xiàn)在就分析在4.3.2中function函數(shù)中三個(gè)printf函數(shù)的功能:圖3.9-解釋程序代碼第一個(gè)printf是將值20(10)=14(16)寫(xiě)入buff+8,(buff=0x0012FEB4)即0x0012FEBC單元;第二個(gè)printf將值255(10)=FF(16)寫(xiě)入buff+9,即0x0012FEBD單元第三個(gè)printf將值18(10)=12(16)寫(xiě)入buff+10,即0x0012FEBE單元由4.2.3的實(shí)驗(yàn)可知這三個(gè)功能是可以實(shí)現(xiàn)的,由于00可以系統(tǒng)

29、自動(dòng)改,因此不需要再用printf函數(shù)(自己上機(jī)嘗試即可知道),因此地址成功改寫(xiě)。4.3.6實(shí)驗(yàn)結(jié)果編譯運(yùn)行,得到界面:如圖圖3.10-程序的開(kāi)始執(zhí)行結(jié)果在該界面彈出不到1s后出現(xiàn)界面:圖3.11-程序的其后的執(zhí)行結(jié)果-彈出cmd框說(shuō)明進(jìn)入了cmd窗口:輸入ipconfig圖3.12-使用cmd的ipconfig命令因此實(shí)驗(yàn)成功!4.4攻擊之二使緩沖區(qū)溢出可以使程序崩潰是最為簡(jiǎn)單的方式:圖4.1-程序E代碼本來(lái)執(zhí)行第一條sprintf語(yǔ)句時(shí)buffer1沒(méi)有溢出,內(nèi)容為:“ERR Wrong command:%512dmyshellcode”,%512dmyshellcode表面上看很短,它也的確不會(huì)溢出buffer1 ,但它利用了sprintf對(duì)格式化字符串%512d的解釋。所以在第二個(gè)sprintf中,buffer2將被溢出。而main 函數(shù)的返回地址與buffer2相鄰,隨著buffer2被溢出,該返回地址也被改寫(xiě)了。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論