滴水逆向 Day05:函数嵌套调用的内存布局(图文版)

张开发
2026/4/20 2:49:19 15 分钟阅读

分享文章

滴水逆向 Day05:函数嵌套调用的内存布局(图文版)
0基础小白学逆向记录贴一起来学逆向。https://mp.weixin.qq.com/s/EPDY6i2-R-WQI101KTJvtg一、核心目标搞懂一个函数调用另一个函数时栈空间是怎么变化的、参数怎么传递、返回值怎么回来、ebp/esp 到底在干什么。二、示例代码C 语言我们用一个最简单的两层嵌套调用来分析#includestdio.hint plus(int x, int y){return xy;}int plus1(int x, int y , int z){int m;mplus(x,y);return mz;}int main(){int r ;rplus1(1,2,3);printf(%d,r);return 0;}调用关系main → plus2 → plus1这是最典型的函数嵌套调用。三、关键知识点必须理解函数调用统一遵循栈规则参数从右向左入栈先压入返回地址保存旧 ebpebp esp建立栈帧局部变量在 ebp 上方嵌套调用本质就是在一个函数的栈帧内部再开启一个新的子函数栈帧。调用完子函数栈会恢复到调用前的状态继续执行父函数。整个过程main调用plus2(1,2,3)plus2内部又调用plus1(x,y)plus1计算完成返回结果给plus2plus2再加上 z返回给main最终r 123 6四、内存布局栈空间说明1. 整体栈走向esp始终指向栈顶ebp用于定位当前函数的栈底方便访问参数和局部变量2. 调用 plus2 时的栈布局从右往左入栈参数3→2→1压入main中调用plus2的返回地址保存旧 ebpmain 的 ebp新 ebp esp建立 plus2 栈帧分配局部变量空间如 int m3. 嵌套调用 plus1 时在 plus2 函数内部再次执行完整调用流程从右往左入栈y→x压入 plus2 内部的返回地址保存当前 ebpplus2 的 ebp新 ebp esp建立 plus1 栈帧执行计算通过 eax 带回返回值4. 返回过程plus1执行完毕销毁自己的栈帧回到 plus2plus2拿到返回值继续计算再销毁自己栈帧回到 main最终结果存入 main 中的变量 r一句话总结嵌套调用就是栈帧的层层嵌套返回时栈帧层层弹出恢复。五、总结函数嵌套调用的完整流程参数入栈顺序从右向左栈帧结构旧 ebp → 返回地址 → 参数 → 局部变量嵌套本质栈帧里再套栈帧调用完逐层恢复理解这套内存布局是后续看懂反汇编、栈溢出、HOOK、函数调用约定的基础。关注0基础学逆向一起学逆向

更多文章