【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.rhkb.cn/news/313066.html

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

相关文章

MCU最小系统晶振模块设计

单片机的心脏&#xff1a;晶振 晶振模块 单片机有两个心脏&#xff0c;一个是8M的心脏&#xff0c;一个是32.768的心脏 8M的精度较低&#xff0c;所以需要外接一个32.768khz 为什么是8MHZ呢&#xff0c;因为内部自带的 频率越高&#xff0c;精度越高&#xff0c;功耗越大&am…

2024Guitar Pro 8.1 Mac 最新下载、安装、激活、换机图文教程

吉他爱好者必备神器&#xff1a;Guitar Pro v8.1.1 Build 17深度解析 随着数字音乐制作和学习的日益普及&#xff0c;越来越多的吉他爱好者开始寻找能够帮助他们提升技能、创作音乐的专业工具。在众多吉他制作软件中&#xff0c;Guitar Pro因其强大的功能和易用的界面备受推崇…

超平实版Pytorch CNN Conv2d

torch.nn.Conv2d 基本参数 in_channels (int) 输入的通道数量。比如一个2D的图片&#xff0c;由R、G、B三个通道的2D数据叠加。 out_channels (int) 输出的通道数量。 kernel_size (int or tuple) kernel&#xff08;也就是卷积核&#xff0c;也可…

2024第十五届蓝桥杯JavaB组省赛部分题目

目录 第三题 第四题 第五题 第六题 第七题 第八题 转载请声明出处&#xff0c;谢谢&#xff01; 填空题暂时可以移步另一篇文章&#xff1a;2024第十五届蓝桥杯 Java B组 填空题-CSDN博客 第三题 第四题 第五题 第六题 第七题 第八题 制作不易&#xff0c;还请点个赞支持…

go语言context

context在服务端编程基本都贯穿所有&#xff0c; Context 是请求的上下文信息。对于RPC Server来说&#xff0c;一般每接收一个新的请求&#xff0c;会产生一个新的Context&#xff0c;在进行内部的函数调用的时候&#xff0c;通过传递Context&#xff0c;可以让不同的函数、协…

pytest学习-pytorch单元测试

pytorch单元测试 一.公共模块[common.py]二.普通算子测试[test_clone.py]三.集合通信测试[test_ccl.py]四.测试命令五.测试报告 希望测试pytorch各种算子、block、网络等在不同硬件平台,不同软件版本下的计算误差、耗时、内存占用等指标. 本文基于torch.testing._internal 一…

春藤实业启动SAP S/4HANA Cloud Public Edition项目,与工博科技携手数字化转型之路

3月11日&#xff0c;广东省春藤实业有限公司&#xff08;以下简称“春藤实业”&#xff09;SAP S/4HANA Cloud Public Edition&#xff08;以下简称“SAP ERP公有云”&#xff09;项目正式启动。春藤实业董事长陈董、联络协调项目经理慕总、内部推行项目经理陈总以及工博董事长…

【函数式接口使用✈️✈️】通过具体的例子实现函数结合策略模式的使用

目录 前言 一、核心函数式接口 1. Consumer 2. Supplier 3. Function,> 二、场景模拟 1.面向对象设计 2. 策略接口实现&#xff08;以 Function 接口作为策略&#xff09; 三、对比 前言 在 Java 8 中引入了Stream API 新特性&#xff0c;这使得函数式编程风格进…

Chatgpt掘金之旅—有爱AI商业实战篇|品牌故事业务|(十六)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在品牌故事业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随…

OpenCV从入门到精通实战(七)——探索图像处理:自定义滤波与OpenCV卷积核

本文主要介绍如何使用Python和OpenCV库通过卷积操作来应用不同的图像滤波效果。主要分为几个步骤&#xff1a;图像的读取与处理、自定义卷积函数的实现、不同卷积核的应用&#xff0c;以及结果的展示。 卷积 在图像处理中&#xff0c;卷积是一种重要的操作&#xff0c;它通过…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(2)——架构分析 - 核心思想环境搭建技术选型

4.架构分析 4.1.核心思想 超越一阶提示&#xff0c;通过增加静态知识库和信息检索方案或简单的总结方案来扩展语言模型。 将这些想法扩展到构建一个代理架构&#xff0c;该架构处理检索&#xff0c;其中过去的经验在每个时步动态更新&#xff0c;并混合与npc当前上下文和计划…

c++ qt6.5 打包sqlite组件无法使用,尽然 也需要dll支持!这和开发php 有什么区别!

运行 程序会默认使用当前所在文件夹中的 dll 文件&#xff0c;若文件不存在&#xff0c;会使用系统环境变量路径中的文件&#xff1b;又或者是需要在程序源代码中明确指定使用的 dll 的路径。由于我安装 Qt 时将相关 dll 文件路径都添加到了系统环境变量中&#xff0c;所以即使…

.net反射(Reflection)

文章目录 一.概念&#xff1a;二.反射的作用&#xff1a;三.代码案例&#xff1a;四.运行结果&#xff1a; 一.概念&#xff1a; .NET 反射&#xff08;Reflection&#xff09;是指在运行时动态地检查、访问和修改程序集中的类型、成员和对象的能力。通过反射&#xff0c;你可…

C语言通过键盘输入给结构体内嵌的结构体赋值——指针法

1 需求 以录入学生信息&#xff08;姓名、学号、性别、出生日期&#xff09;为例&#xff0c;首先通过键盘输入需要录入的学生的数量&#xff0c;再依次输入这些学生的信息&#xff0c;输入完成后输出所有信息。 2 代码 #include<stdio.h> #include<stdlib.h>//…

React - 基础学习

React基础 React更新视图的流程 是 一层一层查找 到对应的视图做更新 如何生成React工程 // 生成简单的react npx create-react-app react-app// 生成typescript的react npx create-react-app react-app-ts --template typescriptReact的基本能力 父子组件 // 父组…

openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置

文章目录 openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置265.1安装openEuler操作系统265.2 修改操作系统内核PAGESIZE为64KB。265.3 关闭CPU中断的服务irqbalance openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置 本…

OpenCV基本图像处理操作(八)——光流估计

光流估计 光流估计是一种用于检测图像序列中像素点运动的技术。它基于这样的假设&#xff1a;在连续的视频帧之间&#xff0c;一个物体的移动会导致像素强度的连续性变化。通过分析这些变化&#xff0c;光流方法可以估计每个像素点的运动速度和方向。 光流估计通常用于多种应…

idea 将项目上传到gitee远程仓库具体操作

目录标题 一、新建仓库二、初始化项目三、addcommit四、配置远程仓库五、拉取远程仓库内容六、push代码到仓库 一、新建仓库 新建仓库教程 注意&#xff1a;远程仓库的初始文件不要与本地存在名字一样的文件&#xff0c;不然拉取会因为冲突而失败。可以把远程一样的初始文件删…

Labview2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 LabVIEW是一种由美国国家仪器&#xff08;NI&#xff09;公司开发的程序开发环境&#xff0c;它显著区别于其他计算机语言&#xff0c;如C和BASIC。传统的计算机语言是基于文本的语言来产生代码&#xff0c;而LabVIEW则采用图形化…

HEF4046BT功能参数及避免使用的场景、应用前置放大器

制造商:NXP 产品种类:锁相环 PLL 类型:PLL 电路数量:1 电源电压 最大:15 V 电源电压 最小:3 V 最大工作温度: 85 C 安装风格:SMD/SMT 封装:SO-16 封装:Bulk 商标:NXP Semiconductors 最小工作温度:- 40 C 工作电源电压:3.3 V, 5 V, 9 V, 12 V HEF4046BT 是一种 CMO…