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 视频文件转…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
