0
バッファオーバーフローを実行しようとしています。 EIPがシェルコードの最初の命令を指しているように思えます。しかし、GDBでこれを実行すると、SIGSEGVが生成され、なぜそれが理解できないのですか?ここでバッファオーバーフローが予想通りに機能しない
は、私のプログラムが終了したときの状況は次のようになります。
gdb$ run conf160
Program received signal SIGSEGV, Segmentation fault.
--------------------------------------------------------------------------[regs]
EAX: 0x90909090 EBX: 0x62413961 ECX: 0x00000000 EDX: 0xBFFFFAB0 o d I t S z a P c
ESI: 0x31624130 EDI: 0x41326241 EBP: 0x62413362 ESP: 0xBFFFFAE4 EIP: 0xBFFFFB21
CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007B
--------------------------------------------------------------------------[code]
=> 0xbffffb21: xor eax,eax
0xbffffb23: push eax
0xbffffb24: push 0x68732f2f
0xbffffb29: push 0x6141622f
0xbffffb2e: xor BYTE PTR [ecx+0x61],al
0xbffffb31: xor DWORD PTR [ecx+0x61],eax
0xbffffb34: xor al,BYTE PTR [ecx+0x61]
0xbffffb37: xor ebp,ecx
--------------------------------------------------------------------------------
0xbffffb21 in ??()
は、プログラムが0xbffffb21で命令を実行しないのはなぜ?
おかげ
簡単な答え:無効なメモリにアクセスしようとしました。私は、gdbには組み込みのメモリチェックなどがあるか、プロセッサのMPU(メモリ保護ユニット)を利用していることが分かります。正しく呼び出すと、無効なポインタが他の有効なコードとは別のページ境界にある場合に発生します。 – redxef
シェルコードがスタックにあると思いますか? – user3804799