下面是一个简单的Shellcode
/******windows通过动态连接库来提供系统函数,就是调用dll
******开启一个command窗口******
*******************************************/
#include <windows.h>
int main()
{
LoadLibrary("msvcrt.dll");//装载msvcrt.dll,
system("command.com");//调用系统命令
return 0;
}
////////////////////////////////////////////
///////得到system()的地址
//系统的版本不一样,函数的地址就不一样.我的系统是03 server sp2
#include <stdio.h>
#include <windows.h>
int main
{
HMODULE hModule =LoadLibrary("msvcrt.dll");//加载动态连接库msvcrt.dll的句柄给hModule
FARPROC pAdd =GetProcAddress(hModule,"system");//system()地址
printf("0x%x\n",pAdd);
return 0;
}
运行之后输出system()地址为:0x77b8a083
注:系统不一样得出的system()函数地址也不一样
顺给出2000 sp4的system()地址:0x78018ebf
将上面的代码 system("command.exe");转换成汇编语言如下
#include <windows.h>
void main()
{
LoadLibrary("msvcrt.dll");
_asm
{
mov esp,ebp ;把ebp的内容送到esp中
push ebp ;保存ebp,esp-4
mov ebp,esp ;给ebp负值,将作为局部变量的基指针
xor edi,edi ;
push edi ;压入0,esp-4,作用是构造字符串的结尾\0
sub esp,08h ;加上上面的4字节总共有12字节"command.com",
这里为什么分配了12个字节,但是command.exe只有11个字节啊,难道还有一个结束符标志- -?
mov byte ptr [ebp-0ch],63h;
mov byte ptr [ebp-0bh],6fh;
mov byte ptr [ebp-0ah],6dh;
mov byte ptr [ebp-09h],6Dh;
mov byte ptr [ebp-08h],61h;
mov byte ptr [ebp-07h],6eh;
mov byte ptr [ebp-06h],64h;
mov byte ptr [ebp-05h],2Eh;
mov byte ptr [ebp-04h],63h;
mov byte ptr [ebp-03h],6fh;
mov byte ptr [ebp-02h],6dh;生成串"command.exe"
lea eax,[ebp-0ch];
push eax ;串地址作为参数入栈
mov eax,0x77b8a083
call eax ;调用 system()
add esp,0x11 ;堆栈平衡,
pop ebp;
}
}
如上的代码有一点要注意一下,push eax占4个字节,_asm{}内的前六行根据注释提示分配了12个字节,还有一个地方要注意就是这里“mov byte ptr [ebp-0ch],63h;”当“sub esp,08h”之后,共分配了12个字节,地址空间应该为0-11,就是0x0h-0xbh而下一句“mov byte ptr [ebp-0ch],63h;”是从0ch开始的,所以这里又多了一个字节的空间,那么倒数第二行add exp 0x11正好是17个字节。
至于如果改成“mov byte ptr [ebp-0bh],63h;”然后依次往下推一位,最后add esp,0x10,根据伙夫的说法应该是正确的,但是为什么不行呢?我不明白哈,谁能帮我解释下呢:) 恩,其实我有很多不明白的 :(
还有如果将上面的全部改成汇编的形式,针对LoadLibrary();
利用第二段代码如何取得LoadLibrary()在我的系统中的地址呢?
如果知道了 LoadLibrary("msvcrt.dll")的地址,那么对应的汇编代码是否如下
伪代码
_asm
{
mov esp,ebp ;把ebp的内容送到esp中
push ebp ;保存ebp,esp-4
mov ebp,esp ;给ebp负值,将作为局部变量的基指针
xor edi,edi ;
push edi ;压入0,esp-4,作用是构造字符串的结尾\0
sub esp,07h ;加上上面的4字节总共有11字节"msvcrt.dll
"(这段代码对吗 - -)
mov byte ptr [ebp-0bh],6Dh;
mov byte ptr [ebp-0ah],73h;
mov byte ptr [ebp-09h],76h;
mov byte ptr [ebp-08h],63h;
mov byte ptr [ebp-07h],72h;
mov byte ptr [ebp-06h],74h;
mov byte ptr [ebp-05h],2Eh;
mov byte ptr [ebp-04h],64h;
mov byte ptr [ebp-03h],6Ch;
mov byte ptr [ebp-02h],6Ch;生成串"msvcrt.dll"
lea eax,[ebp-0bh];
push eax ;串地址作为参数入栈
mov eax,LoadLibrary()地址;--
-------------------LoadLibrary()地址
call eax ;调用 system()
add esp,0x11 ;堆栈平衡,
pop ebp;
}
因为不知道怎么取得LoadLibrary()的地址,所以代码没有测试是否好用, - -!先谢谢大家了哈
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课