发布时间:2026/7/22 6:57:34
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/7/21 14:18:24

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

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

2026/7/19 14:57:10

数据结构基础代码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/7/22 6:53:47

OpenClaw技能生态解析与20个必装Skills推荐

1. OpenClaw技能生态全景解析OpenClaw作为新一代智能代理平台&#xff0c;其核心能力很大程度上依赖于Skills生态系统的构建。Skills本质上是一组Markdown格式的指令文件&#xff0c;通过YAML元数据定义和自然语言描述&#xff0c;教会代理如何在不同场景下使用各类工具。这种设…

2026/7/22 6:53:47

【仅限内部流出】2024年Q2国产AI芯片实测排名:昇腾910B vs. 寒武纪MLU370-X8 vs. 摩尔线程S4000,FP16推理延迟、显存带宽、驱动成熟度全维度打分

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;本地AI 硬件配置推荐 构建本地AI开发环境&#xff0c;硬件选型需兼顾模型推理速度、显存容量与功耗平衡。消费级GPU仍是主流选择&#xff0c;NVIDIA显卡因CUDA生态成熟度高而被广泛采用&#xff1b;AMD和Inte…

2026/7/22 6:53:47

大模型微调技术:全参数、LoRA与QLoRA对比

1. 大模型微调技术全景解析在自然语言处理领域&#xff0c;大型预训练模型&#xff08;如GPT、BERT等&#xff09;的微调技术已经成为从业者必须掌握的核心技能。面对动辄数十亿参数的大模型&#xff0c;如何高效地进行参数调整成为关键挑战。目前主流的大模型微调方法主要分为…

2026/7/22 6:48:47

DIY智能茶艺台:树莓派与数控技术的母亲节礼物

1. 项目背景与创意来源这个项目的灵感来源于当代年轻人对传统节日礼物选择的困境。每年母亲节&#xff0c;花店和礼品店的常规选项总是千篇一律——康乃馨、巧克力、护肤品套装。作为一个常年被老妈吐槽"没心没肺"的理工男&#xff0c;我决定打破常规&#xff0c;用硬…

2026/7/20 6:33:00

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/22 0:02:17

抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具

抓包代理链路下的 TLS 指纹变化分析&#xff1a;为什么调试环境会影响访问结果 摘要 在网页调试、接口联调、自动化巡检和授权采集排查中&#xff0c;抓包是常见手段。但很多开发者会遇到一个现象&#xff1a;正常访问页面时没有问题&#xff0c;一进入抓包或代理调试环境&…

2026/7/22 0:02:17

微信QQ聊天记录误删恢复与备份方案全指南

1. 聊天记录误删的常见场景与恢复思路作为一名长期关注数据安全的技术博主&#xff0c;我处理过上百起聊天记录误删的求助案例。手机误操作、系统升级失败、设备损坏是三大常见诱因。上周就遇到用户更新微信时断电&#xff0c;导致近两年的工作群聊记录全部消失的极端案例。不同…

2026/7/22 0:02:17

2026最新8款个人AI编程免费工具深度实测

作为一名全栈独立开发者&#xff0c;我最近半年一直在折腾副业项目&#xff0c;每个月在AI编程工具上的订阅费算下来其实也不算便宜。作为个人开发者&#xff0c;我们追求的就是用最少的成本获得最高效的开发体验。TRAE 基础版免费&#xff0c;字节跳动出品的国内首款 AI 原生 …

2026/7/21 20:02:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…