でリターンアドレスを見つけることができません私は(ちょうどデバッグ目的)Cにそのプログラムを書いた:はGDB
void return_input(void)
{
char array[10];
gets(array);
printf("%s\n", array);
}
main()
{
return_input();
return 0;
}
私はスタックオーバーフローで実験されており、それ以来私は働いています64ビットマシンの私はその後、gdbでのプログラムをデバッグ
gcc -m32 -mpreferred-stack-boundary=2 -ggdb overflow.c -o overflow
でそれをコンパイルし、return_input機能を分解し、私が得た:
0x0804841b <+0>: push %ebp
0x0804841c <+1>: mov %esp,%ebp
0x0804841e <+3>: sub $0xc,%esp
0x08048421 <+6>: lea -0xa(%ebp),%eax
0x08048424 <+9>: push %eax
0x08048425 <+10>: call 0x80482e0 <[email protected]>
0x0804842a <+15>: add $0x4,%esp
0x0804842d <+18>: lea -0xa(%ebp),%eax
0x08048430 <+21>: push %eax
0x08048431 <+22>: call 0x80482f0 <[email protected]>
0x08048436 <+27>: add $0x4,%esp
0x08048439 <+30>: nop
0x0804843a <+31>: leave
0x0804843b <+32>: ret
これは、リターンアドレスが0x0804843bされるべきであるとマーク(または、それはないですか?)ESPを調べるときしかし、にブレークポイントを設定した後(x/20x $esp
と(これは、64ビットマシン上でプログラムをコンパイルした32ビットであることを覚えています)返品先住所を見つけることができません:
0xffffd400: 0xffffd406 0x080481ec 0x08048459 0x00000000
0xffffd410: 0xffffd418 0x08048444 0x00000000 0xf7e195f7
0xffffd420: 0x00000001 0xffffd4b4 0xffffd4bc 0x00000000
0xffffd430: 0x00000000 0x00000000 0xf7fb0000 0xf7ffdc04
0xffffd440: 0xf7ffd000 0x00000000 0xf7fb0000 0xf7fb0000
返品先住所が表示されないのはなぜですか?長い質問を申し訳ありません。ありがとうございます。
あなたが取得した文字列はどれくらいフェッチされましたか?リターンアドレスを上書きするのは、悪意のあるコードを実行するためにバッファオーバーフローを使用する方法とまったく同じです... – StoryTeller
@StoryTeller私はすでに質問で言及したとおりです。私は、取得で休憩を設定し、まだ何も入力していない。問題は返信先が表示されないことです –
@StoryTellerその点について詳しく説明できますか? –