堆栈cookie旁路演示2:虚拟函数调用 - 无法在VS2008中编译调试版本 - 0xC0000005:访问冲突读取位置

时间:2016-03-20 14:21:21

标签: c++ visual-studio visual-studio-2008

// gsvtable.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
class Foo {
  public:
  void __declspec(noinline) gs3(char* src)
  {
   char buf[8];
   strcpy(buf, src);
   bar(); // virtual function call
  }
   virtual void __declspec(noinline) bar()
   {
   }
 };
int main()
{
  Foo foo;
  foo.gs3(
  "AAAA"
  "BBBB"
  "CCCC"
  "DDDD"
  "EEEE"
  "FFFF");
 return 0;
}

当我尝试在Visual Studio 2008中编译上面的代码时,我得到了这个:

Unhandled exception at 0x004114f0 in gsvtable.exe: 0xC0000005: Access violation reading location 0x45454545.

当我点击中断时,它会中断:

11:    bar(); // virtual function call
004114ED 8B 45 F4         mov         eax,dword ptr [ebp-0Ch] 
==> 004114F0 8B 10            mov         edx,dword ptr [eax] 

寄存器:

EAX = 45454545 EBX = 7FFD9000 ECX = 00415758 EDX = 00000000 ESI = 00000000 
EDI = 0012FE84 EIP = 004114F0 ESP = 0012FD98 EBP = 0012FE84 EFL = 00000202 

45454545 = ???????? 

我的编译命令行参数:

/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Yu"stdafx.h" /Fp"Debug\gsvtable.pch" /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt

和链接器参数:

/OUT:"C:\Documents and Settings\pca\My Documents\Visual Studio 2008\Projects\gsvtable\Debug\gsvtable.exe" /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:"Debug\gsvtable.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"c:\Documents and Settings\pca\My Documents\Visual Studio 2008\Projects\gsvtable\Debug\gsvtable.pdb" /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

以上代码来自https://web.archive.org/web/20150425014136/https://www.corelan.be/index.php/2009/09/21/exploit-writing-tutorial-part-6-bypassing-stack-cookies-safeseh-hw-dep-and-aslr/部分"堆栈cookie旁路演示2:虚拟函数调用"我应该启用GS保护(默认情况下已启用)。

我做错了什么?我可以做些什么来编译这段代码,以便我可以在教程中继续学习?这个应用程序需要多少个参数?

搜索错误代码表示当指针未设置为任何内容时会发生某些事情。但它并没有让我更接近让这个应用程序编译。

1 个答案:

答案 0 :(得分:1)

45454545寄存器中的

EAX显然不是有效的内存地址。因此,移动该“地址”的内容会导致访问冲突。

原因是你将一个太长的字符串复制到buf的唯一8个字节。