我的AFL++fuzzing入门之路(4)
我的AFL++fuzzing入门之路(4) 00 引言:跨越鸿沟 回顾前三天: Day 1:在"教科书式test.c"上跑通AFL++,理解状态界面 Day 2:深入插桩原理,发现"平墙式memcmp让AFL失明"的致命问题 Day 3:用ASAN将"隐形漏洞"转化为"显性崩溃" 提出问题: 真实项目不是afl-cc test.c这么简单。面对libpng这类真实解析器: 如何编译带依赖的开源项目? 如何应对无处不在的"平墙式"魔数检查(memcmp(header, "\x89PNG", 4))? 如何让AFL++不再"瞎猜"? 本章目标: 以libpng 1.6.54为演示目标,掌握实战前的三大核心准备: 编译真实项目(带ASAN插桩) 构建高质量种子语料库 用字典破解"平墙式"困境 01 实战目标编译:以libpng为例 1st. 为什么选libpng 理由 说明 经典攻击面 图片解析器天生处理不可信输入(用户上传) 代码规模适中 约3万行,比内核简单,比test.c真实 历史漏洞丰富 CVE-2018-14550、CVE-2019-7317等,有参考案例 格式相对简单 PNG结构清晰:文件头+Chunk(IHDR/IDAT/IEND) 官方支持完善 Google OSS-Fuzz已集成,有现成字典参考 选什么版本?看了一下,最后决定选择1.6.54,存在已知CVE,CVE-2026-25646(png_set_quantize()堆溢出),1.6.55修复 CVE-2026-25646速览:png_set_quantize()函数在处理调色板(PLTE Chunk)时存在堆缓冲区溢出,存在30年之久。这正是ASAN的检测目标,也是我们Fuzzing的"猎物"。 2nd. 下载与依赖 # 下载源码 wget https://download.sourceforge.net/libpng/libpng-1.6.54.tar.gz tar -xzf libpng-1.6.54.tar.gz && cd libpng-1.6.54 # 验证版本 head -5 README README for libpng version 1.6.54 ================================ # 安装依赖 sudo apt update sudo apt install zlib1g-dev # libpng依赖zlib 3rd. 用afl-cc + ASAN编译 命令如下: ...