Honggfuzz实战
前言
本文介绍 libfuzzer
和 afl
联合增强版 honggfuzz
.同时介绍利用 honggfuzz
来 fuzz
网络应用服务。
介绍
honggfuzz
也是 google
开发的一款 fuzz
. 其设计思路 和 libfuzzer
和 afl
类似 ,感觉就是 libfuzzer
+ afl
的 增强版。
编译
git clone https://github.com/google/honggfuzz.git
cd honggfuzz
make
honggfuzz
的使用文档在
https://github.com/google/honggfuzz/tree/master/docs
对几条命令做个解释
honggfuzz -f input_dir -z -s -- /usr/bin/djpeg
-f
: 指定初始样本集目录
-z
: 使用编译时的指令插桩信息来 为 样本变异做回馈, 默认选项
-s
: 表示目标程序从stdin
获取输入,即样本数据通过stdin
喂给程序
honggfuzz -f input_dir -- /usr/bin/djpeg ___FILE___
___FILE___
: 类似于afl
的@@
, 表示程序通过文件获取输入,fuzz
过程会被替换为相应的样本文件名
honggfuzz -f input_dir -P -- /usr/bin/djpeg_persistent_mode
-P
: 表示使用persistent
模式
简单示例(libFuzzer模式)
这里用 libfuzzer-workshop
里面的 libxml2
来进行 fuzz
测试
https://github.com/Dor1s/libfuzzer-workshop/tree/master/lessons/08
下载那个 libxml2.tgz
然后解压,用 hfuzz-clang
编译
tar xvf libxml2.tgz
cd libxml2/
CC=/home/haclh/vmdk_kernel/honggfuzz/hfuzz_cc/hfuzz-clang CXX=/home/haclh/vmdk_kernel/honggfuzz/hfuzz_cc/hfuzz-clang++
export CC=/home/haclh/vmdk_kernel/honggfuzz/hfuzz_cc/hfuzz-clang
export CXX=/home/haclh/vmdk_kernel/honggfuzz/hfuzz_cc/hfuzz-clang++
./autogen.sh
CC=/home/haclh/vmdk_kernel/honggfuzz/hfuzz_cc/hfuzz-clang CXX=/home/haclh/vmdk_kernel/honggfuzz/hfuzz_cc/hfuzz-clang++ ./configure
make -j4
/home/haclh/vmdk_kernel/honggfuzz/
是honggfuzz
所在的目录
然后会生成 libxml2/.libs/libxml2.a
。
看看 fuzzer
代码
#ifdef __cplusplus
extern "C" {
#endif
#include <inttypes.h>
#include "libxml/parser.h"
#include <stdlib.h>
#include <libhfuzz/libhfuzz.h>
FILE* null_file = NULL;
int LLVMFuzzerInitialize(int* argc, char*** argv)
{
null_file = fopen("/dev/null", "w");
return 0;
}
int LLVMFuzzerTestOneInput(const uint8_t* buf, size_t len)
{
xmlDocPtr p = xmlReadMemory((const char*)buf, len, "http://www.google.com", "UTF-8", XML_PARSE_RECOVER | XML_PARSE_NONET);
if (!p) {
return 0;
}
xmlDocFormatDump(null_file, p, 1);
xmlFreeDoc(p);
return 0;
}
#ifdef __cplusplus
}
#endif
和 libfuzzer
的代码基本一致,用 hfuzz-clang
编译(类似于 libfuzzer
, 需要和 libhfuzz.a
链接)。
/