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 视频文件转…...
S2-Pro企业级监控告警集成:与Prometheus和Grafana的实战
S2-Pro企业级监控告警集成:与Prometheus和Grafana的实战 1. 为什么企业级AI服务需要监控告警 AI服务在生产环境运行时,就像一辆24小时行驶的汽车,需要仪表盘来显示各项关键指标。想象一下,如果你开车时看不到油量表、水温计和速…...
在Ubuntu 20.04上搞定Synopsys SpyGlass 2016:一份针对高内核版本的详细避坑指南
在Ubuntu 20.04上搞定Synopsys SpyGlass 2016:一份针对高内核版本的详细避坑指南 当IC设计工程师遇到Ubuntu 20.04与SpyGlass 2016的版本冲突时,那种熟悉的挫败感往往伴随着终端里红色的报错信息一起涌现。这不是简单的"安装-运行"问题&#x…...
comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场...
comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场的洛伦兹力作用下振动,在长期作用下发生位移形变 2、单相变压器铁芯振动形变模型:铁芯在磁致伸缩作用下发生振动形变 注:时域仿真可以设置观察点,导出随时间变化…...
颠覆中文字体困境:思源宋体CN 7字重开源方案深度解析
颠覆中文字体困境:思源宋体CN 7字重开源方案深度解析 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 价值主张:破解中文字体的"三重枷锁" 在数字设计…...
2026学生免费用AI编程神器全攻略——白嫖不要白不要,大学生快来
好的,上一章刚教你用GitHub武装自己,筑起技术护城河,但光会搬砖(敲命令)还不够,你得学会“开高达”——用AI编程助手把效率拉满。 2026年了,如果还纯靠手打for循环和查API文档,那你…...
告别双流!用Vision Transformer (ViT) 搭建单流目标跟踪器OSTrack,实测速度提升40%
单流目标跟踪新范式:ViT驱动的OSTrack实战解析 在计算机视觉领域,目标跟踪技术正经历着从传统双流架构向单流范式的革命性转变。当我们面对复杂场景中的实时跟踪需求时,传统方法的性能瓶颈日益凸显——特征提取与关系建模的割裂处理导致计算冗…...
无人值守智能图书借阅系统 Java 后端开发实战
在无人值守智能图书借阅系统的Java后端开发实战中,需围绕系统架构设计、核心功能实现、关键技术选型及部署优化等核心环节展开,以下为具体开发方案:一、系统架构设计分层架构体系:采用经典的四层架构设计,包括表现层、…...
GLM-4.1V-9B-Base部署教程:NVIDIA驱动版本兼容性验证与降级方案
GLM-4.1V-9B-Base部署教程:NVIDIA驱动版本兼容性验证与降级方案 1. 模型概述 GLM-4.1V-9B-Base是智谱开源的一款视觉多模态理解模型,专注于图像内容识别与分析任务。该模型具备以下核心能力: 图片内容描述与场景理解图像主体识别与定位颜色…...
VideoAgentTrek Screen Filter 大规模部署成本分析:GPU资源优化配置指南
VideoAgentTrek Screen Filter 大规模部署成本分析:GPU资源优化配置指南 最近和几个做视频内容审核的朋友聊天,大家聊得最多的不是技术有多牛,而是“这玩意儿跑起来到底要花多少钱”。确实,像VideoAgentTrek Screen Filter这类视…...
Qt 5.14.2下MQTT开发全攻略:从源码编译到实战应用(附完整代码)
Qt 5.14.2下MQTT开发全流程实战指南 在物联网应用开发中,MQTT协议因其轻量级和高效性成为设备通信的首选方案。对于使用Qt框架的开发者而言,将MQTT集成到项目中可以构建出功能强大的跨平台物联网应用。本文将深入探讨在Windows平台上使用Qt 5.14.2进行MQ…...
