TL;DR
- 栈帧 stack frame
前言
- 主要通过od来跟踪调试一下,理解一下windows栈的调用情况。
环境及代码
环境win7 32位+vc6.01
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include "stdio.h"
long add(long a, long b)
{
long x = a, y = b;
return (x + y);
}
int main(int argc, char* argv[])
{
long a = 1, b = 2;
printf("%d\n", add(a, b));
return 0;
}
过程
在这之前,首先找到main函数,并加上一定的注释以及对应的断点。
1.首先是进入main函数之前,我们查看一下ebp的值是0012ff88,esp是0012ff50,注意此时下一条指令的地址是00401279,如下图
2.这个时候f7进入main函数,这个时候esp变成0012ff4c即减小了4,ebp不变
3.然后有一个跳转到push ebp,所以执行这个代码时候,ebp的值会入栈,esp的值加4,变成00112ff48
4.f8执行 mov ebp,esp命令,这个时候ebp的值发生变化,变成和esp一样的值都是0012ff48
5.f8执行 sub esp,48 扩展栈空间,esp减小48h个长度,ebp保持不变
6.f8 然后就是将ebx,esi,edi等入栈的操作等
。。。
7.函数的返回要注意清场,栈顶和栈底是一样的都是0012ff48
8.f8执行pop ebp,这个时候是将栈顶中的值0012ff88放到ebp中,那么ebp的值发生变化成为0012ff88,执行pop操作,esp+4 为0012ff4c
9.f8 执行retn指令,esp发生变化+4变为0012ff50,ebp的值为0012ff88,eip指向00401279,即call main函数的下一条指令执行
总结
- main函数的过程中,进入之前栈底指针ebp是0012ff88,栈顶指针是0012ff50,结束函数之后,没有发生变化,即栈维持这平衡。
reference
- 漏洞挖掘基础之格式化字符串
http://drops.xmd5.com/static/drops/papers-9426.html