使用反馈驱动 Fuzzer 工具 Honggfuzz 进行漏洞挖掘

honggfuzz 简介

honggfuzz 是由 google 开发的一款基于代码覆盖率的 fuzzer,与 afl、libfuzzer 并驾齐驱。也是一款效率很高的反馈驱动 fuzz 工具

项目Honggfuzz
项目地址https://github.com/google/honggfuzz
开发者Google
是否更新不断更新

honggfuzz 特性

  • 多进程和多线程,因此 fuzz 速度非常快
  • 支持持久性 fuzz(Persistent Fuzzing),长时间调用重复模糊测试的API的进程
  • 易于使用,将其提供给一个简单的语料库目录(对于反馈驱动的模糊测试甚至可以是空的),它将逐步发展,并利用基于反馈的覆盖率指标对其进行扩展
  • 使用底层接口监视进程,更有可能从 crash 中发现并报告被劫持和忽略的信号
  • 支持多种 fuzz 方式(基于硬件的(CPU:分支/指令计数,Intel BTS,Intel PT)和基于软件的反馈驱动的模糊模式)(比其他基于覆盖率的反馈驱动的模糊器更多)

下载项目

$ git clone https://github.com/google/honggfuzz

编译和安装

$ make
$ sudo make install

实战分析

测试 demo 如下(可以与 afl 对比:经典 Fuzzer 工具 AFL 模糊测试指南),这里为了体现 afl 的插桩功能,特意多写了几个 if 分支,在分支深处,会发生栈溢出

#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;
}

上述代码,如果走到最深处,极有可能发生栈溢出。当用户输入的第一个字符是 a,第二个字符是 b,第五个字符是 s,就满足条件。我们的目的是,只给定一个符合格式用例(原始种子,这里就是一个能让程序跑起来的测试用例,即字符串)。fuzz 工具会自动变异生成其他更多的测试用例,寻找能否让代码走到不同的分支(类似于暴力破解)。

源码插桩

hfuzz-clang hfuzzDemo.c -o hfuzzDemo

每一个 if 语句代表每一个条件分支,在 IDA 的反汇编窗口现实的就是一个基本块。一个 if 语句就是一个新分支,如下所示,我们用 hfuz-clang 编译后的反汇编代码,在每个 if 语句中,都已经自动插桩,_sanitizer_cov_trace_const 是插桩函数,用来记录污点。这是 LLVM 编译器自带的优化选项,可以粗略计算代码覆盖率。
在这里插入图片描述

生成语料库

新建 in 目录,在目录下新建文件,写入种子,变异算法会根据此种子变异生成各种测试用例,喂给程序,比如写入以下信息(根据代码,当第一个字符为 a,第二个字符为 b,第五个字符 为 s,可能会发生溢出)

hello world

开始 fuzzing

honggfuzz -e txt -u -z -Q -i ./in -W ./result -- ./hgfuzzDemo ___FILE___

参数分析

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

运行截图
在这里插入图片描述

结果分析

result 目录下存放了结果,包括了 HONGGFUZZ.REPORT.TXT 以及使得程序崩溃的测试用例
在这里插入图片描述

Q&A 可能遇到的问题

问题一:

linux/bfd.c:28:10: fatal error: bfd.h: No such file or directory
 #include <bfd.h>
          ^~~~~~~
compilation terminated.
Makefile:259: recipe for target 'linux/bfd.o' failed
make: *** [linux/bfd.o] Error 1

这是因为没有 binutils-dev

apt-get install binutils-dev

问题二:

linux/unwind.c:27:10: fatal error: libunwind-ptrace.h: No such file or directory
 #include <libunwind-ptrace.h>
          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:259: recipe for target 'linux/unwind.o' failed
make: *** [linux/unwind.o] Error 1

如果提示以下错误,这是因为没有 libunwind-dev

apt-get install libunwind-dev

问题三:
Ubuntu 18.0.4 闪退,所以测试环境为 Kali

总结

honggfuzz 跟传统 fuzz 工具相比,最大的优势就是 fuzzing 速度特别快,多线程多进程的优势让 honggfuzz 可以充分利用 CPU 资源,极大的提高找到崩溃测试用例的速率。这里,我们使用的例子,与笔者在 经典 Fuzzer 工具 AFL 模糊测试指南 提到的例子是一样的,然而

这里用一个十分随意的语料库 hello world,很快就找到了 crash ;相比之前所说的 afl,笔者故意设置了一个与程序崩溃的测试用例高度相似*的用例作为原始语料库,花费了较长时间才找到 crash*。 所以 honggfuzz 的效率显而易见。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
pkav fuzzer 是由pkav团队开发的一款安全工具,具有以下特点: 1. 强大的模糊测试能力:pkav fuzzer 使用基于模糊测试的方法来发现软件或系统中的漏洞。模糊测试通过输入大量的随机、无效或边缘情况的数据来触发程序中的潜在弱点,从而识别和利用漏洞。 2. 全面的覆盖率分析:pkav fuzzer 通过监控程序的执行路径,全面分析测试过程中的覆盖率情况。通过检查测试用例的具体覆盖率,有助于发现可能的漏洞或未被充分测试的代码区域。 3. 可配置的测试策略:pkav fuzzer 允许用户定制测试策略,根据具体的应用场景进行测试。用户可以选择使用不同的测试算法、生成测试用例的方式以及设定运行时间等,以达到最佳的测试效果。 4. 支持多种目标程序:pkav fuzzer 在设计时考虑到了不同类型的目标程序,可以用于测试各种软件或系统,比如 Web 应用、操作系统核心等。这使得 pkav fuzzer 在实际的安全测试工作中具有更大的灵活性和适用性。 5. 高效的漏洞发现与报告生成:pkav fuzzer 通过不断的测试和监控,能够快速准确地发现潜在的漏洞,并生成漏洞报告。这方面的功能可以帮助开发人员更快地修复漏洞,提升软件或系统的安全性。 pkav fuzzer 是一款功能强大、易于使用的安全测试工具,对于提升软件或系统的安全性具有重要作用。它的特点包括强大的模糊测试能力、全面的覆盖率分析、可配置的测试策略、支持多种目标程序以及高效的漏洞发现与报告生成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江下枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值