首先,希望路过的大佬可以拯救一下在门都不知道在哪的小白吧!感激不尽啊!!!
这段messagebox代码暂告一段落吧(啊啊啊啊,,我咋就这么笨呢),这一段代码,思来想去还是决定有太多的问题值得我去思考和探索了,这篇文章就当是对自己出现的问题的一个小记录吧,真的是太!!!
代码很简单,就是一个汇编调用messagebox的代码,然后汇编语言中执行没有问题,但是变成shellcode却出现了意想不到的问题。
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
char shellcode[]="\x50\x66\x81\xec\x54\x04\x33\xdb\x53\x68\x64\x63\x62\x61\x68\x68\x68\x67\x66\x65\x8b\xc4\x53\x50\x50\x53\xa1\xac\xa2\x42\x00\xff\xd0\x58\x83\xc4\x0c";
int main(int argc, char* argv[])
{
//把MessageBox所在的dll加载到程序空间
printf("begin\n");
HINSTANCE libHandle;
char *dll="user32.dll";
libHandle=LoadLibrary(dll);
/*
__asm
{
push eax
sub esp,0x454
xor ebx,ebx
push ebx
push 0x61626364
push 0x65666768
mov eax,esp
push ebx
push eax
push eax
push ebx
// call dword ptr[MessageBox]
mov eax, dword ptr[MessageBox]
call eax
pop eax
add esp, 12 ;这个是后期加上去用于平衡堆栈的
}
*/
__asm
{
lea eax,shellcode
push eax
ret
}
return 0;
}
问题1、shellcode是怎么执行的?
产生这个问题的代码:
我原以为shellcode是在push时开始执行的,可是当我单步调试分析时,发现shellcode其实是在执行完 ret 后才开始执行的,??这个就很迷了。
以下是反汇编证据:
问题二:shellcode的地址
最开始的shellcode是分配在哪里的呢???为什么他去了一个稀奇古怪的天国???和代码段相差甚远!!啊啊啊,孩子,回家不好吗??
问题三:与邻居代码争吵??
最开始我以为是自己写的汇编代码出错,但是后期发现,其实竟然是shellcode的邻居(即shellcode的下面一段代码),
等会,现在想想,他是不是因为回不来,停留在外面而报错呢??
刚刚调试,这个问题以外的没了,,,算了我还是把“邻居代码”贴出来吧。
问题四:Messagebox call时出现了错误。
如图,在call调用messagebox时发生了错误。