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

发布时间:2026/9/11 16:26:52

C/C++反汇编之函数栈帧的理解 二进制安全必备函数栈帧与反汇编全景复习笔记这份笔记为你完整还原了 C 语言源码到经典 x8632位 Intel 语法、无优化编译反汇编的映射关系包含了行级详细解析与核心复习表。你可以直接复制本段 Markdown 源码保存为本地文件方便随时复盘。 1. C 语言源代码intmain(){add(0xAA,0xBB);return0;}voidadd(intx,inty){intz0xCC;}️ 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]和[ebp4]返回地址。 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/9/5 6:24:32

爬虫出现验证怎么办? TLSFOWARD TLS指纹

爬虫出现验证怎么办?从合规策略到工程处理流程 摘要 在爬虫采集、接口测试和数据同步场景中,开发者经常会遇到登录验证、人机校验、访问频率限制、403/429 状态码、跳转验证页等情况。很多问题表面上看是“爬虫被验证了”,本质上却可能是访问…

2026/9/9 9:31:28

数据结构基础代码study log

线性表顺序表创建表静态表代码#include <stdio.h> #define MAXSIZE 10 typedef struct {int data[MAXSIZE];int length; }SqList;//静态表void InitList(SqList * L) {/*for(int i0;i<MAXSIZE;i)L.data[i]0;*/L->length0; }int main() {SqList L;InitList(&L);…

2026/9/11 16:22:38

免密码进行SSH连接、Mac远程连接windows系统(拷贝本地文件)

文章目录 前言 I 免密码进行SSH连接 1.1 创建 rsa 1.2 配置 ssh config 1.3 测试连接 1.4 案例: 配置GitHub SSH keys II 远程连接windows系统。 2.1 Mac远程连接windows 2.2 windows远程连接windows 2.3 RustDesk开源远程桌面访问解决方案 III see also 移除私钥密码(Passph…

2026/9/11 16:22:37

DS18B20在ESP32上的单总线时序实现与优化

简介&#xff1a;面向ESP32开发者的DS18B20数字温度传感器驱动源码包&#xff0c;适用于智能家居、农业环境监测、工业过程控制等物联网测温场景。DS18B20支持高精度单总线通信&#xff0c;仅需一根数据线即可与ESP32的GPIO连接&#xff0c;电源与数据线供电方式灵活&#xff0…

2026/9/11 16:22:37

3步本地部署Duix.Avatar数字人视频生成工具

3步本地部署Duix.Avatar数字人视频生成工具 【免费下载链接】Duix-Avatar &#x1f680; Truly open-source AI avatar(digital human) toolkit for offline video generation and digital human cloning. 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar …

2026/9/11 16:17:37

QGIS与Cesium瓦片地图集成开发指南

1. QGIS与Cesium瓦片地图数据集成概述在GIS开发领域&#xff0c;QGIS作为开源地理信息系统代表工具&#xff0c;与Cesium这一领先的Web三维地图引擎的协同使用正成为行业趋势。最近在完成一个智慧城市项目时&#xff0c;我需要将Cesium的二维瓦片地图服务集成到QGIS桌面环境中进…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊&#xff01;#雷神 #复联”这类调侃式短标题&#xff0c;第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里&#xff0c;但细想一下就能发现&#xff0c;它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊&#xff0c;可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”&#xff0c;你会发现&#xff0c;这场比较本质上是两个不同 IP 策略的长期结果对比&#xff1a;超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介&#xff1a;本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案&#xff0c;聚焦调制信号自动检测与识别这一典型无线通信任务&#xff0c;解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件&#xff08;10.73MB&#xff09;&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码