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 生成的数据,交给目标程序处理。