【Clang+LLVM+honggfuzz学习】(二)honggfuzz的安装与试用

书接上篇【Clang+LLVM+honggfuzz学习】(一)LLVM简介、安装和第一个Hello Pass
本篇介绍honggfuzz的安装与简单使用

前言

漏洞检测做毕设,还有一年。半路换研究方向简直要命(微笑) 需要用到 LLVM honggfuzz,算是小白从0开始了…,做个笔记。

  • LLVM :牛人Chris 开发的编译器框架,三段式分层架构【Github】 LLVM
  • Clang:苹果公司开发的LLVM前端 (LLVM的子模块,源码在LLVM的clang文件夹ia)
  • honggfuzz(本文):Google公司开发的模糊测试(fuzzing)工具 。与AFL、libfuzzer齐名,大家称其为AFL+libfuzzer增强版 【Github】 honggfuzz

LLVM

没错!前言是复制粘贴的,我有强迫症,迫切希望开头一致!

前人的工作必须得到尊敬!放到前面,也希望能帮助大家解惑。
1.【CSDN Bolg】fuzzing工具之honggfuzz的安装与使用
2.【CSDN Bolg】使用反馈驱动 Fuzzer 工具 Honggfuzz 进行漏洞挖掘
3.【CSDN Bolg】模糊测试入门案例,利用AFL和Honggfuzz模糊测试Tiff
4.【REEBUF Blog】AFL漏洞挖掘技术漫谈(一):用AFL开始你的第一次Fuzzing
5.【博客园】fuzz实战之honggfuzz

git安装

git就是好用!一样都有源码~

git clone https://github.com/google/honggfuzz.git
make 
make install

输入honggfuzz -v,如果出现下面这样的就说明安装成功了
honggfuzzversion

试用

编写测试文件demo.c

  • 首先,创建 一个专门的文件夹存放我们的测试文件
mkdir fuzz
cd fuzz
mkdir in
mkdir result
touch demo.c
vim demo.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>

int main(int argc, char const *argv[])
{
	if(argc != 2)
	{
		printf("null args!\n");
		return -1;
	}

	/* Get file state */
	struct stat fstat;
	if(stat(argv[1], &fstat))
	{
		printf("Failed ^_^\n");
		return -1;
	}

	/* Open file */
	FILE * fd = NULL;
	fd = open(argv[1], O_RDONLY);
	if(fd == -1)
	{
		printf("open file failed!\n");
		return -1;
	}

	/* Select */
	char buf[15];
	if(read(fd, buf, 2) == -1)
	{
		printf("read failed!");
		return -1;
	}

	if(buf[0] == 'a' && buf[1] == 'b')
	{
		if(read(fd, buf, 4) != -1)
		{
			if(buf[2] == 's')
			{
				read(fd, buf, fstat.st_size - 6);
				printf("%s\n", buf);
			}
		}
	}

	return 0;
}

设置环境变量

额…并不知道用啥来编c,所以我们要设置环境变量来告诉系统编译工具在哪。我使用honggfuzz自带的clang来编译demo.c

export CC=/home/username/Desktop/honggfuzz/hfuzz_cc/hfuzz-clang
export CXX=/home/username/Desktop/honggfuzz/hfuzz_cc/hfuzz-clang++

当然,你也可以设置其他的
ours

setfuzz

开始fuzz

设置环境变量后在fuzz文件夹下打开终端(或者自己逐步cd到那里),输入

hongfuzz -e txt -u -z -Q -i ./in -W ./result -- ./demo ___FILE___

参数介绍(同样来自大佬文章 使用反馈驱动 Fuzzer 工具 Honggfuzz 进行漏洞挖掘

  • e 指定测试用例的扩展名
  • u 保存所有测试用例
  • z 源码插桩
  • Q 打印被测试程序的输出
  • i 语料库,即种子,也就是最原始的测试用例
  • W 输出工作目录
  • -- 分隔 honggfuzz 与被测程序
  • ___FILE___ 被测程序的参数,用占位符代替文件名,类似于 AFL 中的 @@

这里我要加点东西:
___FILE___ 是左右各三个下划线_而且跟待测程序之间需要有一个空格
否则会报错:
beginfuzz

Fuzzing

输入命令之后,则会以in目录下的语料库作为输入,逐个测试我们的demo。产生的异常会存放在result目录下。可以看到这里经过近16分钟的测试,已经产生了441个crashes但感觉还有有点慢,得想办法改进改进
在这里插入图片描述

先CTRL+C终止下fuzzing,查看目前得到得结果。进入存放crashes得目录result,可以看到:
hongfuzz-result
其中存放了HONGGFUZZ.REPORT.TXT报告文件,以及造成程序崩溃得测试用例详情
honggfuzz-report

模糊测试策略(Fuzzing strategy )

官方文档这样说:

The implemented strategy identifies files which add new code coverage (or increased instruction/branch counters). Those inputs are then added to a dynamically stored in memory corpus, and reused during following fuzzing rounds

There are 2 phases of feedback-driven the fuzzing:

  • Honggfuzz goes through each file in the initial corpus directory (-i). It adds files which hit new code coverage to the dynamic input corpus.
  • Honggfuzz choses randomly files from the dynamic input corpus (in-memory), mutates them, and runs a new fuzzing round. If the newly created file induces new code path (extends code coverage), it gets added to the dynamic input corpus as well.

翻译一下就是:

  • 根据你给的语料库进行测试,并记录代码覆盖情况(执行了哪些代码)。
  • 基于你语料库中的测试用例a,根据变异策略(例如随机字节、位反转等)生成测试用例b,如果b开拓了新代码路径(执行了之前没执行过的代码段),就将它加入语料库,下次直接就可以用或基于其开拓新路径。

疑问

Q : 但是怎么知道具体什么用例导致得程序崩溃呢?比较疑惑。。。。。
因为输出目录下都不是可读的文件,难道这里面放的就是测试用例?
官方文档【Github】官方文档 这样写得:


  • OUTPUT FILES

ModeOutput file
Linux,NetBSDSIGSEGV.PC.4ba1ae.STACK.13599d485.CODE.1.ADDR.0x10.INSTR.mov____0x10(%rbx),%rax.fuzz

  • Description

  • SIGSEGV,SIGILL,SIGBUS,SIGABRT,SIGFPE - Description of the signal which terminated the process (when using ptrace() API, it’s a signal which was delivered to the process, even if silently discarded)
  • PC.0x8056ad7 - Program Counter (PC) value (ptrace() API only), for x86 it’s a value of the EIP register (RIP for x86-64)
  • STACK.13599d485 - Stack signature (based on stack-tracing)
  • ADDR.0x30333037 - Value of the _siginfo_t.si_addr_(see man 2 signaction for more details) (most likely meaningless for SIGABRT)
  • INSTR.mov____0x10(%rbx),%rax - Disassembled instruction which was found under the last known PC (Program Counter) (x86, x86-64 architectures only, meaningless for SIGABRT)

24.04.12更新
A: honggfuzz通过程序发生异常信号来分辨测试用例是否造成了被测程序的崩溃。例如错误报告的SIGNAL报告项就指示了某一用例造成了什么异常。比如SIGNAL(6)就时内存访问异常。(简单说,用例造成了程序异常就发出信号,异常处理机制可以捕获该事件并记录。)


Q: 所以应该是以文件名得形式返回异常信息?又或者直接在HONGGFUZZ.REPORT.TXT中看到得异常信息就是全部?上述文章都没有解释得很好的,留个位置,等我知道了再来更新(反正早晚会知道…)

暂未完工~~ 后续有啥要更新的再写吧
最后再次感谢这些博客,带我逐步入门,解决了我学习上的小困惑。另外,本人也还在学习阶段,文中若有错误希望大家不吝指出,共同进步!

最后,再贴上参考得文献:
1.【CSDN Bolg】fuzzing工具之honggfuzz的安装与使用
2.【CSDN Bolg】使用反馈驱动 Fuzzer 工具 Honggfuzz 进行漏洞挖掘
3.【CSDN Bolg】模糊测试入门案例,利用AFL和Honggfuzz模糊测试Tiff
4.【REEBUF Blog】AFL漏洞挖掘技术漫谈(一):用AFL开始你的第一次Fuzzing
5.【博客园】fuzz实战之honggfuzz

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值