栈学习(一)

以上是帧指针的示意图:下面是函数调用的示意图

字节差取决于程序位数,32位为4,64位为8

push ebp
mov  ebp,esp    //接下来开辟栈空间,和保存寄存器值,后者赋值前者

i386函数的标准进入和退出指令序列
push ebp
mov  ebp,esp
sub esp,x  //开辟栈空间,x个字节数 
push [reg1]
。。。。
push [regn]//保存必要参数
。。。。。。。//函数的实际内容
pop [regn]
。。。。
pop[reg1]
mov esp,ebp
pop ebp //两句经常用leave指令代替
ret  //取ebp之下的ret_address 返回(强调:这里指中整个函数结束后,如果此值被修改,只会在函数运行到ret是起作用,如'aaaa'则可能之前函数流程就被挟持,在之前就已经得到flag,之后返回不返回main意义不大)
posted @ 2020-03-14 10:16  zer0_1s  阅读(136)  评论(0编辑  收藏  举报