これはプログラムです:
#include <stdio.h>
void test_function(int a, int b, int c, int d){
int flag;
flag = 31337;
}
int main(){
test_function(1,2,3,4);
}
GDB から:
Breakpoint 1, main () at stack_example.c:14
14 test_function(1,2,3,4);
(gdb) i r esp ebp eip
esp 0xffffcf88 0xffffcf88
ebp 0xffffcf98 0xffffcf98
eip 0x8048402 0x8048402 <main+6>
(gdb) cont
Continuing.
Breakpoint 2, test_function (a=1, b=2, c=3, d=4) at stack_example.c:8
8 flag = 31337;
(gdb) i r esp ebp eip
esp 0xffffcf70 0xffffcf70
ebp 0xffffcf80 0xffffcf80
eip 0x80483f3 0x80483f3 <test_function+6>
(gdb)
Dump of assembler code for function test_function:
0x080483ed <+0>: push ebp
x080483ee <+1>: mov ebp,esp
0x080483f0 <+3>: sub esp,0x10
=> 0x080483f3 <+6>: mov DWORD PTR [ebp-0x4],0x7a69
0x080483fa <+13>: leave
0x080483fb <+14>: ret
GDB から、EBP が main() の ESP と同じ値を持たないのはなぜですか? mov ebp, esp
EBP == にするべきではありません0xffffcf88
か? これにより、EBP が ESP に設定されると思いました。
編集:
私は自分の質問に答えたかもしれないと思います。私を修正してください。ESP は、リターン アドレスと保存されたフレーム ポインターがスタックにプッシュされるときに移動されます。
このESP
値は0xffffcf88
、2 つの値 (両方とも 4 バイト) がスタックにプッシュされる前のものです。その後、その値は0xffffcf88 - 0x8
==0xffffcf80
です。これがEBPの現在の価値です。次に ESP -= 0x10 です。
ESP の値はどのように変更されますか? のようなものmov ESP, ESP - 0x8
ですか?