atheris从安装到fuzz输入输出解读
1. 引入
模糊测试是一种自动化的软件测试技术,它通过自动生成大量随机数据作为输入来测试程序,以发现潜在的错误、漏洞或崩溃。atheris是一个专门用于CPython(Python的C语言实现)的模糊测试框架。
2. 安装atheris
参考1,笔者在Ubuntu 22.04.3 LTS下( gcc version 11.4.0,cmake version 3.22.1,不需要clang也不需要llvm ),直接用pip install atheris
就能安装好atheris。但在centos7下,gcc版本较低的情况下,安装报错较多且难以正确安装。
3. fuzz过程
- 假设需要对如下example_library.py中的代码进行fuzz
def CodeBeingFuzzed(number):"""Raises an exception if number is 17."""if number == 17:raise RuntimeError('Number was seventeen!')
- fuzz驱动例子(fuzzing_example.py)如下
import atheris
import sys# This tells Atheris to instrument all functions in the `struct` and
# `example_library` modules.
with atheris.instrument_imports():import structimport example_library@atheris.instrument_func # Instrument the TestOneInput function itself
def TestOneInput(data):if len(data) != 4:return # Input must be 4 byte integer.number, = struct.unpack('<I', data)example_library.CodeBeingFuzzed(number)atheris.Setup(sys.argv, TestOneInput)
atheris.Fuzz()
这里有几个重点:
(1)使用atheris.instrument_imports()上下文管理器:
- 这个上下文管理器用于告诉Atheris框架,它应该为在上下文内导入的模块中的所有函数添加模糊测试的支持(即“instrument”这些函数)。
- 在这个例子中,struct和example_library模块被导入,并且它们的函数会被Atheris框架进行模糊测试时的跟踪和修改。
(2)定义TestOneInput函数:
这个函数是模糊测试的核心,每个测试用例的输入数据都会传递给这个函数。
- 使用@atheris.instrument_func装饰器,这个函数本身也被Atheris框架“instrument”了,意味着Atheris可以跟踪函数内部发生的各种事件,比如异常和返回值的改变。
- 函数内部首先检查输入数据的长度是否为4字节,如果不是,则直接返回。这是因为后面的struct.unpack调用期望的是一个4字节的整数。
- 使用struct.unpack(‘<I’, data)从输入数据中解包出一个无符号整数(<I表示小端字节序的4字节无符号整数)。
然后,这个整数被传递给example_library.CodeBeingFuzzed函数进行实际的模糊测试。
- 直接运行fuzz驱动进行测试
python fuzzing_example.py
- 命令行输出
(env_aa_atheris_py311) bbb@ubuntu:/data/ccc/atheris/example_fuzzers$ python fuzzing_example.py
INFO: Instrumenting struct
INFO: Instrumenting example_library
INFO: Using built-in libfuzzer
WARNING: Failed to find function "__sanitizer_acquire_crash_state".
WARNING: Failed to find function "__sanitizer_print_stack_trace".
WARNING: Failed to find function "__sanitizer_set_death_callback".
INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 4169936481
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
INFO: A corpus is not provided, starting from an empty corpus
#2 INITED cov: 2 ft: 2 corp: 1/1b exec/s: 0 rss: 38Mb
#21 NEW cov: 5 ft: 5 corp: 2/5b lim: 4 exec/s: 0 rss: 38Mb L: 4/4 MS: 4 CopyPart-CopyPart-ShuffleBytes-CopyPart-=== Uncaught Python exception: ===
RuntimeError: Number was seventeen!
Traceback (most recent call last):File "/data/abcd/atheris/example_fuzzers/fuzzing_example.py", line 45, in TestOneInputexample_library.CodeBeingFuzzed(number)File "/data/abcd/atheris/example_fuzzers/example_library.py", line 19, in CodeBeingFuzzedraise RuntimeError('Number was seventeen!')
RuntimeError: Number was seventeen!==1066609== ERROR: libFuzzer: fuzz target exited
SUMMARY: libFuzzer: fuzz target exited
MS: 2 CMP-ChangeBit- DE: "\001\000\000\000"-; base unit: 3f3d2d8955322f325af6db2238355fa07007ebd9
0x11,0x0,0x0,0x0,
\021\000\000\000
artifact_prefix='./'; Test unit written to ./crash-498bcbf6cbffcc8dd2623f388d81f44cfad1014d
Base64: EQAAAA==
(env_aa_atheris_py311) bbb@ubuntu:/data/ccc/atheris/example_fuzzers$
异常之前的输出解读:
(1)INFO: Instrumenting struct
和 INFO: Instrumenting example_library
:
这两条信息表明 Atheris 正在对特定的结构体和库(example_library)进行代码插桩(Instrumentation),这是模糊测试的一个步骤,用于收集代码覆盖率等信息。
(2)INFO: Using built-in libfuzzer
:
表示 Atheris 使用内置的 libFuzzer 引擎来执行模糊测试。libFuzzer 是一个由 LLVM 提供的库,用于自动化模糊测试。
(3)WARNING: Failed to find function "__sanitizer_acquire_crash_state", "__sanitizer_print_stack_trace", "__sanitizer_set_death_callback"
:
这些警告表明 Atheris 或 libFuzzer 在尝试使用某些与 AddressSanitizer(ASan)相关的函数时失败了。这可能是因为当前的测试环境或配置不支持这些功能。
(4)INFO: Running with entropic power schedule (0xFF, 100).
:
这表明模糊测试正在使用一种特定的能量调度策略(Entropic Power Schedule)。“entropic power schedule” 是一种基于熵理论的调度策略,主要用于优化模糊测试(fuzzing)中的能量分配。具体来说,这种策略通过为那些能够最大化信息的种子分配更多的能量来提高模糊测试的效率。这种方法被称为 Entropic,并已被集成到流行的灰盒模糊测试工具 LibFuzzer 中。
(5)INFO: Seed: 4169936481
:
显示当前模糊测试的随机种子值。种子值用于确保测试的可重复性。
(6)INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
:
表示没有指定最大输入长度,因此 libFuzzer 将不会生成大于 4096 字节的输入。
(7)INFO: A corpus is not provided, starting from an empty corpus
:
表明没有提供初始测试用例集(corpus),因此模糊测试将从空白的测试用例集开始。
(8)#2 INITED cov: 2 ft: 2 corp: 1/1b exec/s: 0 rss: 38Mb 和 #21 NEW cov: 5 ft: 5 corp: 2/5b lim: 4 exec/s: 0 rss: 38Mb L: 4/4 MS: 4 CopyPart-CopyPart-ShuffleBytes-CopyPart-
:
这些是模糊测试过程中的状态更新。#2 和 #21 表示测试的不同阶段或迭代。cov 表示代码覆盖率,ft 表示特征数(可能指特定的测试路径或条件),corp 表示测试用例集的大小和当前状态,exec/s 表示每秒执行的测试数,rss 表示使用的常驻集大小(内存使用量),L 表示当前测试用例的长度,MS 表示生成当前测试用例所使用的变异策略(Mutation Strategy)。
Uncaught Python exception
:
表示触发了一个异常。
异常之后的输出解读:
(1)==1066609== ERROR: libFuzzer: fuzz target exited
:
这条错误信息表明模糊测试的目标程序(fuzz target)异常退出了
(2)SUMMARY: libFuzzer: fuzz target exited
:
这是对上一条错误信息的总结,再次强调模糊测试目标程序已经退出。
(3)MS: 2 CMP-ChangeBit-
:
这表示在生成导致程序退出的测试用例时,使用了两个变异策略(Mutation Strategies):CMP(可能是指比较操作的某种变异)和ChangeBit(改变位)。
(4)DE: "\001\000\000\000"-; base unit: 3f3d2d8955322f325af6db2238355fa07007ebd9
:
DE 表示数据变异(Data Mutation)的结果。这里显示了一个具体的变异数据(\001\000\000\000),以及一个基础单元(base unit),这个基础单元可能是指变异操作之前的数据或是一个特定的种子值。
(5)0x11,0x0,0x0,0x0,
:
0x11正好是十进制数的17,这个数据能对要fuzz的函数CodeBeingFuzzed产生异常。
(6)\021\000\000\000
:
这是另一个变异后的数据示例,表明在模糊测试过程中,数据被进一步修改以尝试触发不同的程序行为。
(7)artifact_prefix='./'; Test unit written to ./crash-498bcbf6cbffcc8dd2623f388d81f44cfad1014d
:
这条信息表明,当模糊测试目标程序退出时,libFuzzer 自动将触发退出的测试用例保存到了一个文件中。artifact_prefix=‘./’ 表示保存的文件位于当前目录下,文件名是 crash-498bcbf6cbffcc8dd2623f388d81f44cfad1014d。这个文件包含了导致程序退出的具体输入数据。
(8)Base64: EQAAAA==
:
这是触发退出的测试用例的 Base64 编码表示。Base64 是一种编码方案,用于将二进制数据转换为 ASCII 字符串。这个编码可以用于在文本环境中传输二进制数据,或者在不支持二进制数据的系统中存储二进制数据。
- 输出crash文件
$ hexdump crash-498bcbf6cbffcc8dd2623f388d81f44cfad1014d
0000000 0011 0000
0000004
从上面输出数据的分析可以看到,0x11,0x0,0x0,0x0,
,0x11正好是十进制数的17,这个数据能对要fuzz的函数CodeBeingFuzzed产生异常。
4. 总结
本文给出了atheris从安装到fuzz输入输出解读的过程,例子来源参考1。
参考
- https://github.com/google/atheris/tree/master
- https://yiyan.baidu.com/
相关文章:
atheris从安装到fuzz输入输出解读
1. 引入 模糊测试是一种自动化的软件测试技术,它通过自动生成大量随机数据作为输入来测试程序,以发现潜在的错误、漏洞或崩溃。atheris是一个专门用于CPython(Python的C语言实现)的模糊测试框架。 2. 安装atheris 参考1&#x…...
「 机器人 」系统辨识实验浅谈
前言 系统辨识实验是一种通过实验和数据分析的方法,用于建立物理系统的数学模型的技术。系统辨识是控制工程和系统科学中的重要环节,尤其是在模型未知或复杂的情况下。以下是系统辨识实验的详细介绍: 1. 系统辨识实验的目的 1.1 建模 为动态系统(如机械系统、电气系统或生…...

基于Flask的哔哩哔哩评论数据可视化分析系统的设计与实现
【Flask】基于Flask的哔哩哔哩评论数据可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统可以搜索查看作者、播放量、评论等相关信息,并将相关的分析…...
[央企大赛 2025] pwn
拿到堆附件,不清楚哪个是密码哪个是pwn,找到两个pwn,一个RSA密码相对简单(已知e,d,N,直接用N解出k((ed-1)//phi_N(ed-1)//N^2),然后求pq,而phi_N正好是pq的2次方程)。就只复现了两个pwn,感觉还有…...

C语言初阶--折半查找算法
目录 练习1:在一个有序数组中查找具体的某个数字n 练习2:编写代码,演示多个字符从两端移动,向中间汇聚 练习3:简单编写代码实现,模拟用户登录情景,并且只能登录三次 练习4:猜数字…...

Python!从0开始学爬虫:(一)HTTP协议 及 请求与响应
前言 爬虫需要基础知识,HTTP协议只是个开始,除此之外还有很多,我们慢慢来记录。 今天的HTTP协议,会有助于我们更好的了解网络。 一、什么是HTTP协议 (1)定义 HTTP(超文本传输协议ÿ…...
[ Spring ] Spring Cloud Gateway 2025 Comprehensive Overview
文章目录 Spring Gateway ArchitectureProject Level DependencyService CenterService ProviderGateway ServiceLaunch All Service Spring Gateway Architecture Service Center : register and find service providerService Provider : programs that provide actual serv…...
【项目初始化】自定义异常处理
我们在项目初始化的工作之一就是要自定义异常处理,用来处理项目中出现的各种异常,如业务异常、系统异常等等。 这些属于项目的通用基础代码,在任何后端中都可以复用。 1. 自定义错误码 自定义错误码,对错误进行收敛,…...
Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决
个人博客地址:Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决 | 一张假钞的真实世界 msvcp120.dll、msvcr120.dll、vcomp120.dll属于VC2013版中的动态链接库,如果丢失重新安装VC2013即可。下载地址:https://www.microsoft.com…...

【嵌入式】总结——Linux驱动开发(三)
鸽了半年,几乎全忘了,幸亏前面还有两篇总结。出于快速体验嵌入式linux的目的,本篇与前两篇一样,重点在于使用、快速体验,uboot、linux、根文件系统不作深入理解,能用就行。 重新梳理一下脉络,本…...

计算机图形学:实验三 光照与阴影
一、程序功能设计 设置了一个3D渲染场景,支持通过键盘和鼠标控制交互,能够动态调整光源位置、物体材质参数等,具有光照、阴影和材质效果的场景渲染。 OpenGL物体渲染和设置 创建3D物体:代码中通过 openGLObject 结构体表示一个…...
「 机器人 」扑翼飞行器混合控制策略缺点浅谈
前言 将基于模型的控制与强化学习策略融合在扑翼飞行器中,虽然能够兼顾系统稳定性与极限机动能力,但也面临了更高的系统复杂性、对硬件算力与可靠性的额外要求,以及难以回避的能量效率等方面挑战。以下从四个方面进行归纳与分析。 1. 系统复杂性增加 1.1 两种控制方法的并存…...

蓝桥杯算法日常|c\c++常用竞赛函数总结备用
一、字符处理相关函数 大小写判断函数 islower和isupper:是C标准库中的字符分类函数,用于检查一个字符是否为小写字母或大写字母,需包含头文件cctype.h(也可用万能头文件包含)。返回布尔类型值。例如: #…...

每日十题八股-2025年1月24日
1.面试官:Kafka 百万消息积压如何处理? 2.面试官:最多一次、至少一次和正好一次有什么区别? 3.面试官:你项目是怎么存密码的? 4.面试官:如何设计一个分布式ID? 5.面试官:单点登录是怎么工作的…...
tomcat的accept-count、max-connections、max-threads三个参数的含义
tomcat的accept-count、max-connections、max-threads三个参数的含义 tomcat的accept-count、max-connections、max-threads三个参数的含义 max-connections:最大连接数 最大连接数是指,同一时刻,能够连接的最大请求数 需要注意的是&#x…...
【无标题】mysql python 连接
coding:utf8 import os import pymysql import yaml from common.log import logger class Mysql: # 处理.sql备份文件为SQL语句 def __read_sql_file(self,file_path): # 打开SQL文件到f sql_list = [] with open(file_path, ‘r’, encoding=‘utf8’) as f: # 逐行读取和…...
linux naive代理设置
naive linux客户端 Release v132.0.6834.79-2 klzgrad/naiveproxy GitHub Client setup Run ./naive with the following config.json to get a SOCKS5 proxy at local port 1080. {"listen": "socks://127.0.0.1:1080","proxy": "htt…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统
一、电源管理系统简介 电源管理系统是STM32硬件设计和系统运行的基础,它不仅为芯片本身提供稳定的电源,还通过多种电源管理功能优化功耗、延长电池寿命,并确保系统的可靠性和稳定性。 二、电源监控器 作用:保证STM32芯片工作在…...

DBO优化最近邻分类预测matlab
蜣螂优化算法(Dung Beetle Optimizer,简称 DBO)作为一种新兴的群智能优化算法,于 2022 年末被提出,其灵感主要来源于蜣螂的滚球、跳舞、觅食、偷窃以及繁殖等行为。 本次使用的数据为 Excel 格式的分类数据集。该数据…...

【深入理解FFMPEG】命令行阅读笔记
这里写自定义目录标题 第三章 FFmpeg工具使用基础3.1 ffmpeg常用命令3.1.13.1.3 转码流程 3.2 ffprobe 常用命令3.2.1 ffprobe常用参数3.2.2 ffprobe 使用示例 3.3 ffplay常用命令3.3.1 ffplay常用参数3.3.2 ffplay高级参数3.3.4 ffplay快捷键 第4章 封装与解封装4.1 视频文件转…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...