ProFuzzBench入门教学——使用(Ubuntu22.04)

  • ProFuzzBench是网络协议状态模糊测试的基准测试。它包括一套用于流行协议(例如 TLS、SSH、SMTP、FTP、SIP)的代表性开源网络服务器,以及用于自动执行实验的工具。
  • 详细参考:阅读笔记——《ProFuzzBench: A Benchmark for Stateful Protocol Fuzzing》-CSDN博客
  • 环境:Ubuntu22.04(WSL)

1、设置环境变量

  • 克隆项目,设置环境变量。
    • git clone https://github.com/profuzzbench/profuzzbench.git
      cd profuzzbench
      nano ~/.bashrc
  • 添加下面内容。 
    • # profuzzbench
      export PFBENCH=/home/zzs/GitProject/profuzzbench
      export PATH=$PATH:$PFBENCH/scripts/execution:$PFBENCH/scripts/analysis
  • 重新加载配置文件以使更改生效。
    • source ~/.bashrc

2、构建docker镜像

  • 安装docker,参考:Docker——简介、安装(Ubuntu22.04)-CSDN博客
  • 构建docker镜像。
    • cd $PFBENCH
      cd subjects/FTP/LightFTP
      sudo docker build . -t lightftp
      # docker build .:在当前目录(LightFTP)下寻找 Dockerfile 并构建 Docker 镜像
      # -t lightftp:将创建的 Docker 镜像标记为 lightftp
    • 【注】这里创建了一个名为 lightFTP 的 Docker 镜像,该镜像包含了 LightFTP 及其所需的所有依赖项,使其可以在隔离的 Docker 容器中运行。这对于模糊测试和代码覆盖率收集特别有用,因为它提供了一个一致的、可重复的测试环境。
    • 构建时间较长,耐心等待。
    • 【注】可能遇到网络不好,多尝试。
  • 查看构建的镜像。
    • docker images

3、运行模糊测试

  • 运行‘profuzzbench_exec_common.sh’脚本以启动实验。该脚本接受以下 8 个参数:
    • 第一个参数 (DOCIMAGE):Docker镜像的名称。
    • 第二个参数 (RUNS):运行次数,每次运行都会启动一个独立的Docker容器。
    • 第三个参数 (SAVETO):存储结果的文件夹路径。
    • 第四个参数 (FUZZER):模糊测试工具的名称(例如,aflnet)——该名称必须与Docker容器内模糊测试工具文件夹的名称匹配(例如,/home/ubuntu/aflnet)。 
    • 第五个参数 (OUTDIR):在Docker容器内创建的输出文件夹的名称。
    • 第六个参数 (OPTIONS):除目标特定的run.sh脚本中写入的标准选项外,所有模糊测试所需的选项。
    • 第七个参数 (TIMEOUT):模糊测试的时间(以秒为单位)。
    • 第八个参数 (SKIPCOUNT):用于计算随时间变化的覆盖率。例如,SKIPCOUNT=5表示我们在每5个测试用例后运行一次gcovr,因为gcovr需要时间,我们不希望在每个测试用例后都运行它。
  • 以下命令运行一个AFLNet实例,对LightFTP进行60分钟模糊测试。
    • cd $PFBENCH
      mkdir results-lightftp
      profuzzbench_exec_common.sh lightftp 1 results-lightftp aflnet out-lightftp-aflnet "-P FTP -D 10000 -q 3 -s 3 -E -K -R" 3600 5

4、收集结果

  • 所有结果(在 tar 文件中)都应存储在上个步骤(results-lightftp)创建的文件夹中。
  • 具体来说,这些tar文件是所有模糊测试实例生成的输出文件夹的压缩版本。如果模糊测试器是基于AFL的(例如,AFLNet,AFLnwe),每个文件夹应包含诸如 crashes、hangs、queue 等子文件夹。
  • 使用profuzzbench_generate_csv.sh脚本可以收集代码覆盖率随时间变化的结果。该脚本需要以下5个参数:
    • 第一个参数 (PROG):目标程序的名称(例如,lightftp)。
    • 第二个参数 (RUNS):运行次数。
    • 第三个参数 (FUZZER):模糊测试器的名称(例如,aflnet)。
    • 第四个参数 (COVFILE):用于保存结果的 CSV 格式的输出文件。
    • 第五个参数 (APPEND):追加模式;对第一个模糊测试器设置为0,对后续的模糊测试器设置为1。
  • 以下命令收集AFLNet生成的代码覆盖率结果,并将其保存到results.csv。
    • cd $PFBENCH/results-lightftp
      profuzzbench_generate_csv.sh lightftp 1 aflnet results.csv 0
  • results.csv文件如下。该文件有六列,分别显示:
    • 时间(time)
    • 目标程序(subject)
    • 模糊测试器名称(fuzzer)
    • 运行索引(run)
    • 覆盖类型(cov_type)
    • 覆盖率(cov)
  • 文件包含了随时间变化的行覆盖率(l_per、l_abs)分支覆盖率(b_per、b_abs)信息。每种覆盖类型都有两个值,一个是百分比形式(_per),另一个是绝对数值(_abs)。
    • 【注】这里时间为空,暂不知道什么原因。

5、分析结果

  • results.csv中收集的结果可用于绘图。例如,使用示例python脚本绘制代码随时间变化的覆盖率。使用以下命令打印结果并将其保存到文件中。
    • cd $PFBENCH/results-lightftpprofuzzbench_plot.py -i results.csv -p lightftp -r 4 -c 60 -s 1 -o cov_over_time.png
    • 报错:IndexError: index 0 is out of bounds for axis 0 with size 0。
      • 原因是因为文件中time为空,并且只有一个模糊测试器。
  • 改使用aflnwe。删除原先的results-lightftp。
    • cd $PFBENCHrm -rf resluts-lightftpmkdir results-lightftp
      profuzzbench_exec_common.sh lightftp 1 results-lightftp aflnwe out-lightftp-aflnwe "-D 10000 -K" 3600 5cd $PFBENCH/results-lightftp
      profuzzbench_generate_csv.sh lightftp 1 aflnwe results.csv 0
      cat results.csv
  • 修改profuzzbench_plot.py。
    • #!/usr/bin/env pythonimport argparse
      from pandas import read_csv
      from pandas import DataFrame
      from pandas import Grouper
      from matplotlib import pyplot as plt
      import pandas as pddef main(csv_file, put, runs, cut_off, step, out_file):# Read the resultsdf = read_csv(csv_file)# Calculate the mean of code coveragemean_list = []for subject in [put]:fuzzer = 'aflnwe'  # Only use aflnwefor cov_type in ['b_abs', 'b_per', 'l_abs', 'l_per']:# Get subject & fuzzer & cov_type-specific dataframedf1 = df[(df['subject'] == subject) & (df['fuzzer'] == fuzzer) & (df['cov_type'] == cov_type)]mean_list.append((subject, fuzzer, cov_type, 0, 0.0))for time in range(1, cut_off + 1, step):cov_total = 0run_count = 0for run in range(1, runs + 1, 1):# Get run-specific data framedf2 = df1[df1['run'] == run]if df2.empty:continue# Get the starting time for this runstart = df2.iloc[0, 0]# Get all rows given a cutoff timedf3 = df2[df2['time'] <= start + time * 60]if df3.empty:continue# Update total coverage and #runscov_total += df3.tail(1).iloc[0, 5]run_count += 1# Add a new rowif run_count > 0:mean_list.append((subject, fuzzer, cov_type, time, cov_total / run_count))# Convert the list to a dataframemean_df = pd.DataFrame(mean_list, columns=['subject', 'fuzzer', 'cov_type', 'time', 'cov'])fig, axes = plt.subplots(2, 2, figsize=(20, 10))fig.suptitle("Code coverage analysis")for key, grp in mean_df.groupby(['fuzzer', 'cov_type']):if key[1] == 'b_abs':axes[0, 0].plot(grp['time'], grp['cov'])axes[0, 0].set_xlabel('Time (in min)')axes[0, 0].set_ylabel('#edges')if key[1] == 'b_per':axes[1, 0].plot(grp['time'], grp['cov'])axes[1, 0].set_ylim([0, 100])axes[1, 0].set_xlabel('Time (in min)')axes[1, 0].set_ylabel('Edge coverage (%)')if key[1] == 'l_abs':axes[0, 1].plot(grp['time'], grp['cov'])axes[0, 1].set_xlabel('Time (in min)')axes[0, 1].set_ylabel('#lines')if key[1] == 'l_per':axes[1, 1].plot(grp['time'], grp['cov'])axes[1, 1].set_ylim([0, 100])axes[1, 1].set_xlabel('Time (in min)')axes[1, 1].set_ylabel('Line coverage (%)')for i, ax in enumerate(fig.axes):ax.legend(('AFLNwe',), loc='upper left')  # Only AFLNweax.grid()# Save to fileplt.savefig(out_file)# Parse the input arguments
      if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('-i', '--csv_file', type=str, required=True, help="Full path to results.csv")parser.add_argument('-p', '--put', type=str, required=True, help="Name of the subject program")parser.add_argument('-r', '--runs', type=int, required=True, help="Number of runs in the experiment")parser.add_argument('-c', '--cut_off', type=int, required=True, help="Cut-off time in minutes")parser.add_argument('-s', '--step', type=int, required=True, help="Time step in minutes")parser.add_argument('-o', '--out_file', type=str, required=True, help="Output file")args = parser.parse_args()main(args.csv_file, args.put, args.runs, args.cut_off, args.step, args.out_file)
  • 重新执行:
    • cd $PFBENCH/results-lightftpprofuzzbench_plot.py -i results.csv -p lightftp -r 4 -c 60 -s 1 -o cov_over_time.png

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

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

相关文章

一句话彻底搞懂Java的编译和执行过程

编译和运行可以在不同的计算机上实现。 编译阶段&#xff1a;由Javac编译器将 .Java 的源文件编译为 .class 的字节码文件&#xff1b; 运行阶段&#xff1a; jvm中Java编译器运行 .class 的字节码文件&#xff0c;运行过程中&#xff0c;类加载器从硬盘中找到该字节码文件并…

WPF引入多个控件库使用

目的 设计开发时有的控件库的一部分符合我们想要的UI样式&#xff0c;另一部分来自另一个控件库&#xff0c;想把两种库的样式做一个整合在同一个控件资源上。单纯通过引用的方式会导致原有样式被覆盖。这里通过设置全局样式的方式来实现。 1.安装控件库nuget包&#xff1a;H…

Webpack: 模块编译打包及运行时Runtime逻辑

概述 回顾最近几节内容&#xff0c;Webpack 运行过程中首先会根据 Module 之间的引用关系构建 ModuleGraph 对象&#xff1b;接下来按照若干内置规则将 Module 组织进不同 Chunk 对象中&#xff0c;形成 ChunkGraph 关系图。 接着&#xff0c;构建流程将来到最后一个重要步骤…

Argo CD入门、实战指南

1. Argo CD概述 1.1 什么是 Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 1.2 为什么选择 Argo CD 应用程序定义、配置和环境应具有声明性并受版本控制。应用程序部署和生命周期管理应自动化、可审计且易于理解。 2. Argo CD基础知识 在有效使用 Ar…

中职网络安全B模块渗透测试server2003

通过本地PC中渗透测试平台Kali对服务器场景Windows进⾏系统服务及版本扫描渗透测 试&#xff0c;并将该操作显示结果中Telnet服务对应的端⼝号作为FLAG提交 使用nmap扫描发现目标靶机开放端口232疑似telnet直接进行连接测试成功 Flag&#xff1a;232 通过本地PC中渗透测试平台…

使用 Hugging Face 的 Transformers 库加载预训练模型遇到的问题

题意&#xff1a; Size mismatch for embed_out.weight: copying a param with shape torch.Size([0]) from checkpoint - Huggingface PyTorch 这个错误信息 "Size mismatch for embed_out.weight: copying a param with shape torch.Size([0]) from checkpoint - Hugg…

Elasticsearch基础(四):Elasticsearch语法与案例介绍

文章目录 Elasticsearch语法与案例介绍 一、Restful API 二、查询语法 1、ES分词器 2、ES查询 2.1、match 2.2、match_phrase 2.3、multi_match 2.4、term 2.5、terms 2.6、fuzzy 2.7、range 2.8、bool Elasticsearch语法与案例介绍 一、Restful API Elastics…

服务攻防——中间件Jboss

文章目录 一、Jboss简介二、Jboss渗透2.1 JBoss 5.x/6.x 反序列化漏洞&#xff08;CVE-2017-12149&#xff09;2.2 JBoss JMXInvokerServlet 反序列化漏洞&#xff08;CVE-2015-7501&#xff09;2.3 JBossMQ JMS 反序列化漏洞&#xff08;CVE-2017-7504&#xff09;2.4 Adminis…

Java如何自定义注解及在SpringBoot中的应用

注解 注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说…

leetcode:LCR 018. 验证回文串(python3解法)

难度&#xff1a;简单 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 本题中&#xff0c;将空字符串定义为有效的 回文串 。 示例 1: 输入: s "A man, a plan, a canal: Panama" 输出: t…

【C++】开源:坐标转换和大地测量GeographicLib库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍坐标转换和大地测量GeographicLib库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关…

Effective C++笔记之二十一:One Definition Rule(ODR)

ODR细节有点复杂&#xff0c;跨越各种情况。基本内容如下&#xff1a; ●普通&#xff08;非模板&#xff09;的noninline函数和成员函数、noninline全局变量、静态数据成员在整个程序中都应当只定义一次。 ●class类型&#xff08;包括structs和unions&#xff09;、模板&…

2018-2022 年份微博签到数据集

前阵子接到一个实验室老师的需求&#xff0c;采集五年前&#xff08;2024-52019&#xff09;过年前后的北京微博签到数据。 前两年采集的深圳签到数据是 2022 年是当年的尚可&#xff0c;这次虽然时间跨度只有两个月&#xff0c;但是由于时间太过久远&#xff0c;但是颇费了一…

Spring学习04-[Spring容器核心技术AOP学习]

AOP学习 AOP介绍使用对业务方法添加计算时间的增强 EnableAspectJAutoProxyAOP的术语通知前置通知Before后置通知After返回通知AfterReturning异常通知AfterThrowing总结-通知执行顺序 切点表达式的提取-使用Pointcut进行抽取切点表达式的详细用法execution和annotation组合 Sp…

STM32快速搭建项目框架

注&#xff1a;编写本博客的原因&#xff0c;学习期间基于复习之前知识点的需要&#xff0c;故撰写本教程&#xff0c;即是复习前面的知识点也是作为博客的补充 1.0 文件夹的创建 创建一个STM32项目为模版工程&#xff0c;问价夹下分别包含4个子文件夹&#xff0c;一个是Librar…

嘉立创EDA学习笔记

嘉立创EDA学习笔记 PCB引线一、设计规则间距安全间距其他间距 物理导线网络长度差分对过孔尺寸 平面铺铜 PCB布线 作为一个嵌入式开发潜力工程师&#xff0c;咱们必须得学会如何绘制开发板以满足顾客各种功能的需求&#xff0c;因此小编去学习了一下嘉立创&#xff0c;写这篇文…

VSCode用ssh连接ubuntu虚拟机实现远程访问文件夹

1. ubuntu安装ssh服务 1.1 安装 sudo apt-get install ssh sudo apt-get install openssh-server1.2 启动ssh服务 sudo service ssh start sudo service ssh status # 查看状态 ## 或者用下面方式重启ssh服务 ## /etc/init.d/ssh restart1.3 ssh服务加入开机启动 sudo syst…

HTML语言常见标签

语法 HEAD部分的HTML标签 1 标题标签 <title>标题内容</title> 2 段落标签 <meta charset"utf-8"/> BODY部分的HTML标签 1标题标签&#xff08;独占一行&#xff09;<h1>标题内容</h1> 2段落标签&#xff08;独占一行&#xff09;…

TK 检查输入框是否为空

在Python的Tkinter库中&#xff0c;你可以使用事件绑定或者在按钮点击事件中检查输入框的值是否为空来实现这个功能。以下是一个简单的例子&#xff1a; import tkinter as tk from tkinter import messageboxdef check_input():entry input_box.get()if not entry:messagebo…

TLP152 光耦合器:工程师的可靠选择

东芝的 TLP152 光耦合器是一款稳健且多功能的组件&#xff0c;能够满足各种高速和高可靠性应用中的工程师需求。本文将深入探讨 TLP152 的技术特性、优点和应用&#xff0c;突出其在市场中的独特性。 主要特点和规格 TLP152 光耦合器集成了一颗铝镓砷&#xff08;GaAlAs&…