详细讲解FuzzBench如何添加新的Fuzzer

news/2024/5/18 19:35:19/文章来源:https://blog.csdn.net/weixin_42877778/article/details/126934600

最近几天一直在弄FuzzBench添加新的fuzzer,在添加过程中遇到各种问题,在此做详细记录。

拉取fuzzbench到本地

这一部分可以直接参考此链接FuzzBench预备条件

1.拉取代码到本地

git clone https://github.com/google/fuzzbench
cd fuzzbench
git submodule update --init

2.安装fuzzbench

sudo apt-get install build-essential

3.安装fuzzbench需要使用的依赖

sudo apt-get install python3.8-dev python3.8-venv
make install-dependencies
#接下里是进入虚拟环境,这一步可以不执行,执行后也可以执行deactivate退出虚拟环境
source .venv/bin/activate

4.安装本地依赖

如果想要在本地执行fuzzbench需要执行一下语句进行rsync的安装
sudo apt-get install rsync

添加新的Fuzzer

1.创建目录

首先到fuzzbench的fuzzer目录下创建需要添加的fuzzer对应的文件名,该文件夹用于存放接下来需要创建的三个文件

export FUZZER_NAME= < your_fuzzer_name>
cd fuzzers
mkdir $FUZZER_NAME

例如本文新增的fuzzer名为agilefuzz,注意这里fuzzer_name名称只能是小写字母,否则会报错。
在这里插入图片描述

2.编写fuzzer文件

接下来编写的文件都保存在(1)中创建的目录下

cd $FUZZER_NAME

builder.Dockerfile编写

此处使用vim对该文件进行编写,直接参考它给出的例子afl。

vim builder.Dockerfile

写入代码如下:

# Copyright 2020 Google LLC
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.ARG parent_image
FROM $parent_image# Download and compile AFL v2.57b.
# Set AFL_NO_X86 to skip flaky tests.
#注意这里的git clone的地址要改成你需要添加的fuzzer的拉取地址
#拉取到afl目录下是为了方便在afl编写的其他代码中进行兼容,看了一下其他模糊器的builder.Dockerfile也是拉取到afl目录下
RUN git clone https://github.com/12qwetyd/agile.git /afl  && \cd /afl && \AFL_NO_X86=1 make# Use afl_driver.cpp from LLVM as our fuzzing library.
#wget部分用于拉取编译fuzzer的函数,此处可以直接使用AFL的驱动程序
RUN apt-get update && \apt-get install wget -y && \wget https://raw.githubusercontent.com/llvm/llvm-project/5feb80e748924606531ba28c97fe65145c65372e/compiler-rt/lib/fuzzer/afl/afl_driver.cpp -O /afl/afl_driver.cpp && \clang -Wno-pointer-sign -c /afl/llvm_mode/afl-llvm-rt.o.c -I/afl && \clang++ -stdlib=libc++ -std=c++11 -O2 -c /afl/afl_driver.cpp && \ar r /libAFL.a *.o
run.Dockerfile

这里对于大部分模糊测试只需要一句from语句用于拉取镜像即可,但如果fuzzer需要一些依赖也可以直接使用apt-get语句下载,在本次实验中并不需要其他依赖,因此代码如下:
首先创建run.Dockerfile

vim run.Dockerfile

在编译器中输入如下代码:

FROM gcr.io/fuzzbench/base-image    

在这里插入图片描述

fuzzer.py

vim fuzzer.py

直接复制AFL的fuzzer.py文件即可,由于在上面runner.Dockerfile中直接将fuzzer拉取并命名为afl,因此对该文件不需要做修改,但如果添加的fuzzer中存在一些新的执行参数或者删除了一些参数,则需要对fuzzer.py中的参数进行修改。

fuzzer.py代码
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Integration code for AFL fuzzer."""import json
import os
import shutil
import subprocessfrom fuzzers import utilsdef prepare_build_environment():"""Set environment variables used to build targets for AFL-basedfuzzers."""cflags = ['-fsanitize-coverage=trace-pc-guard']utils.append_flags('CFLAGS', cflags)utils.append_flags('CXXFLAGS', cflags)os.environ['CC'] = 'clang'os.environ['CXX'] = 'clang++'os.environ['FUZZER_LIB'] = '/libAFL.a'def build():"""Build benchmark."""prepare_build_environment()utils.build_benchmark()print('[post_build] Copying afl-fuzz to $OUT directory')# Copy out the afl-fuzz binary as a build artifact.shutil.copy('/afl/afl-fuzz', os.environ['OUT'])def get_stats(output_corpus, fuzzer_log):  # pylint: disable=unused-argument"""Gets fuzzer stats for AFL."""# Get a dictionary containing the stats AFL reports.stats_file = os.path.join(output_corpus, 'fuzzer_stats')with open(stats_file) as file_handle:stats_file_lines = file_handle.read().splitlines()stats_file_dict = {}for stats_line in stats_file_lines:key, value = stats_line.split(': ')stats_file_dict[key.strip()] = value.strip()# Report to FuzzBench the stats it accepts.stats = {'execs_per_sec': float(stats_file_dict['execs_per_sec'])}return json.dumps(stats)def prepare_fuzz_environment(input_corpus):"""Prepare to fuzz with AFL or another AFL-based fuzzer."""# Tell AFL to not use its terminal UI so we get usable logs.os.environ['AFL_NO_UI'] = '1'# Skip AFL's CPU frequency check (fails on Docker).os.environ['AFL_SKIP_CPUFREQ'] = '1'# No need to bind affinity to one core, Docker enforces 1 core usage.os.environ['AFL_NO_AFFINITY'] = '1'# AFL will abort on startup if the core pattern sends notifications to# external programs. We don't care about this.os.environ['AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES'] = '1'# Don't exit when crashes are found. This can happen when corpus from# OSS-Fuzz is used.os.environ['AFL_SKIP_CRASHES'] = '1'# Shuffle the queueos.environ['AFL_SHUFFLE_QUEUE'] = '1'# AFL needs at least one non-empty seed to start.utils.create_seed_file_for_empty_corpus(input_corpus)def check_skip_det_compatible(additional_flags):""" Checks if additional flags are compatible with '-d' option"""# AFL refuses to take in '-d' with '-M' or '-S' options for parallel mode.# (cf. https://github.com/google/AFL/blob/8da80951/afl-fuzz.c#L7477)if '-M' in additional_flags or '-S' in additional_flags:return Falsereturn True#这部分是编译afl的代码,如果添加的fuzzer修改了一些参数在此处进行修改
def run_afl_fuzz(input_corpus,output_corpus,target_binary,additional_flags=None,hide_output=False):"""Run afl-fuzz."""# Spawn the afl fuzzing process.print('[run_afl_fuzz] Running target with afl-fuzz')command = ['./afl-fuzz','-i',input_corpus,'-o',output_corpus,# Use no memory limit as ASAN doesn't play nicely with one.'-m','none','-t','1000+',  # Use same default 1 sec timeout, but add '+' to skip hangs.]# Use '-d' to skip deterministic mode, as long as it it compatible with# additional flags.if not additional_flags or check_skip_det_compatible(additional_flags):command.append('-d')if additional_flags:command.extend(additional_flags)dictionary_path = utils.get_dictionary_path(target_binary)if dictionary_path:command.extend(['-x', dictionary_path])command += ['--',target_binary,# Pass INT_MAX to afl the maximize the number of persistent loops it# performs.'2147483647']print('[run_afl_fuzz] Running command: ' + ' '.join(command))output_stream = subprocess.DEVNULL if hide_output else Nonesubprocess.check_call(command, stdout=output_stream, stderr=output_stream)def fuzz(input_corpus, output_corpus, target_binary):"""Run afl-fuzz on target."""prepare_fuzz_environment(input_corpus)run_afl_fuzz(input_corpus, output_corpus, target_binary)

执行文件

在fuzzbench目录下执行如下语句,其中FUZZER_NAME在前文中已经给出了定义,为新添加的fuzzer目录名称:

export BENCHMARK_NAME=libpng-1.2.56
make build-$FUZZER_NAME-$BENCHMARK_NAME
#debug a build
make debug-builder-$FUZZER_NAME-$BENCHMARK_NAME

接下来会生成一个docker并自动进入到该docker中,记录生成的docker的名称,然后执行exit退出该docker,依然回到fuzzbench目录下执行剩下的语句:

下面这两句执行任意一句即可,后一句执行一个更快的测试
make run-$FUZZER_NAME-$BENCHMARK_NAME
make test-run-$FUZZER_NAME-$BENCHMARK_NAME

上面的语句执行速度比较慢,我这边执行的第一句,等了一天多还没执行完,最后一句建立fuzzer的所有基准也是在服务器的fuzzbench目录下执行:

make build-$FUZZER_NAME-all

在这里插入图片描述
以上为添加fuzzer的全过程,结束。

遇见问题

如果添加的fuzzer删除或新增了一些指令,在复制完fuzzer.py后应该上上文中文提到的部分修改参数引用,例如本文添加的fuzzer删除了-d参数,由于没有及时修改fuzzer.py文件,在执行过程中报错如下:
在这里插入图片描述
这是因为在执行afl-fuzz时新增的fuzzer没有-d参数,直接在fuzzer.py文件中删除这一参数即可:
在这里插入图片描述

需要提交

fuzzbench更新了代码后需要执行git commit提交命令,否则会报失败,这里可以直接修改它的检查语句:
在fuzzbench的experiment目录下修改run_experiment.py文件
在这里插入图片描述

在vim非编译模式下输入一下命令查找到git提交检查部分,删除该部分代码即可:
在这里插入图片描述

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

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

相关文章

我上线了一个炫酷的项目实战教程网站,主流技术一网打尽~

之前经常遇到小伙伴问我&#xff0c;之前写的某篇技术文章在哪里。又或者是拿着很早以前的部署文档问我&#xff0c;按这个文章怎么部署不起来。其实他们如果上过我的实战教程网站的话&#xff0c;估计就不会有这些问题了&#xff0c;我的原创文章基本都会同步上去。今天和大家…

孙宇晨:区块链行业势必迎来光明的未来

近日&#xff0c;波场TRON创始人孙宇晨受邀在米尔肯研究院&#xff08;Milken Institute&#xff09;官方网站上发表了题为《区块链行业势必迎来光明的未来》的署名文章。孙宇晨在文章中表示&#xff0c;作为一种新兴的颠覆性技术&#xff0c;加密行业的发展之路并非一帆风顺。…

Fat Tree 分析

本文是源于USTC Advance Computer Network 的课程内容做的总结 论文来源&#xff1a;A scalable, commodity data center network architecture 本文将分析Fat Tree的 拓扑结构、编址方案和路由算法三个方面。 拓扑结构 该文章中从传统数据中心通信的问题提出了FatTree的拓扑…

机器学习——聚类(K-Means)

机器学习——聚类(K-Means)那是什么 无监督学习——聚类聚类是基于相似对象将一组对象分组为类/类别的过程。聚类是一部分 无监督学习 .这种方法通常用于确定业务决策,特别是在基于来自集群的数据预测来预测正确的业务策略时。聚类还可用于异常检测、客户细分和改善客户服务…

食品行业中的 AI 和 ML 用例

食品行业中的 AI 和 ML 用例人工智能和机器学习为每个行业的进步铺平了道路。这些技术的使用帮助他们优化和自动化流程,降低成本和时间要求,减少人为错误的可能性。让我们了解采用基于 AI 和 ML 的技术如何使食品行业受益。Photo by 阿诺塞诺纳 on 不飞溅 由农民和各种企业…

持续集成持续交付

目录 一、Git工具 二、git安装 三、git使用 三、gitlab代码仓库 四、jenkins持续集成 五、Jenkins自动构建docker镜像&#xff0c;并上传至harbor仓库 六、Jenkins连接docker构建主机 七、jenkins结合ansible 一、Git工具 git简介 1).Git特点&#xff1a; • 速度 • 简…

PHP在线教育平台源码 网课小程序源码

在线教育知识付费平台 网课小程序源码 教育直播网校小程序源码 开发环境&#xff1a;PHP MYSQL 源码包含&#xff1a;PC小程序公众号 H5 需要绑定对接公众号 本套源码程序适合做视频图文结合的知识付费平台。带分销功能&#xff0c;多种分销方式自由设置&#xff08;可快速积…

通关GO语言22 网络编程:Go 语言如何通过 RPC 实现跨平台服务?

在上一讲中&#xff0c;我为你讲解了 RESTful API 的规范以及实现&#xff0c;并且留了两个作业&#xff0c;它们分别是删除和修改用户&#xff0c;现在我为你讲解这两个作业。 删除一个用户比较简单&#xff0c;它的 API 格式和获取一个用户一样&#xff0c;但是 HTTP 方法换…

二、JumpServer堡垒机管理员手册

JumpServer是一款非常简单好用的开源堡垒机&#xff0c;本文根据实际生产案例编辑的管理员手册&#xff0c;列出了JumpServer常用功能。JumpServer可以很好的保护公司内部服务器&#xff0c;并满足等保2.0安全需求。 目录 一、堡垒机用户创建 二、创建特权用户 三、创建普通…

金字塔思维

背景 1、大脑偏爱有规律的信息 2、把问题想全&#xff0c;同时可以深入 1 方法&#xff1a; 1.1 识别纵向信息逻辑&#xff1a; 被动接受了大量杂乱信息&#xff0c;通过金字塔思维识别信息的逻辑关系 1.2 横向分类&#xff1a;信息归类整理 穷尽所有要素、对要素进行分类…

docker、docker-compose部署oracle,plsql连接远程oracle

一、docker部署oracle 1. 下载镜像并启动容器 # 拉取阿里oracle_11g的镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g # 创建容器并启动 docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 2.…

我们该如何运营Facebook账号呢?

社交媒体带来的流量转化是巨大的&#xff0c;这也就是为什么跨境电商卖家会转战到社媒的原因了。我们经常会发现一个帖子突然就火了&#xff0c;那么这个帖子的相关产品都得到了极大的推广&#xff0c;其曝光率也是难以想象的&#xff0c;那么由此带来的转化也常常令人欣喜若狂…

间主任的烦恼① | 基于BOM的配套检查,保障生产不断线

王部长&#xff1a;&#xff08;桌上电话铃声响起&#xff0c;王部长接完电话后说&#xff0c;&#xff09;“小智&#xff0c;我们装配车间的张主任&#xff0c;这打电话来&#xff0c;又在说配套缺件问题。这周就要启动装配了&#xff0c;现在领料发现还有20种零件没有库存。…

CentOS系统磁盘的分区格式化和挂载操作

一、磁盘分区和格式化 lsblk命令查看挂载硬盘的情况&#xff0c;一下情况表示为分卷&#xff0c;需要先分卷&#xff0c;再格式化&#xff0c;然后再进行挂载。 分卷命令&#xff1a;fdisk /dev/vdb 输入n 输入p和1&#xff0c;直接回车 最后输入w保存。 格式化磁盘&#x…

USB摄像头驱动分析

1.构造一个usb_driver 2.设置 probe&#xff1a;2.1.分配video_device:video_device_alloc2.2 设置.fops.ioctl_ops (里面需要设置11项)如果要用内核提供 的缓冲区操作函数&#xff0c;还需要构造一个videobuf_queue_ops2.3.注册: video_register_device id_table:表示支持哪些…

基于单片机的指纹密码锁系统

目录 第1章 概述............................................................................................................ 6 1.1 指纹识别技术的发展................................................................................... 6 1.2 指纹识别原理......…

mirai登陆失败反复验证码或提示登录存在安全风险的解决方法

对于没有服务器的同学&#xff0c;可以进入官网领取免费1个月的轻量云服务器&#xff1a;云产品免费试用&#xff1b;需要选购的进&#xff1a;轻量应用服务器专场&#xff1b;不清楚怎么操作的可以看教程&#xff1a;腾讯云产品免费试用教程 转载请注明出处&#xff1a;小锋学…

Word控件Spire.Doc 【页面设置】教程(4) 如何在文档中插入分节符

在 Microsoft Word 中&#xff0c;您可以通过在所需位置插入分节符轻松地将文档拆分为多个部分&#xff0c;从而允许您对这些部分应用不同的格式或布局选项。如果您需要执行以下任何任务&#xff0c;Microsoft Word 中的分节符可能是天赐之物&#xff1a; 为文档的每个部分使用…

MySQL高级:(二)存储引擎

笔记来源&#xff1a;MySQL数据库教程天花板&#xff0c;mysql安装到mysql高级&#xff0c;强&#xff01;硬&#xff01; 文章目录2.1 存储引擎基本概念2.2 InnoDB&#xff1a;具备外键支持功能的事务存储引擎2.3 MyISAM&#xff1a;主要的非事务处理存储引擎2.3 Archive&…

Cannot get a STRING value from a NUMERIC cell poi异常解决;easy-poi;jeecg-boot-poi

Cannot get a STRING value from a NUMERIC cell poi异常解决;easy-poi;jeecg-boot-poi 出现原因: 在集成jeecg-boot框架开发之后 使用jeecg-boot-auto-poi (封装的easy-poi)导入数据时 因为excel中有函数表达式出现的错误 导入的代码 而在源码中CellValueServer这一个类,在…