同じメッセージについて他にも質問がありますが、特定の関数を呼び出す一連のマシンコードを実行しようとすると、特にこれに遭遇するようです。私の場合、exit(0)を呼び出します。これは、同じプログラムのCで通常どおりに呼び出された場合に正常に機能します。ただし、演習として、EIPをいくつかのマシンコード(「シェルコード」と呼ぶ場合があります)のアドレスに設定した場合、たとえば
const char code[] =
"\x6A\x00" // push 0"
"\xFF\x15\x00\x00\x00\x00" //system call, 'read access violation': call dword ptr [__imp__exit]
"\x5D" //pop ebp
"\xC3"; //ret
「アクセス違反の読み取り場所0x00000000」というメッセージが表示されます。「\x6A\ x00」命令は実行されますが、exit(0)を呼び出すとこの例外がスローされます。
これはVS2010で/GS-を使用してコンパイルされたCであり、実行権限で「シェルコード」を実行していますが、実行不可能なメモリやスタック保護がまだ行われていますか?この命令がエラーを引き起こすのはなぜですか?
int main()
{
void *exec = VirtualAlloc(0, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, code, sizeof(code));
//EIP = exec in debug->immediate
exit(0);
}