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

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

本文架构,PS:可选择观看哦

  • 前言
  • git安装
  • 试用
    • 编写测试文件`demo.c`
    • 设置环境变量
    • 开始fuzz
    • Fuzz-ing
    • 疑问

前言

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

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

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

前人的工作必须得到尊敬!放到前面,也希望能帮助大家解惑。
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
  • 然后,在in文件夹里面创建一个txt文件,写上helloworld(或者其他的也行)

  • 最后,在fuzz文件夹内,写一个demo,我的demo来源:
    使用反馈驱动 Fuzzer 工具 Honggfuzz 进行漏洞挖掘–实战分析
    感谢大佬!那我直接贴在下面了

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

Fuzz-ing

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

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

疑问

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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/514982.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode】 c++ 数字全排列, test ok

1. 问题 2. 思路 3. 代码实现 #if 0 class Solution { private:vector<int> path; // 满足条件的一个结果 vector<vector<int>> res; // 结果集 void backtracking(vector<int> nums, vector<bool> used){// 若path的个数和nums个数相等&…

事件循环(2024 面试题)

答题大纲 先说基本知识点&#xff0c;宏任务、微任务有哪些说事件循环机制过程&#xff0c;边说边画图出来说async/await执行顺序注意&#xff0c;可以把 chrome 的优化&#xff0c;做法其实是违法了规范的&#xff0c;V8 团队的PR这些自信点说出来&#xff0c;显得你很好学&a…

Unsafe类详解

1. Unsafe 概念 Unsafe类位于sun.misc包下&#xff0c;它是java实现高并发的基础&#xff0c;通过它可以执行一些不安全的操作&#xff0c;如像C语言一样直接操作内存资源&#xff0c; 它提供的这些方法增强了java对底层资源的操作能力&#xff0c;但同时也增加了程序出错的风…

typdef:深入理解C语言中typdef关键词的用法

typedef&#xff1a;C语言中的类型重命名关键词 在C语言中&#xff0c;typedef 是一个非常有用的关键词&#xff0c;它允许我们为现有的数据类型定义一个新的名称。这不仅使得代码更加清晰易读&#xff0c;还提高了代码的可维护性。在这篇博客中&#xff0c;我们将深入探讨 ty…

git中对子模块的本地修改、提交和推送远程仓库

场景 当前的某个项目&#xff0c;其使用了另一个项目&#xff0c;我在本地需要对子项目进行修改&#xff0c;并将这些修改提交到github中的子项目和父项目。其实在github中&#xff0c;子项目都是特定的指向子项目的某次提交&#xff0c;因此对于父项目的修改&#xff0c;其实…

Linux-Arm GDB调试(本地和远程)

目录 问题描述 已有coredump 没有coredump 小结 问题描述 Linux本机调试使用GDB非常方便&#xff0c;但嵌入式Linux设备资源有限&#xff0c;通常并没有交叉编译工具&#xff0c;那嵌入式设备上的应用发生问题如何查找问题&#xff1f;通常IDE有远程DEBUG功能&#xff0c;这…

OpenHarmony实战:标准系统移植指南

本文描述了移植一块开发板的通用步骤&#xff0c;和具体芯片相关的详细移植过程无法在此一一列举。后续社区还会陆续发布开发板移植的实例供开发者参考。 定义开发板 本文以移植名为MyProduct的开发板为例讲解移植过程&#xff0c;假定MyProduct是MyProductVendor公司的开发板…

[Arduino学习] ESP8266读取DHT11数字温湿度传感器数据

目录 1、传感器介绍 2、接线 3、DHT.h库 1、传感器介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;是简单环境监测项目的理想选择。 温度分辨率为1C&#xff0c;相对湿度为1&#xff05;。温度范围在0C到50C之间&#xff0c;湿度的测…

自注意力机制详解

视频链接&#xff1a;李宏毅 self-attention讲解上 参考文章&#xff1a;RNN详解      Attention详解      彻底搞懂Attention机制      知乎Transformer详解 传统的编码器解码器架构 一般最简单的编码器-解码器架构都是基于RNN模型的&#xff0c;编码器将输入…

突破校园网限速:使用 iKuai 多拨分流负载均衡(内网带宽限制通用)

文章目录 1. 简介2. iKuai 部署2.1 安装 VMware2.2 安装 iKuai(1) 下载固件(2) 安装 iKuai 虚拟机(3) 配置 iKuai 虚拟机(4) 配置 iKuai(5) 配置多拨分流 2.3 测试速度 1. 简介 由于博主连的内网是限速的&#xff0c;但是不同设备之间的网速却始终差不多&#xff0c;有一天看着…

CSS3新增的语法(三)【2D,3D,过渡,动画】

CSS3新增的语法&#xff08;三&#xff09;【2D,3D,过渡&#xff0c;动画】 10.2D变换10.1. 2D位移10.2. 2D缩放10.3. 2D旋转10.4. 2D扭曲&#xff08;了解&#xff09;10.5. 多重变换10.6. 变换原点 11. 3D变换11.1. 开启3D空间11.2. 设置景深11.3. 透视点位置11.4. 3D 位移11…

R语言中的常用数据结构

目录 R对象的基本类型 R对象的属性 R的数据结构 向量 矩阵 数组 列表 因子 缺失值NA 数据框 R的数据结构总结 R语言可以进行探索性数据分析&#xff0c;统计推断&#xff0c;回归分析&#xff0c;机器学习&#xff0c;数据产品开发 R对象的基本类型 R语言对象有五…

使用OMP复原一维信号(MATLAB)

参考文献 https://github.com/aresmiki/CS-Recovery-Algorithms/tree/master MATLAB代码 %% 含有噪声 % minimize ||x||_1 % subject to: (||Ax-y||_2)^2<eps; % minimize : (||Ax-y||_2)^2lambda*||x||_1 % y传输中可能含噪 yyw % %% clc;clearvars; close all; %% 1.构…

js类型转换

类型转换只有这四种&#xff0c;例如如果要对象转数字&#xff0c;那么就需要先把对象转成原始类型&#xff0c;再从原始类型转到数字。 空数组转原始类型是一个空字符串。空对象转原始类型是[object Object]。 let a {} console.log(a);// NaN //等价于 a->原始 然后原始…

线控悬架系统分析

线控悬架系统分析 附赠自动驾驶学习资料和量产经验&#xff1a;链接 1 线控悬架系统系统发展现状 • 车辆驾乘过程中&#xff0c;操控性和舒适性是两个重要的评价指标&#xff0c;两者很难兼顾&#xff1b; • 线控悬架就是根据路况实际情况自动调节悬架的高度、刚度、阻尼实…

OpenHarmony实战:小型系统移植概述

驱动主要包含两部分&#xff0c;平台驱动和器件驱动。平台驱动主要包括通常在SOC内的GPIO、I2C、SPI等&#xff1b;器件驱动则主要包含通常在SOC外的器件&#xff0c;如 LCD、TP、WLAN等 图1 OpenHarmony 驱动分类 HDF驱动被设计为可以跨OS使用的驱动程序&#xff0c;HDF驱动框…

【JAVA】基础学习03变量和关键字

文章目录 JAVA变量与运算符1.关键字&#xff08;keyword&#xff09;2.标识符( identifier)2.1命名规则2.2命名规范2.3变量作用和类型2.3.1整型变量2.3.2补充&#xff1a;计算机存储单位2.3.3浮点类型&#xff1a;float、double2.3.4 关于浮点型精度的说明2.3.5 字符类型&#…

Linux:ip和ip协议的初步认识

文章目录 ip协议基本认识ip协议的报头网段划分ip的类型划分 ip协议基本认识 前面对于TCP的内容已经基本结束了&#xff0c;那么这也就意味着在传输层也已经结束了&#xff0c;那么下一步要进入的是的是网络层&#xff0c;网络层中也有很多种协议&#xff0c;这里主要进行解析的…

【yolov5小技巧(1)】---可视化并统计目标检测中的TP、FP、FN

文章目录 &#x1f680;&#x1f680;&#x1f680;前言一、1️⃣相关名词解释二、2️⃣论文中案例三、3️⃣新建相关文件夹四、4️⃣detect.py推理五、5️⃣开始可视化六、6️⃣可视化结果分析 &#x1f440;&#x1f389;&#x1f4dc;系列文章目录 嘻嘻 暂时还没有~~~~ &a…

OpenHarmony实战:小型系统平台驱动移植

在这一步&#xff0c;我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构&#xff1a; device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …