2026/4/18 10:10:31
网站建设
项目流程
怎么做属于自己的领券网站,外网不能访问wordpress,it外包合同范本,个人怎么成立公司标签#xff1a; #Fuzzing #AFL #Security #VulnerabilityResearch #0Day #ASAN
⚠️ 免责声明#xff1a;本文仅供安全研究与教学使用。请勿对未授权的商业软件或网络进行攻击。#x1f9ec; 前言#xff1a;什么是覆盖率导向的 Fuzzing#xff1f;
传统的 Fuzzing 是“瞎…标签#Fuzzing #AFL #Security #VulnerabilityResearch #0Day #ASAN⚠️ 免责声明本文仅供安全研究与教学使用。请勿对未授权的商业软件或网络进行攻击。 前言什么是覆盖率导向的 Fuzzing传统的 Fuzzing 是“瞎蒙”随机生成乱码喂给程序效率极低。AFL (American Fuzzy Lop)及其继承者AFL引入了覆盖率导向 (Coverage-Guided)机制。它像生物进化一样变异对种子文件如一个正常的 PNG进行位翻转、剪切、拼接。执行喂给程序运行。反馈通过插桩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.xzcdlibpng-1.6.37# 2. 设置编译器环境变量exportCCafl-clang-fastexportCXXafl-clang-fast# 3. 开启 ASAN (内存消毒) 和 UBSAN (未定义行为检测)exportAFL_USE_ASAN1exportAFL_USE_UBSAN1# 4. 编译安装./configure --disable-shared# 静态链接方便调试make-j4 三、 编写 Harness喂养接口libpng是一个库它自己不会运行。我们需要写一个极简的 C 程序Harness读取标准输入stdin调用libpng的 API 来解析它。新建文件harness.c#includepng.h#includestdio.h#includestdlib.h#includestring.h// AFL 优化的循环模式入口voidfuzz_target(){png_structp png_ptrpng_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);if(!png_ptr)return;png_infop info_ptrpng_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 四、 开火运行 AFL1. 准备种子 (Corpus)Fuzzer 需要知道正常的 PNG 长什么样。我们在in目录下放几个几 KB 大小的合法 PNG 图片。mkdirinoutcp/path/to/some/small.png in/seed.png2. 启动 Fuzzerafl-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_appout/default/crashes/id:000001...2. ASAN 报告解读ASAN 会吐出一段非常详细的报错 12345ERROR: 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 不仅仅是一个工具它代表了**“以攻促防”**的最高境界。通过本次实战我们经历了Instrumentation: 编译时埋点。Harnessing: 编写测试入口。Fuzzing: 遗传算法暴力破解。Triage: ASAN 定位根因。在真实的软件开发生命周期SDLC中将 Fuzzing 集成到 CI/CD 流程如 Google 的 OSS-Fuzz是保证软件在发布前消灭 0-Day 的最佳实践。Next Step:libpng 已经被很多人挖过了。尝试去 Github 上找一个 Star 数在 100-1000 之间、处理复杂文件格式如 PDF, XML, 专有协议的 C/C 项目按照本文的流程跑一跑。你拿到 CVE 编号的概率会非常大