尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C/C++反汇编之函数栈帧的理解

C/C++反汇编之函数栈帧的理解
📅 发布时间:2026/7/20 15:14:00

🎯 二进制安全必备:函数栈帧与反汇编全景复习笔记

这份笔记为你完整还原了 C 语言源码到经典 x86(32位 Intel 语法、无优化编译)反汇编的映射关系,包含了行级详细解析与核心复习表。你可以直接复制本段 Markdown 源码保存为本地文件,方便随时复盘。


💻 1. C 语言源代码

intmain(){add(0xAA,0xBB);return0;}voidadd(intx,inty){intz=0xCC;}

🛠️ 2. 反汇编代码行级详解

🏢 main 函数反汇编流

; ======= main 函数的开端 (函数序言 Prologue) ======= push ebp ; 1. 将 main 上级函数的 EBP 压栈备份(保存现场) mov ebp, esp ; 2. 让 EBP 等于当前的 ESP,正式确立 main 函数自己的栈帧基准线 ; ======= 准备参数并调用 add(0xAA, 0xBB) ======= push 0BBh ; 3. [对应C: y = 0xBB] 将第二个参数压入栈顶 (ESP = ESP - 4) push 0AAh ; 4. [对应C: x = 0xAA] 将第一个参数压入栈顶 (ESP = ESP - 4) ; 注:x86 下参数按从右往左(Right-to-Left)顺序压栈 call _add ; 5. [对应C: add(...)] 核心动作: ; A. 将下一行指令的地址(返回地址)压入栈顶 (ESP = ESP - 4) ; B. 将 EIP 寄存器修改为 _add 函数的入口地址,实现跳转 ; ======= 从 add 函数返回后的清理工作 ======= add esp, 8 ; 6. [栈平衡 Balance] 重点!由调用者(main)亲自清理栈顶。 ; 刚才 push 了两个参数(4字节 + 4字节 = 8字节), ; 这里把 ESP 加上 8,强行把这两个参数从栈顶“踢除” ; ======= main 函数的收尾 (函数尾声 Epilogue) ======= xor eax, eax ; 7. [对应C: return 0] 清零 EAX,作为 main 函数的默认返回值 pop ebp ; 8. 弹栈,恢复 main 上级函数的 EBP ret ; 9. 结束 main 函数,返回更上层

🧪 add 函数反汇编流

_add proc near ; add 函数入口 ; ======= 1. 函数序言 (建立专属办公室) ======= push ebp ; 将 main 函数的 EBP 压栈备份 (ESP = ESP - 4) mov ebp, esp ; 让 EBP 等于当前的 ESP。从此,当前函数的 EBP 固定在分水岭位置! ; ======= 2. 局部变量空间开辟 ======= sub esp, 4 ; [对应C: int z] 将 ESP 减去 4,在栈上强行留出 4 字节的空地给变量 z ; ======= 3. 执行业务逻辑 (赋值) ======= mov dword ptr [ebp-4], 0CCh ; [对应C: z = 0xCC] ; 往 [EBP - 4](刚才开辟的空地)写入 4 字节的常数 0xCC ; ======= 4. 函数尾声 (拆除办公室、退租) ======= mov esp, ebp ; 清空局部变量!让 ESP 直接回到 EBP 的位置 (无视并放弃了 [EBP-4] 的空间) pop ebp ; 弹栈,把刚才保存的 main 函数的 EBP 还给 EBP 寄存器 (ESP = ESP + 4) ; 此时 EBP 恢复为 main 的,ESP 指向栈顶的返回地址 ret ; 魂归故里!弹出当前栈顶的返回地址直接赋给 EIP 寄存器, ; CPU 控制权瞬间跳回 main 函数中(即 call _add 的下一行) _add endp

⚙️大佬敲黑板:
在真实的 IDA Pro 反汇编中,你经常会看到编译器把add函数尾声的mov esp, ebp和pop ebp两条指令合并精简为一条著名的指令:leave。它们在硬件层面上完全等价。


📊 3. 终极复习作弊表(Cheatsheet)

当你在汇编中看到以EBP为基准的内存寻址(中括号表达式)时,直接套用下表进行肉眼翻译,这是分析栈溢出(Pwn)和逆向的关键:

汇编表达式它的真实身份产生的原因Pwn 视角(漏洞安全意义)
[ebp]Saved EBP(旧 EBP 的备份)函数序言第一步push ebp留下的。栈溢出时如果把它改掉,原函数在退栈时会迷失方向,导致程序崩溃(SegFault)。
[ebp + 4]Return Address(返回地址)call指令在跳入函数前自动强行压入的。Pwn 的终极劫持目标!只要覆盖这里,就能在函数执行ret时,让程序跳去执行任意恶意代码(如 system 逻辑)。
[ebp + 8]第 1 个输入参数 (x)在返回地址的上方(高地址),由调用者提前压入。只读。改变它不会破坏栈结构,但会改变函数的业务运行逻辑。
[ebp + 12]第 2 个输入参数 (y)在第 1 个参数的上方。多个参数以此类推(+16, +20…)。只读。
[ebp - 4]第 1 个局部变量 (z)函数内部sub esp, 4之后在低地址方向自己开辟的。溢出的源头!如果这个变量是个缓冲区(如char buf[16]),当你输入过长数据时,数据会**向上(往正号/高地址方向)**依次淹没[ebp]和[ebp+4](返回地址)。

🧠 4. 核心逻辑闭环思维导图

高地址 (楼顶) | ... | [EBP + 12] -> 参数 2 (0xBB) <--【Caller压入】 | [EBP + 8] -> 参数 1 (0xAA) <--【Caller压入】 | [EBP + 4] -> 返回地址 (EIP) <--【CALL指令自动压入】-- 🎯 漏洞劫持核心 | [EBP] -> 旧 EBP 备份 <--【Callee序言 push ebp】 | [EBP - 4] -> 局部变量 z <--【Callee自减开辟 sub esp】-- 🌊 溢出污染源 V 低地址 (地下室)

一句话总结复习流:栈是倒着长的(向低地址生长);输入数据是顺着写的(向高地址溢出)。所以,位于低地址的局部变量一旦发生溢出,会无情地向高地址方向横扫,依次冲毁旧 EBP 和关键的返回地址。

相关新闻

  • 萧邦中国官方售后中心2026年7月全新400客服热线启用通知 - 亨得利腕表服务中心
  • 后缀表达式的计算是从左到右扫描表达式,遇到操作数就将其压入栈中,遇到运算符就从栈中弹出相应数量的操作数进行运算
  • 2026年商用卤汁批发全指南 餐饮门店适配供应商选择参考 - 麻辣烫酱料

最新新闻

  • DCNv2终极指南:解锁PyTorch动态卷积的无限可能
  • Pencil架构解析:开源原型工具的技术演进与设计系统
  • 终极指南:使用SilentPatch修复补丁让经典GTA游戏在现代电脑上完美运行
  • 【限时解密】头部AI音乐工作室不外传的变现飞轮:单曲ROI提升3.8倍的5步闭环法
  • 临汾考公机构TOP3排名:口碑与实力双优之选(2026年最新横评)
  • PAYDAY 2 Ultimate Trainer 6:网页控制的终极游戏模组指南

日新闻

  • 百达翡丽官方服务项目及价格查询|维修地址与电话权威信息通告(2026年7月最新) - 百达翡丽服务中心
  • 2026年药食同源冲泡饮品哪家好:衡身堂三伏天内调外养 - 晚香时候
  • 芝柏官方更换原装表带价格查询|详细地址与24小时客服电话权威信息公告(2026年7月最新) - 亨得利官方服务中心

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号