整理自《0day安全:软件漏洞分析技术》第2版
系统:VMware安装的Window XP SP2
工具:vc++6.0, ollydbg, Dependency Walker, python
步骤:通过内联汇编__asm实现功能,再在OllyDbg中提取对应字节码,最后转化为shellcode。
例1:
该程序弹出一个对话框,点击确认后程序退出执行
用到的两个函数MessageBox和ExitProcesss的地址通过dependency walker人工计算
ExitProcesss地址=0x7c800000+0x0001caa2 = 0x7c81caa2 (MessageBoxA类似)
另外,程序运行默认会加载kernel32.dll和ntdll.dll,不会加载user32.dll。但要调用MessageBoxA函数,必须显示加载user32.dll到内存空间。
#include <stdio.h>
#include <windows.h>
int main()
{
HINSTANCE libHandle;
libHandle = LoadLibraryA("user32.dll");
_asm{
sub sp,0x440 //抬高栈空间
xor ebx,ebx //ebx置零
push ebx //字符串的结尾'\0'
push 0x216f6c6c //压入字符串"hello!",栈向低地址空间增长
push 0x65680000
lea eax,[esp+2] //esp+2指向字符串首地址
push ebx //压入MessageBoxA的四个参数
push eax
push eax
push ebx
mov eax,0x77d5050b //MessageBoxA address
call eax
push ebx
mov eax,0x7c81caa2 //ExitProcess address
call eax
}
return 0;
}
在ollydbg中查看其字节码,并复制
用python处理这些字节码得到shellcode(可利用split函数和join()函数),最后shellcode测试程序如下
#include <stdio.h>
#include <windows.h>
char shellcode[]=
"\x66\x81\xEC\x40\x04\x33\xDB\x53\x68\x6C\x6C\x6F\x21\x68\x00\x00\x68\x65\x8D\x44\x24\x02\x53\x50\x50\x53\xB8\x0B\x05\xD5\x77\xFF\xD0\x53\xB8\xA2\xCA\x81\x7C\xFF\xD0";
int main()
{
HINSTANCE libHandle;
libHandle = LoadLibraryA("user32.dll");
_asm{
lea eax,shellcode
push eax
ret
}
return 0;
}
例2:
功能和上面一样,但为了使shel