libFuzzer简介
fuzz系列之libfuzzer - hac425 - 博客园
前言 本文以 "libfuzzer workshop" 为基础 介绍 libFuzzer 的使用。 libFuzzer简介 libFuzzer 是一个 ,`coverage gui
libFuzzer 是一个in-process
,coverage-guided
,evolutionary
的 fuzz
引擎,是 LLVM
项目的一部分。
libFuzzer
和 要被测试的库 链接在一起,通过一个模糊测试入口点(目标函数),把测试用例喂给要被测试的库。
fuzzer
会跟踪哪些代码区域已经测试过,然后在输入数据的语料库上进行变异,来使代码覆盖率最大化。代码覆盖率的信息由 LLVM
的 SanitizerCoverage
插桩提供。
一些概念
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
生成的数据,交给目标程序处理。