2016-03-20 8 views
0
// 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; 
} 

私は2008年のVisual Studioで上記のコードをコンパイルしようとすると、私はこの取得:スタッククッキーバイパスデモンストレーション2:仮想関数呼び出し - VS2008でデバッグビルドをコンパイルすることはできません - 0xc0000005で:アクセス違反読み取り場所

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/セクション「スタッククッキーバイパスデモンストレーション2:仮想関数呼び出し」からであるIを想定していますGS保護を有効にします(既定では既に有効になっています)。

私は間違っていますか?このコードをコンパイルするために私は何ができますか?チュートリアルに従ってください。このアプリケーションはいくつの引数を取るのですか?

エラーコードのグーグル表示は、ポインタが何も設定されていないときにエラーが発生したことを示します。しかし、それは私がこのアプリケーションをコンパイルすることに近づくことはできません。

+0

これはCではありませんが、C++ –

+0

このコードを*コンパイルする*または*実行中にエラーが発生していますか? – Moshe

+0

緑色の再生ボタンをクリックしてデバッグビルドを作成すると、このエラーが発生します。だから私はそれがコンパイル時であると仮定します。 – tnx

答えて

1

45454545EAXレジスタは明らかに有効なメモリアドレスではありません。したがって、その "アドレス"の内容を移動すると、アクセス違反が発生します。

原因は、長すぎる文字列を唯一の8バイトのbufにコピーすることです。

+0

さて、上のコードをコンパイルして、チュートリアルに従うためにwindbgで開くことはできますか? – tnx

+0

サンプルと同様に、デバッガを使用してコードとスタックをチェックします。 –

+0

@ paul-ogiliveしかし、最初に開くには、\ Debugフォルダに.exeファイルはありません。 – tnx

関連する問題