libFuzzer简介

fuzz系列之libfuzzer - hac425 - 博客园
前言 本文以 "libfuzzer workshop" 为基础 介绍 libFuzzer 的使用。 libFuzzer简介 libFuzzer 是一个 ,`coverage gui

libFuzzer 是一个in-processcoverage-guidedevolutionaryfuzz 引擎,是 LLVM 项目的一部分。

libFuzzer 和 要被测试的库 链接在一起,通过一个模糊测试入口点(目标函数),把测试用例喂给要被测试的库。

fuzzer会跟踪哪些代码区域已经测试过,然后在输入数据的语料库上进行变异,来使代码覆盖率最大化。代码覆盖率的信息由 LLVMSanitizerCoverage 插桩提供。

一些概念

fuzz 的种类

  • Generation Based :通过对目标协议或文件格式建模的方法,从零开始产生测试用例,没有先前的状态
  • Mutation Based :基于一些规则,从已有的数据样本或存在的状态变异而来
  • Evolutionary :包含了上述两种,同时会根据代码覆盖率的回馈进行变异。

target (被 fuzz 的目标)

基本上所有的程序的主要功能都是对一些 字节序列 进行操作,libfuzzer 就是基于这一个事实(libfuzzer 生成 随机的 字节序列 ,扔给 待 fuzz 的程序,然后检测是否有异常出现) 所以在 libfuzzer 看来,fuzz 的目标 其实就是一个 以 字节序列 为输入的 函数

fuzzer

一个 生成 测试用例, 交给目标程序测试,然后检测程序是否出现异常 的程序

corpus(语料库)

给目标程序的各种各样的输入

以图片处理程序为例:
语料库就是各种各样的图片文件,这些图片文件可以是正常图片也可以不是。

传统Fuzz

介绍

传统的 fuzz 大多通过对已有的样本 按照预先设置好的规则 进行变异产生测试用例,然后喂给 目标程序同时监控目标程序的运行状态。

这类 fuzz 有很多,比如: peach , FileFuzz

首先用 clang 编译 openssl.

./config
make clean
make CC="clang -O2 -fno-omit-frame-pointer -g -fsanitize=address -fsanitize-coverage=trace-pc-guard,trace-cmp,trace-gep,trace-div" -j$(nproc)

主要是为了加上 AddressSanitizer ,用于检测程序中出现的异常(uaf, 堆溢出,栈溢出等漏洞)

常用内存错误检测工具
AddressSanitizer: 检测 uaf, 缓冲区溢出,stack-use-after-return, container-overflow
MemorySanitizer: 检测未初始化内存的访问
UndefinedBehaviorSanitizer: 检测一些其他的漏洞,整数溢出,类型混淆等

总结

感觉libfuzzer 已经把 一个 fuzzer 的核心(样本生成引擎和异常检测系统) 给做好了, 我们需要做的是根据目标程序的逻辑,把 libfuzzer 生成的数据,交给目标程序处理。