函数调用栈
当调用一个函数时:
假设使用call前各个寄存器的位置如下 :
[eip]=0xaabbccdd
[esp]=0xffffaadd
[ebp]=0xffffbb00
使用时:call func :push eip :[esp]=[esp]-4
mov (esp),[eip]
push ebp: [esp]=[esp]-4
mov (esp),[ebp]
mov [esp],[ebp]
[esp]的位置随着函数的变化而变化
此时各个寄存器:
[ebp]=[esp-8]=0xffffaac5
(ebp)=0xffffbb00 就是ebp开始的位置
leave : mov esp,[ebp]
pop ebp : [ebp]=(esp)0xffffbb00 就是第二步存在栈上的地址
[esp]=[esp]+4
ret : pop eip:[eip]=(esp) 就是esp这个位置的栈上的值
[esp]=[esp]+4
此时各个寄存器:
[ebp]=0xffffbb00
[eip]=0xaabbccdd
[esp]=0xffffaabb