赞
踩
这段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; }
产生这个问题的代码:
我原以为shellcode是在push时开始执行的,可是当我单步调试分析时,发现shellcode其实是在执行完 ret 后才开始执行的,??这个就很迷了。
以下是反汇编证据:
最开始的shellcode是分配在哪里的呢???为什么他去了一个稀奇古怪的天国???和代码段相差甚远!!啊啊啊,孩子,回家不好吗??
最开始我以为是自己写的汇编代码出错,但是后期发现,其实竟然是shellcode的邻居(即shellcode的下面一段代码),
等会,现在想想,他是不是因为回不来,停留在外面而报错呢??
刚刚调试,这个问题以外的没了,,,算了我还是把“邻居代码”贴出来吧。
如图,在call调用messagebox时发生了错误。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。