【honggfuzz学习笔记】honggfuzz的基本特性

本文架构

  • 1.动机
  • 2.honggfuzz的基本概念
    • 官网描述
    • 解读
  • 3. honggfuzz的反馈驱动(Feedback-Driven)
    • 软件驱动反馈(software-based coverage-guided fuzzing)
      • 代码覆盖率
        • 代码覆盖率的计量单位
      • 代码覆盖率的统计方式
    • 硬件驱动反馈( hardware-based coverage-feedback fuzzing)
  • 4.持久型Fuzzing(Persistent Fuzzing)
  • 5. 日志信息

1.动机

最近的学习需要使用honggfuzz,但苦于一直没有高度相关的、系统性总结的博客,官方文档写的也十分有限。于是收集各方资料形成此文。笔者还在初步学习阶段,若有错误还请大家不吝指出。
【Github】honggfuzz

首先提供几篇参考的博客,若看完本文还有不懂的地方希望能给大家解惑。
【安全客Blog】honggfuzz漏洞挖掘技术原理分析这篇文章讲的比较细致,我的大部分知识基本是这里看懂的。
【看雪Blog】honggfuzz漏洞挖掘技术深究系列分析的比较深入,且博主好几篇类似文章,值得参考。

2.honggfuzz的基本概念

官网描述

Description:A security oriented, feedback-driven, evolutionary, easy-to-use fuzzer with interesting analysis options.

解读

从官网描述中我们可以提取到honggfuzz的几个特点:

面向安全(security oriented): 这点十分容易理解,fuzzing工具用以测试程序代码中可能存在的安全隐患(i.e. 漏洞)。
反馈驱动(feedback-driven): 通过监控样本触发的代码覆盖率,改进输入样本以提高代码覆盖率,增加发现漏洞的概率。本文将在第3章介绍。
持久型Fuzzing(Persistent Fuzzing): 所谓持久型fuzzing(Persistent Fuzzing),就是长生命周期进程重复调用被fuzz的API。
多种反馈驱动方式(Feedback-Driven):
* 支持基于软件和基于硬件(eg.分支计数(branch counting)、指令计数(instruction counting)等)
* Intel BTS(Branch Trace Store),
* Intel PT(Processor Tracing)
更接近底层的异常监视: 使用底层接口监视进程(linux和NetBSD下使用ptrace),与其它fuzzer相比更有可能从crash中发现并报告被劫持/忽略的信号(被fuzz的程序可能截获并隐藏)。

3. honggfuzz的反馈驱动(Feedback-Driven)

【官方文档】FeedbackDrivenFuzzing.md

Feedback-driven fuzzing :
Honggfuzz is capable of performing feedback-guided (code coverage driven) fuzzing. It can utilize the following sources of data:
* (Linux) Hardware-based counters (instructions, branches)
* (Linux) Intel BTS code coverage (kernel >= 4.2)
* (Linux) Intel PT code coverage (kernel >= 4.2)
* Sanitizer-coverage instrumentation (-fsanitize-coverage=bb)
* Compile-time instrumentation (-finstrument-functions or -fsanitize-coverage=trace-pc[-guard],indirect-calls,trace-cmp or both)
Developers may provide the initial file corpus which will be gradually improved upon, but it’s not necessary with feedback-driven modes.

软件驱动反馈(software-based coverage-guided fuzzing)

Requirements for software-based coverage-guided fuzzing

  • -fsanitize-coverage=trace-pc-guard,indirect-calls,trace-cmp - Clang >= 5.0
  • -fsanitize-coverage=trace-pc - GCC >= 9.0
  • -fsanitize-coverage=bb - Clang >= 3.7
  • -finstrument-functions - GCC or Clang
  • [older, slower variant] -fsanitize-coverage=trace-pc,indirect-calls - Clang >= 3.9
    Note: The -fsanitize-coverage=trace-pc-guard,indirect-calls,trace-cmp set of flags will be automatically added to clang’s command-line switches when using hfuzz-clang binary.

命令示例:

$ <honggfuzz_dir>/honggfuzz/hfuzz_cc/hfuzz-clang terminal-test.c -o terminal-test

代码覆盖率

代码覆盖率的计量单位

honggfuzz的代码覆盖计算有三种方式:

  • 函数级(Function-Level)
  • 基本块级(Basic Bolck-Level)
  • 边界级(Edge-Level)

函数级别(Function-Level) 最为粗糙,只记录函数的调用情况。如下代码,其仅会记录function1function2是否执行,而不关心内部if语句的执行情况,使用这种覆盖率统计方式可能会使我们的程序分析丢失一定的分析精度。
因此,常用的是基本块级(Basic Bolck-Level),能满足大部分程序分析的精度要求,基本块以跳转指令做为划分依据。如function1代码,此时,会分别记录Block ABlock B的是否执行。当用例a确小于b时仅能触发Block A,而Block B无法覆盖。通过用例变异后续可能产生能访问Block B的测试用例。

void function1(int a,int b){
... if(a<b){//Block A}else{//Block B}
...
}

边界级(Edge-Level) 是基本块级更为精细的一种情况。如下代码,if(a)及其上面的语句被划归为Block A,当a==0时才会执行Block A,否则执行Block C。前面基本块的方式就无法确切地知道是否曾从Block A执行到Block C,因为不论是A-B-C还是A直达C,基本块A和C都会被标记为已覆盖。

为了解决这一问题,edge方式会在A-C之间创建一个虚拟块D。以判断是否曾经执行过A直达C路径。

void function2(int a){
...	//Block Aif(a){a=0;//Block B}else{//Block C}
}

代码覆盖率的统计方式

有源码时:
SanitizerCoverage:SanitizerCoverage内置在LLVM中,可以在函数、基本块和边界这些级别上插入对用户定义函数的回调,实现了简单的覆盖率报告和可视化。

  • 添加编译选项(基本块统计方式) CFLAG=“-fsanitize=address -fsanitize-coverage=bb”

无源码时:
使用Pin、DynamoRIO等二进制插桩工具去hook统计,或者pediy改指令的方式去监控。

硬件驱动反馈( hardware-based coverage-feedback fuzzing)

【区分为LINUX系和Intel(x86)系】
Linux系:

Requirements for hardware-based counter-based fuzzing

  • GNU/Linux OS
  • A relatively modern Linux kernel (4.2 should be ok)
  • CPU which is supported by the perf subsystem for hardware-assisted instruction and branch counting

Intel系

Requirements for hardware-based coverage-feedback fuzzing (Intel)

  • CPU supporting BTS (Branch Trace Store) for hardware assisted unique pc and edges (branch pairs) counting. Currently it’s available only in some newer Intel CPUs (unfortunately no AMD support for now)
  • CPU supporting Intel PT (Processor Tracing) for hardware assisted unique edge (branch pairs) counting. Currently it’s available only in some newer Intel CPUs (since Broadwell architecture)
  • GNU/Linux OS with a supported CPU; Intel Core 2 for BTS, Intel Broadwell for Intel PT
  • Intel’s ibipt library for Intel PT
  • Linux kernel >= v4.2 for perf AUXTRACE

对于闭源程序的反馈驱动Fuzzing,通常有3种方式:

  • 二进制插桩:使用Pin或DynamoRIO动态插桩监控代码覆盖率,比如winafl

  • 虚拟化技术:使用Qemu或Boch等虚拟化技术实现应用层和内核层的代码覆盖率监控,比如afl、bochpwn

  • 硬件级技术:使用Intel Processor Trace(PT)技术,比如honggfuzz

apt install linux-tools-common
# 安装好后输入
perf -v
#然后会弹出提示你安装哪些包,根据提示安装对应的包即可。

perf-v
perf 按照固定的频率去“采样”,然后再统计函数的调用次数,算出百分比。只要采样的频率足够大,把这些“瞬时截面”组合在一起,就可以得到进程运行时的可信数据,比较全面地描述出 CPU 使用情况。
输入 top 查看进程的 PID 号

$ sudo perf top -K -p 3213 (PID)

4.持久型Fuzzing(Persistent Fuzzing)

如前所述,持久型Fuzzing就是具有长生命周期进程,可重复调用被用以fuzz的API

  • trace-pc: 追踪执行过的基本块BB,在每个edge中插入__saitizer_cov_trace_pc函数,可定义该函数作为相应的回调处理。

  • indirect-calls:在每个间接调用中添加PC追踪,与前面的trace-pctrace-pc-guard联合使用,回调函数:__sanitizer_cov_trace_pc_indir

  • trace-cmp:追踪每个比较指令和swith语句

5. 日志信息

测试时会输出日志信息。
下面是日志信息的源码。

LOG_I("Size:%zu (i,b,hw,edge,ip,cmp): %" PRIu64 "/%" PRIu64 "/%" PRIu64 "/%" PRIu64"/%" PRIu64 "/%" PRIu64 ", Tot:%" PRIu64 "/%" PRIu64 "/%" PRIu64 "/%" PRIu64"/%" PRIu64 "/%" PRIu64,run->dynamicFileSz, run->linux.hwCnts.cpuInstrCnt, run->linux.hwCnts.cpuBranchCnt,run->linux.hwCnts.newBBCnt, softCntEdge, softCntPc, softCntCmp,run->global->linux.hwCnts.cpuInstrCnt, run->global->linux.hwCnts.cpuBranchCnt,run->global->linux.hwCnts.bbCnt, run->global->linux.hwCnts.softCntEdge,run->global->linux.hwCnts.softCntPc, run->global->linux.hwCnts.softCntCmp);

可以看到,输出的信息分别代表单次测试设计的指令数量(cpuInstrCnt)、分支计数(cpuBranchCnt)、新基本块数量newBBCnt)、软件边(softCntEdge)、软件路径(softCntPc)、软件比较次数(softCntCmp)。以Tot:开头的则是整个程序分析的次数。

先写到这,后期继续更。任重道远啊…哎~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTFHUB RCE作业

题目地址&#xff1a;CTFHub 完成情况如图&#xff1a; 知识点&#xff1a; preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

【Python小游戏】植物大战僵尸的实现与源码分享

文章目录 Python版植物大战僵尸环境要求方法源码分享初始化页面&#xff08;部分&#xff09;地图搭建&#xff08;部分&#xff09;定义植物类 &#xff08;部分&#xff09;定义僵尸类&#xff08;部分&#xff09;游戏运行入口 游戏源码获取 Python版植物大战僵尸 已有的植…

resume

通过添加 --resume 参数&#xff0c;用户可以在命令行中指定一个检查点文件的路径&#xff0c;用于恢复之前训练的模型状态。如果用户不指定 --resume 参数&#xff0c;则默认值为空字符串。 python train.py train multi_resnet18_kd --resume ./save_checkpoints/multi_resn…

Git:远程仓库名称变更本地无法提交解决

报错信息 blog % git push To github.com:hannah-lin-sama/web-docs.git! [rejected] main -> main (non-fast-forward) 错误&#xff1a;无法推送一些引用到 github.com:hannah-lin-sama/web-docs.git 提示&#xff1a;更新被拒绝&#xff0c;因为您当前分支的最新…

JavaScript中处理回调与状态更新

JavaScript中处理高速回调与状态更新的问题分析与解决方案 在JavaScript编程中&#xff0c;处理高速执行的回调函数时常会遇到状态管理的问题&#xff0c;尤其是在处理数组或其他共享数据结构时。这些问题通常因为JavaScript的异步执行特性以及共享状态的可变性引起。下面将分…

git工具的安装及使用

git工具的安装及使用 一、安装git工具 Windows下安装git工具&#xff1a;在Windows下打开以下网址&#xff0c;直接下载安装软件即可。https://gitforwindows.org/ 在ubuntu下安装git工具&#xff1a;保证ubuntu能正常上网的前提下&#xff0c;直接使用以下命令安装git工具即…

基于混合算法的冬枣果型分级研究与实践

如题&#xff0c;这是一个学生的课题&#xff0c;如果写论文可以从以下角度展开&#xff1a; 一、引言 1. 研究背景及意义 2. 国内外研究现状 3. 研究目标与内容 二、冬枣果型分级现状及挑战 1. 冬枣果型分级的重要性 2. 传统分级方法的局限性 3. 机器学习和深度学习在果型分级…

解决拉格朗日四平方和定理

1 问题 “拉格朗日四平方数和定理”是数学中著名的一个定理&#xff0c;其内容为&#xff1a;任意一个正整数均可表示为四个整数的平方和(其中有些整数可以为零)。要求输入一个数&#xff0c;找出所有符合该定理的四个整数&#xff1f; 2 方法 可以通过“四平方数和定理”的含义…

【Proteus】51单片机对直流电机的控制

直流电机&#xff1a;输出或输入为直流电能的旋转电机。能实现直流电能和机械能互相转换的电机。把它作电动机运行时是直流电动机&#xff0c;电能转换为机械能&#xff1b;作发电机运行时是直流发电机&#xff0c;机 械能转换为电能。 直流电机的控制&#xff1a; 1、方向控制…

动态多目标测试函数DF1-DF14,FDA1-FDA5,SDP1-SDP12的TurePOF(MATLAB代码)

动态多目标测试函数FDA1、FDA2、FDA3、FDA4、FDA5的turePOF&#xff08;MATLAB代码&#xff09; 动态多目标测试函数DF1-DF14的turePOF变化&#xff08;提供MATLAB代码&#xff09; 动态多目标测试函数SDP1-SDP12的TurePOF变化视频&#xff08;含MATLAB代码及参考文献&#xff…

Android Compose使用AndroidView,并将 AndroidView 保存成图片。

谢谢关注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介绍HarmonyOs开发之———容器组件使用 http://t.csdnimg.cn/r9Qd1 一、使用 AndroidView //images 是一个 uri数组var androidView by remember { mutableStateOf<View?>(null) }AndroidView(facto…

【Vue3源码学习】— CH3.2 VNode解析(下)

VNode解析—下 4. normalizeChildren4.1 源码解析4.2 位运算符 |= 的应用4.2.1 按位或(|)4.2.2 赋值4.2.3 使用场景4.2.4 源码中`vnode.patchFlag |= PatchFlags.DYNAMIC_SLOTS`说明4.3 `;(children as RawSlots)._ = SlotFlags.STABLE` 说明5. Vue 应用的实例化和挂载流程5.…

cpp智能指针详解+简单模拟实现

在cpp中为了避免内存泄漏采取了一系列手段&#xff0c;例如智能指针&#xff0c;智能指针采用RAII思想来管理内存(Resource Acquisition Is Initialization是一种利用对象生命周期来控制程序资源&#xff08;如内存、文件句柄、网络连接、互斥量等等&#xff09;的简单技术。&a…

Java Swing制作大鱼吃小鱼魔改版本

《大鱼吃小鱼》这款游戏的历史渊源可以追溯到休闲游戏的兴起和发展。在游戏的早期发展阶段&#xff0c;开发者们开始探索各种简单而有趣的游戏玩法&#xff0c;以吸引玩家的注意力。在这样的背景下&#xff0c;《大鱼吃小鱼》应运而生&#xff0c;它结合了自然界的食物链原理与…

AI大模型之idea通义灵码智能AI插件安装方式

问题描述 主要讲述如何进行开发工具 idea中如何进行通义灵码的插件的安装解决方案 直接在idea的plugin市场中安装 下载插件之后进行安装 见资源

【python】中文数字转换为阿拉伯数字

题目&#xff1a;中文数字转换为阿拉伯数字&#xff0c;如下&#xff1a; 输入&#xff1a; 十一万亿五千三百万三千二百零七输出&#xff1a; 11000053003207思路&#xff1a; 先写一个处理10000以下的转换函数&#xff0c;如下代码的 num_process() 以亿和万分别进行切分…

JUC专题——Java并发基础

本文部分内容节选自《Java并发编程的艺术》 线程 现代操作系统调度的最小单元是 线程 , 也叫 轻量级进程 . 一个进程里可以创建多个线程, 线程拥有各自的计数器, 堆栈和局部变量, 并且能够访问共享的内存变量 线程优先级 现代操作系统使用时分的形式调度运行的线程, 操作系…

lua 光速入门

文章目录 安装注释字符串变量逻辑运算条件判断循环函数Table (表)常用全局函数模块化 首先明确 lua 和 js Python一样是动态解释性语言&#xff0c;需要解释器执行。并且不同于 Python 的强类型与 js 的弱类型&#xff0c;它有点居中&#xff0c;倾向于强类型。 安装 下载解释…

【OpenHarmony】TDD-FUZZ环境配置

零、参考 1、AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘&#xff1a;https://blog.csdn.net/suhao0911/article/details/110950742 一、创建工作目录 1、新建工作目录如&#xff1a;D:\0000_TDD_FUZZ\0000_ohos_tdd_fuzz。 2、gitee上下载 t…

陇剑杯 ios 流量分析 CTF writeup

陇剑杯 ios 流量分析 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek目录结构 LearnCTF ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │…