バッファオーバーフローで遊んでみます。ここで eip の値で何が起こっているのかわかりません。
Cコードは次のとおりです。
void copy(char *arg) {
char msg[256];
strcpy(msg,arg);
}
それのためのアセンブリ:
0x804847d <copy+25>: call 0x8048368 <strcpy@plt>
0x8048482 <copy+30>: leave
0x8048483 <copy+31>: ret
「 _ \xAA\xBB\xCC\xDD」のような文字列を引数として入力し、最後の4バイトが$ebp以降の4バイトになるようにサイズを計算して入力します(実際のリターンアドレスを上書きするため)。そしてそれはうまくいくようです。
gdb で:
(break before strcpy)
x/2wx $ebp
0xbffffb38: 0xbffffb58 0x080484d2
n
(just after strcpy execution)
x/2wx $ebp
0xbffffb38: 0x80cdd189 0x080484b6
...
n
...
x/2wx $ebp
0xbffffb38: 0x80cdd189 0x080484b6
したがって、リターンアドレスは0x080484d2
で、オーバーフローした後は0x080484b6
です。これが私が望むものです。しかし、プログラムは終了します:「アドレス0x80cdd18dのメモリにアクセスできません」。
なぜ $eip が自分のアドレスに設定されなかったのかはわかりません。コードのアドレスが 0x08048 にあるためです... $ebp+4 がリターン アドレスを含む場所であると確信しています。
4 バイト小さい文字列でもう一度試してみたところ、今度は $ebp+4 ではなく $ebp が上書きされ、返された後、$eip は $ebp+4 に含まれる値に設定されました。
説明はありますか?