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 和关键的返回地址。

相关新闻

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

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

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

2026/7/26 23:21:12 阅读更多 →
后缀表达式的计算是从左到右扫描表达式,遇到操作数就将其压入栈中,遇到运算符就从栈中弹出相应数量的操作数进行运算

后缀表达式的计算是从左到右扫描表达式,遇到操作数就将其压入栈中,遇到运算符就从栈中弹出相应数量的操作数进行运算

首先明确后缀表达式(逆波兰表达式)的计算规则: 后缀表达式的计算是从左到右扫描表达式,遇到操作数就将其压入栈中,遇到运算符就从栈中弹出相应数量的操作数进行运算,然后将运算结果再压入栈中,直…

2026/7/26 23:21:13 阅读更多 →
交错动画的时序编排:Stagger 延迟计算与组级联动的工程实践

交错动画的时序编排:Stagger 延迟计算与组级联动的工程实践

交错动画的时序编排:Stagger 延迟计算与组级联动的工程实践 一、"它们一起出现的时候很美,但卡成了一团" 做一个 Dashboard 的卡片列表入场动画。10 张卡片依次从下方淡入——第 1 张 0ms、第 2 张 80ms、第 3 张 160ms……效果很优雅。但是当…

2026/7/29 2:18:53 阅读更多 →

最新新闻

2026年6月广州市南沙区二手房价格深度分析

2026年6月广州市南沙区二手房价格深度分析

一、报告概述本报告基于2026年6月广州市南沙区多个典型二手房小区的实际成交数据,从成交价格、户型结构、区域分布、市场趋势等维度进行深度分析,旨在为购房者、投资者及行业从业者提供真实、客观的市场参考。数据来源:广州市住房和城乡建设局…

2026/7/29 6:31:46 阅读更多 →
EtherCAT从站PDO动态映射实现与优化

EtherCAT从站PDO动态映射实现与优化

1. EtherCAT从站开发中的PDO映射机制解析在工业自动化领域,EtherCAT因其卓越的实时性能被广泛应用。作为开发者,我们经常需要处理对象字典中的0x1600和0x1A00索引,这两个关键区域定义了过程数据对象(PDO)的映射关系。传统固定映射方式虽然简单…

2026/7/29 6:31:46 阅读更多 →
ARM汇编入门:从C语言到硬件调试的底层编程指南

ARM汇编入门:从C语言到硬件调试的底层编程指南

1. 从C到汇编:为什么我们需要理解ARM汇编如果你已经写过一些ARM平台上的C语言程序,可能会觉得用高级语言开发已经足够方便了。编译器帮我们处理了所有底层细节,我们只需要关心业务逻辑。这种想法在大多数应用开发场景下是成立的,但…

2026/7/29 6:31:46 阅读更多 →
Altium Designer 3D模型导入与颜色显示完整指南

Altium Designer 3D模型导入与颜色显示完整指南

1. 项目概述:为什么3D模型对PCB设计至关重要 在PCB设计的圈子里,尤其是用Altium Designer(后面我们简称AD)的朋友,肯定都经历过这样的场景:板子画完了,发给结构工程师做外壳,结果对方…

2026/7/29 6:31:45 阅读更多 →
Grok CLI教程:从终端集成大模型到工作流自动化实践

Grok CLI教程:从终端集成大模型到工作流自动化实践

去年底,当 xAI 正式开放 Grok 模型时,很多人第一时间涌去体验。但很快,一个现实问题摆在面前:每次都要打开网页、登录、点进对话框才能开始工作,这种交互方式对需要高频调用的开发者来说,效率瓶颈太明显了。…

2026/7/29 6:31:45 阅读更多 →
STM32等精度测频:基于TIM定时器的宽频带高精度频率测量方案

STM32等精度测频:基于TIM定时器的宽频带高精度频率测量方案

1. 项目概述:为什么需要等精度测频?在嵌入式开发,尤其是涉及电机控制、电源管理、传感器信号处理等领域,频率测量是一个基础但至关重要的功能。你可能遇到过这样的场景:用STM32的输入捕获功能测量一个方波信号&#xf…

2026/7/29 6:30:45 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻