栈帧

TL;DR

  • 栈帧 stack frame

    前言

  • 主要通过od来跟踪调试一下,理解一下windows栈的调用情况。

    环境及代码

    环境win7 32位+vc6.0
    1
    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