バッファオーバーフロー攻撃がどのように機能するかを調べ始め、Visual C2010を使用してWindows7での攻撃をシミュレートしようとしました。バッファオーバーフロー攻撃は非常に工夫されており、リターンアドレスを「バッファ」ローカル変数のアドレスに上書きするだけです。バッファはシェルコードの文字列を保持します。
Visual Studio 2010デバッグでプログラムを実行するかどうかに関係なく、プログラムはシェルコードにジャンプして実行を開始しますが、アクセス違反エラーが発生し、プログラムはシェルコードの実行を続行しません。
なぜこのエラーが発生するのですか?これは、Windowsのバッファオーバーフローに対するある種の保護ですか?
プログラムにバッファ内のシェルコードを実行させるにはどうすればよいですか?
編集:
ハンス(答え)は正しいです。これについては、Windows Internals 5thのセキュリティの章で説明されています。エラーの原因は、MicrosoftによるExecutableSpaceProtectionの実装です。
この質問が誰かを助けたなら、どんな賛成票もいただければ幸いです。
void execute_my_shellcode()
{
char buffer[24];
memcpy(buffer, "\x6A\x21\xFF\x15\x40\x62\x40\x00\x83\xC4\x04\x6A\x0A\xFF\x15\x40\x62\x40\x00\x83\xC4\x04\xC3", 24);
printf("current return address: %p\n", *(int*)((char*)&buffer + 24 + 4));
*(int*)((char*)&buffer + 24 + 4) = (int)&buffer;
printf("return address is now : %p\n\n", (int*)*(int*)((char*)&buffer + 24 + 4) );
}