挖掘 0-Day 漏洞:AFL++ 模糊测试实战,给开源图像库 (libpng) 找一个致命 Crash

标签:#Fuzzing #AFL++ #Security #VulnerabilityResearch #0Day #ASAN

⚠️ 免责声明:本文仅供安全研究与教学使用。请勿对未授权的商业软件或网络进行攻击。


🧬 前言:什么是覆盖率导向的 Fuzzing?

传统的 Fuzzing 是“瞎蒙”,随机生成乱码喂给程序,效率极低。
AFL (American Fuzzy Lop)及其继承者AFL++引入了覆盖率导向 (Coverage-Guided)机制。

它像生物进化一样:

  1. 变异:对种子文件(如一个正常的 PNG)进行位翻转、剪切、拼接。
  2. 执行:喂给程序运行。
  3. 反馈:通过插桩(Instrumentation)监控程序执行了哪些代码路径。
  • 如果发现了新路径(比如进了一个生僻的if分支),就保留这个变异样本,作为下一代的“种子”。
  • 如果没有新发现,就丢弃。

Fuzzing 进化循环 (Mermaid):

选取

生成畸形数据

监控覆盖率

Yes (有价值)

No (垃圾数据)

CRASH!

初始种子 Corpus

种子队列

变异引擎

目标程序 libpng

发现新路径?

丢弃

漏洞分析


🛠️ 一、 搭建实验室

为了环境纯净,我们强烈建议使用 Docker。AFL++ 官方提供了非常完善的镜像。

# 拉取 AFL++ 官方镜像dockerpull aflplusplus/aflplusplus# 启动容器dockerrun -ti --name fuzz-lab aflplusplus/aflplusplus

💉 二、 插桩编译:给代码装上“监控探头”

我们以libpng为靶子(为了演示效果,你可以尝试找一个旧版本的 libpng,例如 1.6.30,新版本非常健壮,很难在短时间内跑出洞)。

下载并解压源码后,关键的一步是替换编译器。我们不能用gcc,必须用afl-clang-fast,它会在编译时自动插入汇编代码,用于记录分支跳转。

同时,我们要开启ASAN (Address Sanitizer)。这是一个内存错误检测器,它能让程序在发生缓冲区溢出 (Buffer Overflow)使用后释放 (UAF)的瞬间立即崩溃,并打印详细堆栈。

# 1. 下载目标wgethttps://download.sourceforge.net/libpng/libpng-1.6.37.tar.xztar-xvf libpng-1.6.37.tar.xz&&cdlibpng-1.6.37# 2. 设置编译器环境变量exportCC=afl-clang-fastexportCXX=afl-clang-fast++# 3. 开启 ASAN (内存消毒) 和 UBSAN (未定义行为检测)exportAFL_USE_ASAN=1exportAFL_USE_UBSAN=1# 4. 编译安装./configure --disable-shared# 静态链接方便调试make-j4

🔗 三、 编写 Harness:喂养接口

libpng是一个库,它自己不会运行。我们需要写一个极简的 C 程序(Harness),读取标准输入(stdin),调用libpng的 API 来解析它。

新建文件harness.c

#include"png.h"#include<stdio.h>#include<stdlib.h>#include<string.h>// AFL 优化的循环模式入口voidfuzz_target(){png_structp png_ptr=png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);if(!png_ptr)return;png_infop info_ptr=png_create_info_struct(png_ptr);if(!info_ptr){png_destroy_read_struct(&png_ptr,NULL,NULL);return;}// 设置错误处理跳转,防止 libpng 自己打印报错后退出,我们要的是 crashif(setjmp(png_jmpbuf(png_ptr))){png_destroy_read_struct(&png_ptr,&info_ptr,NULL);return;}// 从 stdin 读取数据// 在实际 Fuzz 中,通常会适配 LLVMFuzzerTestOneInput 接口,这里用最简单的 stdin 方式png_init_io(png_ptr,stdin);// 甚至不需要完整读取,读个头或者读信息即可触发大部分解析逻辑png_read_info(png_ptr,info_ptr);png_read_image(png_ptr,NULL);// 尝试解码图像数据png_destroy_read_struct(&png_ptr,&info_ptr,NULL);}intmain(intargc,char**argv){// 针对 AFL 的特殊优化,使得无需反复 fork 进程,极大提升速度#ifdef__AFL_HAVE_MANUAL_CONTROL__AFL_INIT();#endifwhile(__AFL_LOOP(1000)){// 复用进程 1000 次fuzz_target();}return0;}

编译 Harness:

$CC-O2 harness.c -o fuzzer_app ./.libs/libpng16.a -lz -lm

🔥 四、 开火:运行 AFL++

1. 准备种子 (Corpus)

Fuzzer 需要知道正常的 PNG 长什么样。我们在in目录下放几个几 KB 大小的合法 PNG 图片。

mkdirinoutcp/path/to/some/small.png in/seed.png
2. 启动 Fuzzer
afl-fuzz -iin-o out -m none -- ./fuzzer_app

界面解析:
当你看到那个经典的红蓝界面时,Fuzzing 就开始了。

  • run time: 运行时间。
  • exec speed: 每秒执行次数(通常在 1000-5000/sec 为佳)。
  • total paths: 发现的代码路径总数(越多越好)。
  • uniq crashes:这是我们最关心的!如果这里数字变成红色且大于 0,恭喜你,可能挖到 0-Day 了。

🕵️‍♂️ 五、 漏洞分析:从 Crash 到 Exploit

假设经过 24 小时运行,out/default/crashes/目录下出现了一个文件id:000001,sig:11,src:000000...
这意味着 AFL 找到了一个样本,让程序发生了 Segment Fault (Sig 11)。

1. 复现 Crash

我们将这个畸形文件喂给带有 ASAN 的程序:

./fuzzer_app<out/default/crashes/id:000001...
2. ASAN 报告解读

ASAN 会吐出一段非常详细的报错:

================================================================= ==12345==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000010 ... READ of size 4 at 0x602000000010 thread T0 #0 0x4f3a20 in png_read_filter_row_paeth libpng/pngrutil.c:4500 #1 0x4e1b30 in png_read_row libpng/pngread.c:700 ...
  • Type:heap-buffer-overflow(堆溢出)。
  • Location:pngrutil.c第 4500 行,函数png_read_filter_row_paeth
  • Action: 发生了非法读取 (READ)

这说明 libpng 在处理 Paeth 滤波器时,计算错误的缓冲区大小,导致读到了分配内存之外的数据。如果是WRITE溢出,那么这就是一个极高危的漏洞,可能导致任意代码执行。


🎯 总结

AFL++ 不仅仅是一个工具,它代表了**“以攻促防”**的最高境界。
通过本次实战,我们经历了:

  1. Instrumentation: 编译时埋点。
  2. Harnessing: 编写测试入口。
  3. Fuzzing: 遗传算法暴力破解。
  4. Triage: ASAN 定位根因。

在真实的软件开发生命周期(SDLC)中,将 Fuzzing 集成到 CI/CD 流程(如 Google 的 OSS-Fuzz),是保证软件在发布前消灭 0-Day 的最佳实践。

Next Step:
libpng 已经被很多人挖过了。尝试去 Github 上找一个 Star 数在 100-1000 之间、处理复杂文件格式(如 PDF, XML, 专有协议)的 C/C++ 项目,按照本文的流程跑一跑。你拿到 CVE 编号的概率会非常大!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI领域技术进展速览:从模型更新到硬件竞争

LWiAI播客 #224 - OpenAI转向盈利&#xff01;Cursor 2、Minimax M2、Udio版权问题 这是我们第224期节目&#xff0c;总结和讨论上周的重要人工智能新闻&#xff01; 录制于2025年10月31日 本期内容&#xff1a; OpenAI完成了其盈利性重组&#xff0c;重新定义了与某中心的合作…

Codeforces Round 1073 Div1 + Div2 部分题目题解

比赛传送门:Codeforces Round 1073。 打的 Div2。AB 赛时切了。 C 题解 设 \(s\) 升序排序后为 \(t\),那么如果 \(s=t\) 显然 Bob 胜利,否则我们断言 Alice 一定胜利。 如果 Alice 可以一步将 \(s\) 变成 \(t\),那…

布隆过滤器进阶:布谷鸟过滤器 (Cuckoo Filter) 是如何支持“删除”操作的?

标签&#xff1a; #Algorithm #BloomFilter #CuckooFilter #DataStructure #SystemDesign&#x1f6ab; 前言&#xff1a;布隆过滤器的“死穴” 布隆过滤器的原理是将一个元素通过 个哈希函数映射到位数组的 个点上。 为什么不能删&#xff1f; 假设元素 A 映射到了位置 [1, …

web入门111-120

web111 分析代码v1必须等于ctfshow,v2使用全局变量 ?v1=ctfshow&v2=GLOBALSweb112 分析代码使用伪协议 ?file=php://filter/resource=flag.phpweb113 分析代码使用zlib:// 伪协议 ?file=compress.zlib://flag.p…

第 485 场周赛Q1——3813. 元音辅音得分

题目链接&#xff1a;3813. 元音辅音得分&#xff08;简单&#xff09; 算法原理&#xff1a; 解法&#xff1a;模拟 1ms击败100.00% 时间复杂度O(N) 其实题目中要求的向下取整就是默认的 / 就可以&#xff0c;所以我们只需要按要求统计出对应的 v、c 然后按照题目要求返回…

恶意代码分析:在沙箱中运行勒索病毒,用 IDA Pro 逆向它的加密逻辑

标签&#xff1a; #MalwareAnalysis #ReverseEngineering #IDAPro #Ransomware #CyberSecurity #Cryptography ⚠️ 高危警告&#xff1a;本文涉及真实恶意样本分析技术。所有操作必须在断网、隔离的虚拟机中进行。严禁在物理机或生产环境中尝试&#xff01;严禁传播恶意样本&a…

导师严选2026 AI论文网站TOP8:继续教育写作全攻略

导师严选2026 AI论文网站TOP8&#xff1a;继续教育写作全攻略 2026年AI论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术在学术领域的深入应用&#xff0c;越来越多的科研人员和继续教育学习者开始依赖AI写作工具提升论文撰写效率。然而&#xff0c…

LLM 推理加速:深入 vLLM 源码,揭秘 PagedAttention 如何让吞吐量提升 20 倍?

标签: #LLM #vLLM #PagedAttention #CUDA #Inference #SystemDesign 📉 前言:显存碎片的“诅咒” 在 vLLM 出现之前,HuggingFace Transformers 的默认推理极其浪费显存。 LLM 推理是自回归的(生成一个 Token,存入 KV Cache,再生成下一个)。传统的 KV Cache 管理方式是…

完整教程:【Go/Python/Java】基础语法+核心特性对比

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数据交易中的数据质量评估方法

数据交易避坑指南&#xff1a;从头搭建你的数据质量评估体系 一、引言&#xff1a;数据交易中&#xff0c;你踩过多少“质量坑”&#xff1f; 去年&#xff0c;我帮一家零售企业做数据交易咨询时&#xff0c;遇到过一个典型的“踩坑案例”&#xff1a; 这家企业花20万买了一份“…

数据结构3.0 栈、队列和数组

一、栈的基本概念①栈的定义②栈的基本操作③常考题型④小结二、栈的顺序存储实现①顺序栈的定义②初始化操作③进栈操作④出栈操作⑤读栈顶元素操作⑥共享栈⑦小结三、栈的链式存储实现①链栈的定义②小结#include <stdio.h> #include <stdlib.h>// 链栈的结点结构…

算子优化实战:手写 Triton Kernel,将 LayerNorm 算子的执行时间压缩 50%

标签: #Triton #CUDA #AICompiler #HPC #PyTorch #LayerNorm 📉 前言:为什么 PyTorch 原生算子还不够快? PyTorch 的 torch.nn.LayerNorm 虽然底层调用了 cuDNN 或 ATen 的优化实现,但在处理特定 Shape 或与其他算子结合时,依然存在性能损耗: 显存带宽瓶颈:LayerNorm…

深度测评自考必备一键生成论文工具TOP8

深度测评自考必备一键生成论文工具TOP8 自考论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着自考人数逐年攀升&#xff0c;论文写作成为众多考生面临的“拦路虎”。从选题构思到内容撰写&#xff0c;再到格式调整&#xff0c;每一个环节都可能成为拖延或出…

Linux实操篇

1.1.vim快速入门1.2 vim快捷键1.3用户关机重启1.4登录注销 2.1用户管理12.2用户管理2

51单片机智能遮阳篷窗户帘衣架蓝牙APP光雨滴检测41(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

51单片机智能遮阳篷窗户帘衣架蓝牙APP光雨滴检测41(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 产品功能描述&#xff1a; 本系统由STC89C52单片机、雨滴传感器、光照传感器、蓝牙模块、继电器、拨动开关及电源组成 1、可以…

Java 并发探秘:JCTools 源码剖析,为什么 Netty 放弃 JDK 自带队列而选择 MpscArrayQueue?

标签&#xff1a; #Java #Netty #JCTools #Concurrency #Performance #FalseSharing&#x1f422; 前言&#xff1a;JDK 队列的痛点 在 Netty 的 Reactor 线程模型中&#xff0c;EventLoop 本质上是一个单线程的执行器。 它需要处理两类任务&#xff1a; IO 事件&#xff1a;来…

todo

todo作者很懒,所以经常会立flag,这里是他写下的todo list QAQtodo 创建时间 状态埃氏筛分块筛法 26/1/18 未完成

Go 调度器 (GMP) 揭秘:从汇编角度看 Goroutine 是如何实现“协程切换”的?

标签&#xff1a; #Go #Golang #GMP #Assembly #Runtime #Concurrency&#x1f680; 前言&#xff1a;GMP 的本质是“复用” 操作系统线程&#xff08;OS Thread&#xff09;太重了。创建一个线程需要 1-8MB 栈内存&#xff0c;切换一次需要进入内核态&#xff0c;耗时 1-2 微秒…

【创新未发表】基于matlab鸡群算法CSO和自适应双种群协同鸡群算法ADPCCSO无人机避障三维航迹规划【含Matlab源码 14980期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

第 174 场双周赛Q2——3810. 变成目标数组的最少操作次数

题目链接&#xff1a;3810. 变成目标数组的最少操作次数&#xff08;中等&#xff09; 算法原理&#xff1a; 解法&#xff1a;模拟 38ms击败11.30% 时间复杂度O(N) ①先计算出哪些是需要修改的 ②统计需要修改的下标 ③原数组中相同的数可以一起修改&#xff0c;所以只要统计不…