ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从fuzz到PoC:一次二进制漏洞挖掘的完整流程

从fuzz到PoC:一次二进制漏洞挖掘的完整流程 从 fuzz 到 PoC一次二进制漏洞挖掘的完整流程实战流程 · 写给学完基础、想挖真漏洞的人你以为挖漏洞是从一个聪明的输入开始的。其实它从挑一个不折磨人的目标开始——选错了你会在前两周就耗光耐心然后告诉自己这活不适合我。这篇把从选目标到交出 PoC 的整条链路摊开讲不省略任何一步包括那些让人怀疑人生的步骤。01目标怎么选新手最喜欢一口吞下浏览器内核。那是最坏的起点攻击面有几百万行状态机深不见底光把程序跑起来就要配一周环境。你还没见到第一个 crash就已经在编译 V8 的报错里迷路了。真正适合练手的是输入面清楚、反馈快的东西文件解析器、编解码库、协议实现。给一段字节它吐一个结果崩不崩当场知道。这种目标的循环特别短你一天能跑几千个变异而不是一周才调通一个构建。挑之前拿五个维度过一遍别凭听说这个项目有名就上手维度看什么新手该挑是否开源能不能读到源码、对得上崩溃栈开源优先闭源留给后面有无历史 CVE说明这段代码有人踩过坑patch 里藏着思路有 CVE 更友好不是更危险是否已有 harness别人写好入口你省掉最枯燥的胶水有 harness 直接上手没有就选简单的攻击面是否清晰入口是不是读一段字节就干活越窄越好别挑状态机迷宫维护活跃度没人管的代码你报了也白报活跃项目能真的走到披露常见的第一印象是越大的项目漏洞越多。错的。大项目的维护者也被 fuzz 了很久浅坑早填平了。挑一个被低估的、输入面清楚的小目标比在巨无霸里刨食强十倍。02攻击面梳理别一上来就 fuzz 整个程序很多人把fuzz 一个程序和fuzz 一个入口混为一谈。fuzz 整个程序等于让模糊器自己去猜先点哪个按钮、再发哪段报文——它根本不知道。结果覆盖率永远卡在第一层解析后面几百个函数它一辈子摸不到。先把这个程序所有的输入口列出来再挑一个最薄的往里钻入口点典型位置常见漏洞类型文件解析解码器、文档/图片/视频库越界读写、整数溢出网络报文协议栈、RPC、服务端监听堆溢出、UAF、解析状态错乱命令行参数CLI 工具、守护进程启动栈溢出、格式化字符串IPC共享内存、管道、socket 本地信任边界绕过、越界环境变量启动脚本、setuid 程序缓冲区溢出、注入反序列化接口对象编解码、配置加载类型混淆、UAF你会遇到的典型情况是文档库有二十个解析函数你只挑其中一个入口写 harness。把那一个入口打透比把整个库模糊一遍有用。覆盖率反馈会告诉你——它只走过你喂进去的那条路这才是正常的。**一句话记牢**fuzz 一个入口是我指定程序走哪条路fuzz 一个程序是让机器自己猜路。前者你控得住后者基本是在浪费 CPU。03写 harnessharness 就是一段把输入字节喂给你想测的那个函数的胶水。libFuzzer 的用法里核心就是一个函数#include stdint.h#include stddef.h#include “codec.h”extern “C” int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {Parser p; p.reset(); // 清掉上次的状态 Result r p.parse(data, size); // 只调这一个入口 (void)r; return 0; // 0没意见非0有情况}三件事写 harness 时最容易翻车。一是太大顺手把整个 main 的逻辑抄进来初始化、日志、配置文件全带上结果崩溃栈里一半是你自己的胶水代码真正出问题的那行反而被淹了。二是跑不独立依赖某个全局单例第一次能跑第二次状态就脏了。三是留了全局状态忘了reset()上一次解析的残渣混进下一次崩溃时你分不清是谁的锅。我踩过最蠢的一个坑harness 里忘了关掉日志输出变异一来就打一行一秒两万行磁盘先满了fuzzer 自己先挂。那天的产出是 Zero外加一个需要清的几十 G 日志目录。覆盖率反馈的意义在这儿libFuzzer / AFL 会在编译时插桩记录这次输入走到了哪些分支。每发现一个没走过的新分支就把触发它的输入存进语料库。你的 harness 越干净覆盖率曲线越能反映真实代码的边界而不是你胶水代码的边界。04跑起来编译插桩这一步决定你后面能不能拿到精准的崩溃栈。libFuzzer 把 fuzzer 引擎和 sanitizer 一起编进二进制AFL 则靠环境变量控制插桩模式。常用命令长这样libFuzzer ASan覆盖率与内存错误一起抓clang -g -O1 -fsanitizefuzzer,address harness.cc -o fuzz_target跑语料库 字典 时间上限./fuzz_target corpus/ -dictproto.dict -max_total_time86400AFL 插桩编译CLASSIC 模式 地址消毒 硬化AFL_USE_ASAN1 AFL_LLVM_INSTRUMENTCLASSIC make主从并行-M 主节点做确定性变异-S 从节点随机afl-fuzz -i seeds -o sync -M main – ./target afl-fuzz -i seeds -o sync -S s1 – ./target 语料库seed corpus别空着。给几个真实有效的输入当起点fuzzer 第一秒就过了这是不是合法格式那道门变异直接往深处走。字典dict对文本协议、带魔数的二进制格式尤其值钱——把关键字、标签值写进去它一步就能拼出多字节的魔数而不是一个字节一个字节地蒙。并行用-M加若干-S主节点做确定性变异、从节点做随机变异二者共享语料目录。跑多久停看两条线覆盖率曲线变平了、且长时间没有新路径说明这一轮到头了或者你只是想挂一晚上设个-max_total_time就行。别指望再跑五分钟就有突破——那种期待几乎每次都落空。05Crash 不是漏洞fuzzer 报 crash你先别激动。AFL 一个晚上能攒几百个 crash 文件里面九成是同一个 bug 的不同触发。三件事按顺序做**去重。**按栈回溯哈希分桶。同一个根因无论输入长什么样回溯栈是一样的。AFL 自己会做崩溃分类你别把id:000001和id:000237当成两个洞——它们多半是同一个。**最小化。**原始触发输入可能几 MB大部分字节跟崩溃无关。用afl-tmin缩用llvm-symbolizer看符号再手动删字节——直到少一个字节就不崩。这一步不是洁癖是给后面写报告的人包括未来的你留一条能读懂的路。**可复现。**换台机器、换个编译选项、重跑十次它还崩吗很多崩溃只在某次内存布局下出现是噪音。复现不了的先丢一边等它再来。大部分 crash 是重复的。**你真正要处理的那一个往往藏在几百个文件里、看起来最不起眼的那条栈。**去重做不好你会把时间花在给同一个 bug 写第十遍报告上。06根因分析最小化之后用 ASan / UBSan / Valgrind 重新编译复跑。sanitizer 会在坏内存访问发生的那一刻 abort并吐一份报告。一份典型的 heap-buffer-overflow 报告长这样4121ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000b1READ of size 1 at 0x6020000000b1 thread T0#0 in read\_varint /src/codec/varint.c:41 #1 in decode\_field /src/codec/decode.c:118 #2 in codec\_decode /src/codec/module.c:720x6020000000b1 is located 0 bytes after 1-byte region[0x6020000000b0,0x6020000000b1)allocated by thread T0 here:#0 in malloc #1 in PyBytes\_FromStringAndSizeSUMMARY: AddressSanitizer: heap-buffer-overflow /src/codec/varint.c:41逐行读第一行漏洞类型。heap-buffer-overflow直接告诉你这是堆上的越界不是栈也不是释放后重用。地址是出错那块内存的位置。第二行越界偏移。READ of size 1说读了 1 字节0 bytes after 1-byte region说缓冲区只有 1 字节长这次读正好踩在它右边一格。一个变长整数解码器没检查输入是不是在半路就结束了。**第三到五行访问栈。**从read_varint一路到codec_decode告诉你坏读发生在哪、是谁调进来的。根因通常不在最底层那行而在它的调用者——为什么给了它一个会越界的输入。**第七到九行分配栈。**这块内存是哪来的。配合访问栈你能拼出谁分配、谁越界、偏移多大的完整故事。UBSan 则补另一类有符号整数溢出、空指针、对齐错误——这些 ASan 看不见。同一份报告里漏洞类型 越界大小 偏移三样齐了你才有资格判断它值不值得往下做。少一样都是在赌。07可利用性判断能崩不代表能利用。MITRE 和 CISA 的 2024 年 CWE Top 25基于 2023–2024 年 31,770 条 CVE 记录里越界写CWE-787排第 2、越界读CWE-125排第 6、释放后重用CWE-416排第 8——内存破坏类占了前八里三个席位是最常见的那一类。但排位高不等于都好利用得看你能写多少、控什么漏洞类型能写几个字节能控什么典型利用难度栈溢出可覆盖返回地址控制执行流低有保护则中堆溢出取决于相邻块改写堆元数据/指针中–高UAF可复用已释放块类型混淆/任意读写高越界读只读不写泄露内存内容低组合则高整数溢出间接导致分配偏小触发上述任一中常作跳板越界读最容易被低估。它不能直接写但能读。读出来的若是堆地址、模块基址、canaryASLR 就废了——信息泄露本身就是高危。你会遇到只是读了一下就被定成严重的案例因为它把别的漏洞的利用门槛削平了。判断可利用性问自己一句**攻击者拿了这块越界下一步能改变什么**能改执行流就是高危只能让程序崩那它只是 DoS。中间那一大片靠的就是你对这块内存布局的理解。08写报告与披露报告的读者是修代码的人不是看你文笔的人。四样东西缺一不可影响范围哪些版本、什么配置中招、触发条件怎么跑到那行、PoC最小可复现输入、修复建议在哪加哪道检查。别写建议加强输入校验这种废话写在 varint.c:41 的循环里加上输入边界判断。披露时限有个绕不开的惯例Google Project Zero 的9030 政策——给厂商 90 天修补丁出来后 30 天才公开细节若 90 天内修不完可申请 14 天宽限若发现已在野外被利用则压缩到 7 天。据其 2025 年披露政策 FAQ自宽限机制启用以来约 96.9% 的问题都在期限内修掉了。这不是铁律但你得有个自己的时间锚点别让厂商无限期拖。申请 CVE 走 CNACVE Numbering Authority体系。全球已有 300 多家 CNA大厂和开源基金会都在其中——能直接给自己产品发号。如果你测的项目属于某家 CNA 的 scope就通过它走否则去 MITRE 的 cveform.mitre.org 选 “Report Vulnerability / Request CVE ID”填邮箱、受影响组件、攻击向量、建议描述提交后等编号编号先处于保留状态公开时再走一次提交流程。流程不复杂难的是前面把证据做扎实。**一个常犯的错**跳过厂商直接公开。多数项目的安全策略会写明联系窗口和禁发期你绕过去不仅拿不到配合还可能把自己放进不守规矩的研究者名单。先协调再公开。09现实的一面说点不中听的。绝大多数 crash 是重复的绝大多数去重后的 bug 是不可利用的跑三天零收获是常态。我见过有人挂了一周 fuzzer产出一个 crash去重完发现是别人两年前报过的。这不是劝退。是想让你把预期放对挖掘不是努力就有回报的活是大部分时间在空转、偶尔撞上一次的活。你能不能留下来不取决于你多会写 harness取决于空转那三天你还在不在。ONE LINE机器负责穷举你负责判断哪里值得穷举。学习资源如果你也是零基础想转行网络安全却苦于没系统学习路径、不懂核心攻防技能光靠盲目摸索不仅浪费时间还消磨自己信心。这份 360 智榜样学习中心独家出版《网络攻防知识库》专为转行党量身打造01内容涵盖这份资料专门为零基础转行设计19 大核心模块从 Linux系统、Python 基础、HTTP协议等地基知识到 Web 渗透、代码审计、CTF 实战层层递进攻防结合的讲解方式让新手轻松上手真实实战案例 落地脚本直接对标企业岗位需求帮你快速搭建转行核心技能体系这份完整版的网络安全学习资料已经上传CSDN【保证100%免费】**读者福利 |******[CSDN大礼包《网络安全入门进阶学习资源包》免费分享02 知识库价值深度 本知识库超越常规工具手册深入剖析攻击技术的底层原理与高级防御策略并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等提供了独到的技术视角和实战验证过的对抗方案。广度 面向企业安全建设的核心场景渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点是应对复杂攻防挑战的实用指南。实战性 知识库内容源于真实攻防对抗和大型演练实践通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。03 谁需要掌握本知识库负责企业整体安全策略与建设的CISO/安全总监从事渗透测试、红队行动的安全研究员/渗透测试工程师负责安全监控、威胁分析、应急响应的蓝队工程师/SOC分析师设计开发安全产品、自动化工具的安全开发工程师对网络攻防技术有浓厚兴趣的高校信息安全专业师生04部分核心内容展示360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式既夯实基础技能更深入高阶对抗技术。内容组织紧密结合攻防场景辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合是你学习过程中好帮手。1、网络安全意识2、Linux操作系统3、WEB架构基础与HTTP协议4、Web渗透测试5、渗透测试案例分享6、渗透测试实战技巧7、攻防对战实战8、CTF之MISC实战讲解这份完整版的网络安全学习资料已经上传CSDN【保证100%免费】**读者福利 |**[CSDN大礼包[《网络安全入门进阶学习资源包》免费分享 ]文章来自网上侵权请联系博主
返回列表