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

news2024/9/30 23:28:45
  • 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-lightftp
      
      profuzzbench_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 $PFBENCH
      
      rm -rf resluts-lightftp
      
      mkdir results-lightftp
      profuzzbench_exec_common.sh lightftp 1 results-lightftp aflnwe out-lightftp-aflnwe "-D 10000 -K" 3600 5
      
      cd $PFBENCH/results-lightftp
      profuzzbench_generate_csv.sh lightftp 1 aflnwe results.csv 0
      cat results.csv
  • 修改profuzzbench_plot.py。
    • #!/usr/bin/env python
      
      import argparse
      from pandas import read_csv
      from pandas import DataFrame
      from pandas import Grouper
      from matplotlib import pyplot as plt
      import pandas as pd
      
      
      def main(csv_file, put, runs, cut_off, step, out_file):
          # Read the results
          df = read_csv(csv_file)
      
          # Calculate the mean of code coverage
          mean_list = []
      
          for subject in [put]:
              fuzzer = 'aflnwe'  # Only use aflnwe
              for cov_type in ['b_abs', 'b_per', 'l_abs', 'l_per']:
                  # Get subject & fuzzer & cov_type-specific dataframe
                  df1 = 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 = 0
                      run_count = 0
      
                      for run in range(1, runs + 1, 1):
                          # Get run-specific data frame
                          df2 = df1[df1['run'] == run]
      
                          if df2.empty:
                              continue
      
                          # Get the starting time for this run
                          start = df2.iloc[0, 0]
      
                          # Get all rows given a cutoff time
                          df3 = df2[df2['time'] <= start + time * 60]
      
                          if df3.empty:
                              continue
      
                          # Update total coverage and #runs
                          cov_total += df3.tail(1).iloc[0, 5]
                          run_count += 1
      
                      # Add a new row
                      if run_count > 0:
                          mean_list.append((subject, fuzzer, cov_type, time, cov_total / run_count))
      
          # Convert the list to a dataframe
          mean_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 AFLNwe
              ax.grid()
      
          # Save to file
          plt.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-lightftp
      
      profuzzbench_plot.py -i results.csv -p lightftp -r 4 -c 60 -s 1 -o cov_over_time.png

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

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

相关文章

研华运动控制卡在LabVIEW中的应用

在现代工业和科研领域中&#xff0c;精密运动控制系统的需求日益增加。这些系统广泛应用于自动化生产线、精密机械加工、机器人控制、光学仪器调试和实验室自动化设备等诸多领域。本文以研华公司的运动控制卡为例&#xff0c;详细介绍其在LabVIEW中的应用&#xff0c;展示如何通…

习题练习以

题意&#xff1a;求i&M的popcount的和&#xff0c;i属于0……N 主要思路还是变加为乘。 举个例子N22&#xff0c;即10110 假设M的第3位是1&#xff0c;分析N中&#xff1a; 00110 00111 00100 00101 发现其实等价于 0010 0011 0000 0001 也就是左边第4位和第5…

数据库基础练习4

准备 create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8;insert into dept values(101,财务),(102,销售),(103,IT技术),(104,行政);INSERT …

诸葛亮的连环计 责任链模式

“万事谋定而后动&#xff0c;一环扣一环&#xff0c;方能成大事。” 在三国时期&#xff0c;诸葛亮以其超凡的智慧闻名天下。在他众多的计策中&#xff0c;有一个鲜为人知却极具智慧的连环计&#xff0c;完美诠释了现代软件设计中的责任链模式。让我们一同探索这个巧妙的计策…

【安全设备】堡垒机

一、什么是堡垒机 安全运维审计与风险控制系统即堡垒机&#xff0c;前身为跳板机&#xff0c;跳板机是一个简单的管理设备&#xff0c;但缺乏对运维操作的控制和审计能力。堡垒机是一种特定的网络安全设备&#xff0c;用于在一个网络环境中保护数据和网络不受外部和内部用户的…

Python酷库之旅-第三方库Pandas(013)

目录 一、用法精讲 31、pandas.read_feather函数 31-1、语法 31-2、参数 31-3、功能 31-4、返回值 31-5、说明 31-6、用法 31-6-1、数据准备 31-6-2、代码示例 31-6-3、结果输出 32、pandas.DataFrame.to_feather函数 32-1、语法 32-2、参数 32-3、功能 32-4、…

Go语言入门之基础语法

Go语言入门之基础语法 1.简单语法概述 行分隔符&#xff1a; 一行代表一个语句结束&#xff0c;无需写分号。将多个语句写在一行可以用分号分隔&#xff0c;但是不推荐 注释&#xff1a; // 或者/* */ 标识符&#xff1a; 用来命名变量、类型等程序实体。 支持大小写字母、数字…

Golang | Leetcode Golang题解之第226题翻转二叉树

题目&#xff1a; 题解&#xff1a; func invertTree(root *TreeNode) *TreeNode {if root nil {return nil}left : invertTree(root.Left)right : invertTree(root.Right)root.Left rightroot.Right leftreturn root }

Python函数 之 模块和包

1.模块 1, 在Python 中, 每个以 .py 结尾的 Python 代码⽂件 都可以称为是⼀个模块。 2, 在模块中 别⼈书写好的功能(变量, 函数, 类)&#xff0c;我们可以拿来直接使⽤。 3, 我们自己写的代码文件&#xff0c; 想要作为模块让别⼈使⽤, 你的代码⽂件名(模块名) 满足标识符的规…

大话光学原理:4.散射:瑞利、拉曼、米氏和布里渊

这是一缕柔和的光&#xff0c;在空气的舞台上轻盈地跳跃。它悠然自得&#xff0c;在宁静的空间中缓缓前行。然而&#xff0c;一片细薄透明的介质挡住了它的脚步&#xff0c;它毫无预兆地撞上了这片障碍。在这短暂的接触中&#xff0c;它被分解成无数微小的粒子&#xff0c;被迫…

LabVIEW电滞回线测试系统

铁电材料的性能评估依赖于电滞回线的测量&#xff0c;这直接关系到材料的应用效果和寿命。传统的电滞回线测量方法操作复杂且设备成本高。开发了一种基于LabVIEW的电滞回线测试系统&#xff0c;解决传统方法的不足&#xff0c;降低成本&#xff0c;提高操作便捷性和数据分析的自…

前端面试题38(js原型与对象)

在JavaScript中&#xff0c;原型&#xff08;prototype&#xff09;是核心特性之一&#xff0c;它用于实现对象之间的继承和属性方法的共享。理解原型和对象的关系对于深入学习JavaScript至关重要。下面我会详细解释这两个概念以及它们是如何工作的&#xff0c;并给出一些示例代…

关于Python的类的一些理解

才发现python的类对象只能调用类方法 我想使用对类对象a使用系统调用的len方法就会报错 2.类对象a是什么&#xff1f; 答&#xff1a;是所有的带有self的成员变量 举例说明&#xff1a;红色的就是a里面的东西 class A:def __init__(self,data):self.datadataself.b1self.d{a…

详细分析@FunctionalInterface的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Spring框架从入门到学精&#xff08;全&#xff09; 1. 基本知识 FunctionalInterface 是 Java 8 引入的一个注…

理解负载组电路-EAK负载电路解释

负载组具有安全、可靠、操作方便、使用寿命长等特点。了解控制、冷却和负载元件电路的布局和功能对于理解负载组的运行、为应用选择负载组和维护负载组非常重要。以下各节将描述这些电路。 EAK负荷组运行概述 负载组接收来自电源的电力&#xff0c;将其转换为热量&#xff0c;…

【漏洞复现】通达OA v2017 video_file.php 任意文件下载漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

数据结构之折半查找

折半查找的算法思想&#xff1a; 折半查找又称二分查找&#xff0c;它仅仅适用于有序的顺表。 折半查找的基本思想&#xff1a;首先将给定值key与表中中间位置的元素&#xff08;mid的指向元素&#xff09;比较。midlowhigh/2&#xff08;向下取整&#xff09; 若key与中间元…

字典树(Tire树)

字典树(Tire树) 字典树是一种多叉树&#xff0c;又称为前缀树。核心思想是利用字符串的公共前缀。 字典树的根节点为空&#xff0c;从根节点到某一节点路径上的字符连接起来构成字符串&#xff0c;完整的字符串在链上而非结点上&#xff0c;一个节点的所有子节点都具有相同公…

AMSR-E L2 降雨子集:GES DISC 的 CloudSat 轨道 V002 (AMSERR_CPR) 位于同一地点

AMSR-E L2 Rainfall Subset, collocated with CloudSat track V002 (AMSERR_CPR) at GES DISC AMSR-E L2 降雨子集&#xff0c;与位于 GES DISC 的 CloudSat 轨道 V002 (AMSERR_CPR) 位于同一地点 简介 这是沿云卫星视场轨迹的 AMSR-E 雨率产品子集。子集的目标是选择并返回…

英福康INFICON FabGuard传感器集成与分析系统PPT

英福康INFICON FabGuard传感器集成与分析系统PPT