生活随笔
收集整理的這篇文章主要介紹了
ShellCode的编写入门
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上次學習了下堆噴漏洞的原理,雖說之前有學習過緩沖區溢出的原理,但還沒了解過堆噴這個概念,于是趁此機會學習了,順便復習了緩沖區溢出這塊知識,之前由于各種原因對Shellcode的編寫只是了解個大概,并沒有真正動手寫過一個Shellcode。眼前遇到個堆噴漏洞找Shellcode時就下決定自己寫個Shellcode,考慮到時間和精力的有限就寫個計算器簡單的練練手。
注:以下在XP SP3+VC6.0編譯成功
一、首先寫個簡單的調用計算器的程序。
注:以下在XP SP3+VC6.0編譯成功
一、首先寫個簡單的調用計算器的程序。
#include?"windows.h"
int?main(){ ????LoadLibraryA("kernel32.dll");//4c801d7b????WinExec("calc.exe",SW_SHOW);???? ????return 0;} ? ? 二、將WinExec("calc.exe",SW_SHOW);轉化為匯編模樣。
? ? 在WinExec("calc.exe",SW_SHOW);處下斷點,點F5進行調試,運行到此處時程序會暫停下來,程序暫停后按Alt+8即可查看到對應的匯編代碼,經整理后如下:
點擊(此處)折疊或打開
#include?"windows.h"
int?main(){ ????LoadLibraryA("kernel32.dll");//4c801d7b????WinExec("calc.exe",SW_SHOW);?????__asm{????mov esi,esp????push 5????push offset?string?"calc.exe"?(0042201c)????call?dword ptr?[__imp__WinExec@8?(0042a14c)]????cmp esi,esp????call?__chkesp?(00401090)????}????return 0;} ?
? ? 稍微懂那么一丟丟匯編的童鞋都知道0042a14c處放著WinExec的地址,這里要注意WinExec的地址不是現在看到的0042a14c,要在地址為0042a14c放著的東東才是WinExec的地址。打個比方0042a14c是個指針,指針所指的地方才是真正需要的東東,所以我們要取出地址為0042a14c存放的數據。在VC6.0下按Alt+6可調出內存窗口,輸入0042a14c即可看到。
因此WinExec真正的地址是7C8623AD,注意,這里是要反過來讀取。
?
? ? 三、現在有了匯編模樣的語句和WinExec的地址,接下來就是要轉化為具有Shellcode的匯編代碼。在轉化匯編時先了解匯編下面是如何完成一個函數調用的:
????? ? 1、父函數將函數的實參按照從右至左順序壓入堆棧;
????? ? 2、CPU將父函數中函數調用指令Call XXXXXXXX的下一條指令地址EIP壓入堆棧;
????? ? 3、父函數通過Push Ebp將基地指針Ebp值東方鉭業堆棧,并通過Mov Ebp,Esp指令將當前堆棧指針Esp值傳給Ebp;
????? ? 4、通過Sub Esp,m(m是字節數)指令可以為存放函數中的局部變量開辟內存。函數在執行的時候如果需要訪問實參或局部變量,都可以通過EBP指針來指引完成。
?
????? ? 根據匯編調用函數特點,并使用壓棧的方法將參數傳遞進行,便可得到如下代碼:
?
點擊(此處)折疊或打開
#include?"windows.h"
int?main(){? ? LoadLibraryA("kernel32.dll");//4c801d7b????//WinExec("calc.exe",SW_SHOW);????????__asm????{ ????????push????ebp;????????mov????????ebp,esp;????????xor?eax,eax;????????push eax;????????sub?esp,08h;????????mov byte ptr?[ebp-0Ch],63h;?//c????????mov byte ptr?[ebp-0Bh],61h;?//a????????mov byte ptr?[ebp-0Ah],6Ch;?//l????????mov byte ptr?[ebp-09h],63h;?//c????????mov byte ptr?[ebp-08h],2Eh;?//.????????mov byte ptr?[ebp-07h],65h;?//e????????mov byte ptr?[ebp-06h],78h;?//x????????mov byte ptr?[ebp-05h],65h;?//e ????????lea eax,[ebp-0ch];????????push eax;????????????????????//將calc.exe壓入棧內 ????????mov????????eax,0x7C8623AD;????????call????eax;????????????????????//調用WinExec ????????mov esp,ebp;????????pop????ebp;????}????return 0;} ? ? 注意,字符串要以00H結束的哦,編譯運行OK~~
?
? ??
? ? 四、到這里已經完成最難的部分了,接下來的工作即是將匯編在內存中的代碼,即是Shellcode拷出來就是了。同樣,在匯編代碼任意一處下斷點,讓程序在斷點處停下來,按Alt+8即可看到程序所在的內存地址,再按Alt+6調出內存窗口即可。
將匯編代碼范圍內的東東全拷出來即得到傳說中的Shellcode,這就是程序運行在內存中的模樣了。一翻苦工后即可得到有Shellcode模樣的Shellcode,同理將LoadLibraryA同樣進行轉化即可得到一個完整的Shellcode。
????
點擊(此處)折疊或打開
//LoadLibraryA("kernel32.dll");
//WinExec("calc.exe",SW_SHOW);#include?"windows.h"unsigned char shellcode[]="x55x8BxECx33xC0x50x83""xECx09xC6x45xF3x6BxC6""x45xF4x65xC6x45xF5x72""xC6x45xF6x6ExC6x45xF7""x65xC6x45xF8x6CxC6x45""xF9x33xC6x45xFAx32xC6""x45xFBx2ExC6x45xFCx64""xC6x45xFDx6CxC6x45xFE""x6Cx8Dx45xF3x50xB8x7B""x1Dx80x7CxFFxD0x8BxE5""x33xC0x50x83xECx08xC6""x45xF4x63xC6x45xF5x61""xC6x45xF6x6CxC6x45xF7""x63xC6x45xF8x2ExC6x45""xF9x65xC6x45xFAx78xC6""x45xFBx65x8Dx45xF4x50""xB8xADx23x86x7CxFFxD0""x8BxE5x5D"; main(){????__asm????{????????lea ? ? eax,shellcode;????????call????eax;????}}
轉載于:https://www.cnblogs.com/milantgh/p/3616745.html
總結
以上是生活随笔為你收集整理的ShellCode的编写入门的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。