从函数层面看栈溢出

0X0001:函数调用

int func_b(int b1,int b2)
{
  int var_b1,var_b2;
  var_b1 = b1+b2;
  var_b2 = b1-b2;
  return var_b1 * var_b2;
}
int func_a(int a1,int a2)
{
  int var_a;
  var_a = fuc_b(a1+a2);
  return var_a;
}
int main(int argc,char** argv,char **envp) //32位参数在栈上,逆向压参,后将call main的下一条指令压栈(作为返回地址)
{                 
  int var_main;  //保存ebp后,移动esp,建立空间,后已ebp作为基址(新的),保存局部变量(local variable),形式参数如3,4(逆向压参)
  var_main = func_a(4,3);
  return 0;
}

main(call)->fuc_a(call)->fuc_b(形成连续增长式栈空间)

int main()
{
welcome();//main->welcome()[welcome结束后栈清空]
log();//之后再开辟log()栈空间[在log无参数的状态下两者同ebp] main->log()
}           //来自pwnable.kr(passcode)的思考

posted @ 2020-03-10 07:54  zer0_1s  阅读(170)  评论(0编辑  收藏  举报