2017-03-20 8 views
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で命令を実行しないのはなぜ?

おかげ

+1

簡単な答え:無効なメモリにアクセスしようとしました。私は、gdbには組み込みのメモリチェックなどがあるか、プロセッサのMPU(メモリ保護ユニット)を利用していることが分かります。正しく呼び出すと、無効なポインタが他の有効なコードとは別のページ境界にある場合に発生します。 – redxef

+0

シェルコードがスタックにあると思いますか? – user3804799

答えて

1

それがSIGSEGVを生成し、私は理由を理解していません。

あなたのスタックは実行可能ではありません。

ほとんどの最近のLinuxシステムは、デフォルトでリンカオプションを-z noexecstackにリンクすることで、スタック上の実行可能コードから保護しようとしています。

あなたはあなたのプログラムを実行することにより、このようにリンクされているかどうかを確認することができます。

readelf -Wl conf160 | grep GNU_STACK 

典型的な出力は、(それが重要である最後にRWです)、次のようになります。

GNU_STACK  0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 8 

も参照してくださいdocument

関連する問題