栈帧指esp和ebp两个寄存器所表示的内存空间称为改函数的栈帧。每一个函数调用都会形成新的栈帧。

首先,让我们来了解下程序的地址空间

栈帧的深入了解

以此代码展开讨论:

栈帧的深入了解


本次主要了解栈:

1:定义a,b变量

栈帧的深入了解

2:形参实例化:形参入栈(入到main函数的栈顶)

栈帧的深入了解

3.call命令

栈帧的深入了解

4.ebp入栈并和esp在同一位置

栈帧的深入了解

5.形成myadd的栈帧,定义myadd函数里的z变量

栈帧的深入了解

6:esp与ebp在同一位置

栈帧的深入了解

7.出栈到ebp

栈帧的深入了解

8.ret

栈帧的深入了解

9.恢复到最开始的栈帧

栈帧的深入了解

注:以上是栈帧过程,那我们学了栈帧有什么用呢....就用以下两个测试用例体现栈帧的用处

1.一个形参修改另一个形参

栈帧的深入了解

2.在连个函数之间利用栈帧插入另一个函数

栈帧的深入了解

注:出现程序崩溃的原因是因为:如果强行在两个函数之间插入另一个函数,如上图:调myadd 函数用的是call命令,call命令将会入栈,用ret返回,ret命令将会出栈;

调bug函数修改了eip地址,用ret返回,ret命令将会出栈(栈帧过程有详细说明),那么一次入栈,两次出栈,造成esp值错误,程序崩溃。

所以,避免程序崩溃,使esp值正确,在代码中加入_ _asm{ },指在c语言中植入汇编

栈帧的深入了解














栈帧的深入了解





相关文章:

  • 2021-11-07
  • 2022-02-05
  • 2021-11-03
  • 2021-08-03
  • 2021-08-29
  • 2021-07-23
  • 2021-04-04
猜你喜欢
  • 2021-05-10
  • 2021-06-26
  • 2021-05-29
  • 2022-01-20
  • 2022-12-23
  • 2022-03-08
  • 2021-10-23
相关资源
相似解决方案