自己对栈帧的理解

来源:互联网 发布:人工智能最顶尖科学家 编辑:程序博客网 时间:2024/06/05 13:34


1 当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈。当函数返回时,系统栈会弹出该函数所对应的栈帧。

 

2 ESP总是指向系统栈的顶部,EBP指向的是系统栈最上面一个栈帧的底部,底部存的第一个是ebp,这个ebp是上一个栈帧的底部

 

栈帧从底到高依次为:ebp(上一个栈帧的底部) ->当前函数的局部变量 ->要调用函数的实参 ->要调用函数的返回地址

 

3 修改邻接变量 & 修改函数返回地址都是通过让堆栈上的缓冲区溢出实现的,一个是覆盖变量值的内存单元,一个是覆盖堆栈上函数的返回地址

 

4 ASM中调用系统API可参照木马病毒中的代码

 

5 下图必须时刻牢记

 

函数进入时执行:

push ebp;是将上个栈底压栈,上个栈帧栈底的由来是根据上个函数入口的mov ebp,esp由来的

mov ebp,esp

sub esp,xxx

ebp在该函数中进行寻址,也指向了该函数的栈底,esp则是在函数内分配空间时会自动下移,随时指向栈顶

 

函数退出时执行:

mov esp,ebp

pop ebp

ret N

mov:将esp恢复到指向当前函数的栈底位置

pop:将ebp恢复到上个函数的栈底,此时esp指向了返回地址的位置

ret:将返回地址送入eip,这时esp指向调用该函数的实参位置,ret后面的N是实参所占的存储单元个数(若为8,则代表8个存储单元,共8个地址的64个字节,即两个四字节型变量),即esp+N,这样就实现了堆栈平衡



通过栈回溯进一步了解布局:



0 0
原创粉丝点击