【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版植物大战僵尸 已有的植…

【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…

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

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

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

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

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日志分析 │ │…

html+vue编写分页功能

效果&#xff1a; html关键代码&#xff1a; <div class"ui-jqgrid-resize-mark" id"rs_mlist_table_C87E35BE"> </div><div class"list_component_pager ui-jqgrid-pager undefined" dir"ltr"><div id"pg…

Linux编辑器-vim的使用

vim的基本概念 vim的三种模式(其实有好多模式&#xff0c;目前掌握这3种即可),分别是命令模式&#xff08;command mode&#xff09;、插 入模式&#xff08;Insert mode&#xff09;和底行模式&#xff08;last line mode&#xff09;&#xff0c;各模式的功能区分如下&#…

中医优势病种诊疗方案数据库

中医诊疗方案结合了几千年的实践经验与理论体系&#xff0c;形成了一套独特的诊疗方法。随着国家对中医药事业的重视&#xff0c;多个中医诊疗方案被国家卫生健康委员会和国家中医药管理局等权威机构正式发布&#xff0c;这对规范中医临床诊疗行为&#xff0c;提升医疗服务质量…

执行npm命令一直出现sill idealTree buildDeps怎么办?

一、问题 今天在运行npm时候一直出项sill idealTree buildDeps问题 二、 解决 1、先删除用户界面下的npmrc文件&#xff08;注意一定是用户C:\Users\{账户}\下的.npmrc文件下不是nodejs里面&#xff09;&#xff0c;进入到对应目录下&#xff0c;Mac启动显示隐藏文件操作&…

生产服务器变卡怎么排查

服务器变卡怎么排查&#xff0c;可以从以下四个方面去考虑 生产服务器变卡怎么排查 1、网络2、cpu的利用率3、io效率4、内存瓶颈 1、网络 可以使用netstat、iftop等工具查看网络流量和网络连接情况&#xff0c;检查是否网络堵塞、丢包等问题 2、cpu的利用率 1、用top命令定…

驱动执行篇之电机编码器:编码器基础与双编码器方案

目录 |1.编码器概述 |2.编码器分类 |2.1.增量式编码器和绝对值编码器 |2.2.光电编码器 |3.双编码器方案 |3.1几种扭矩感知方案 |3.3双编码器安装方式 |1.编码器概述 编码器 编码器&#xff0c;是将信号&#xff08;如比特流&#xff09;或数据进行编制、转换为可用以通讯…

ECA-Net:深度卷积神经网络中的高效通道注意力机制【原理讲解及代码!!!】

ECA-Net&#xff1a;深度卷积神经网络中的高效通道注意力机制 在深度学习领域&#xff0c;特别是在深度卷积神经网络&#xff08;DCNN&#xff09;中&#xff0c;注意力机制已经成为提升模型性能的关键技术之一。其中&#xff0c;ECA模块&#xff08;Efficient Channel Attent…

前端项目的导入和启动

安装依赖 前端安装依赖只需要在控制台执行“npm i”即可。Tips&#xff1a;当我们执行的时候&#xff0c;有时候会很慢。可以考虑使用yarn或者pnpm。然而使用yarn或者pnpm有时候有一些莫名其妙的问题。所以还是得使用npm&#xff0c; 这个时候可以通过更换镜像源为淘宝镜像源。…

flex上下固定中间占固定高度(中间左右菜单)且内容自动滚动

效果图 布局&#xff1a; <view class"pop_tSet"><view class"pop_Con"><view class"box_bb"><view class"bb_title">{{titleObj[popType]}}</view></view><view class"box_bb_bot"…

The Sandbox 推出全新后室模板!

我们非常高兴地向你介绍游戏制作器的另一个新成员&#xff1a; 后室模板&#xff01; 步入神秘而不自然的空旷空间&#xff0c;感觉有些......不对劲。准备好探索、创造和拥抱引人入胜的后室世界吧。 什么是后室&#xff08;Backroom&#xff09;游戏&#xff1f; 早在 2019 年…

获取公募基金持仓【数据分析系列博文】

摘要 从指定网址获取公募基金持仓数据&#xff0c;快速解析并存储数据。 &#xff08;该博文针对自由学习者获取数据&#xff1b;而在投顾、基金、证券等公司&#xff0c;通常有Wind、聚源、通联等厂商采购的数据&#xff09; 1. 导入必要的库&#xff1a; pandas 用于数据处理…