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/10/8 5:46:32 阅读更多 →
后缀表达式的计算是从左到右扫描表达式,遇到操作数就将其压入栈中,遇到运算符就从栈中弹出相应数量的操作数进行运算

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

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

2026/10/13 18:24:06 阅读更多 →
交错动画的时序编排:Stagger 延迟计算与组级联动的工程实践

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

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

2026/10/13 12:10:18 阅读更多 →

最新新闻

Agent任务规划与推理模式重构:从过度规划到高效执行

Agent任务规划与推理模式重构:从过度规划到高效执行

一个任务丢给 Agent,很多时候都会得到一份漂亮但没法落地的计划。我在调 Pi agent 的时候就撞上过这类问题:让它做稍微复杂一点的事,它要么把简单任务拆出十来个步骤,要么在执行中反复重新评估,迟迟不调用工具&#xf…

2026/10/14 7:52:44 阅读更多 →
Spring Boot + Spring AI 实现生产级Java个人Agent实践

Spring Boot + Spring AI 实现生产级Java个人Agent实践

做AI Agent这一年多,我最常被问的一句话是:Java能做Agent吗?问这个问题的人,基本都是后端团队的技术负责人,系统跑在Spring Boot上,团队没人愿意为了一两个智能体功能单独养一套Python服务。我的回答一直是…

2026/10/14 7:52:44 阅读更多 →
后门漏洞排查与防御:从netstat到系统加固的实用指南

后门漏洞排查与防御:从netstat到系统加固的实用指南

在新手群里混久了,发现一个很有意思的现象:一说"后门漏洞",大多数人第一反应是那些好莱坞电影里的黑客镜头——敲几行代码,屏幕绿光一闪,电脑就沦陷了。但实际上,我带过的几个刚入行的朋友&#…

2026/10/14 7:52:44 阅读更多 →
MATLAB信号处理高频函数实战:FFT、滤波器与频谱分析详解

MATLAB信号处理高频函数实战:FFT、滤波器与频谱分析详解

做信号处理这行,MATLAB里那几十个函数,真正每天抓在手里用的其实就那么十来个。这篇是这个系列的第三篇,我打算把平时处理振动、音频、生物电这类实测信号时用得最频繁的函数挨个过一遍,不按教科书目录念定义,只讲这些…

2026/10/14 7:52:44 阅读更多 →
基于Java与Spring AI的生产级Personal Agent构建实践

基于Java与Spring AI的生产级Personal Agent构建实践

做这个项目之前,我的任务清单其实是这样的:让 Java 技术栈在生产环境里跑起一个真正“能干活的” Personal Agent,而不是又一个只能聊天的 API 壳子。折腾了一个多月,总算是把 Spring Boot Spring AI 这套组合从模型接入、工具注…

2026/10/14 7:52:44 阅读更多 →
Java Lambda不只是语法糖:从字节码到序列化的工程实践

Java Lambda不只是语法糖:从字节码到序列化的工程实践

1. Lambda身后的字节码:语法糖背后的真实身份1.1 先说结论:Lambda不完全是"匿名内部类的简写"很多Java开发者对Lambda最早的认知,就是"可以用Lambda代替匿名内部类,代码更简洁"。这个说法在80%的日常场景下是…

2026/10/14 7:51:44 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →