软件测试:LLVM中的Fuzz模糊测试框架——libFuzzer

目录

        • libFuzzer 简介
        • 用例测试

跟前一篇软件测试:C++ Google Test单元测试框架GTest测试技术一样,模糊测试也是经常用于软件测试中,甚至有时候模糊测试还和GTest内嵌使用,但是不同于GTest测试框架,模糊测试是一种方法,有很多不同的框架,我们可以根据需求选择不同的测试框架,下面以LLVM libFuzzer为例

libFuzzer 简介

LLVM libFuzzer LLVM 生态系统中的一个模糊测试工具,用于自动化地发现软件程序中的漏洞和错误。它通过生成大量的随机输入数据并观察程序的行为来进行模糊测试。 libFuzzer 是一个基于内存的模糊测试引擎,使用LLVM的插桩技术和代码优化功能来提高测试效率和覆盖率

以下是 libFuzzer 的一些功能特点:

自动化模糊测试:libFuzzer 提供了一种自动化的模糊测试方法,可以生成大量的随机输入数据,并在每个输入上运行目标函数进行测试。它通过观察程序的崩溃、断言失败、未定义行为等反馈来发现潜在的问题。

  • 内存安全性:libFuzzer 通过使用 AddressSanitizer (ASan)UndefinedBehaviorSanitizer (UBSan) 等工具来确保模糊测试过程中的内存安全性。这有助于检测和报告内存错误、缓冲区溢出、使用已释放内存等问题
  • 代码覆盖率分析:libFuzzer 使用 LLVM 提供的代码覆盖率分析技术,帮助确定已经执行过的代码路径和未执行的代码区域。这有助于评估测试的质量和覆盖范围,并帮助发现潜在的漏洞
  • 快速收敛:libFuzzer 使用一种称为 “回退”(Backoff)的策略,以更快地收敛到程序中的漏洞。它会根据测试结果调整输入数据的变异程度,使得能够更快地发现问题并生成更有潜力的测试用例
  • 灵活性和可定制性:libFuzzer 提供了多种选项和配置参数,使用户能够根据自己的需求进行定制。例如,可以设置最大测试时间、内存消耗限制、覆盖率报告等。
    多线程支持:libFuzzer 支持多线程执行,可以利用多核处理器并行进行模糊测试,加快测试速度
用例测试

写一个小demo来展示,下面是一个简单的示例,演示如何编写一个模糊测试用例来测试一个简单的函数,该函数从输入中读取字符串并将其转换为整数

// my_source.cpp
#include <string>
#include <iostream>int string_to_int(const std::string& str) {// This function does not handle exceptions correctlyreturn std::stoi(str);
}

编写一个简单的模糊测试用例,用于测试这个 string_to_int 函数

// my_fuzz_test_fuzzer.cpp
#include <cstdint>
#include <cstddef>
#include <string>extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {// Create a string from the input datastd::string input(reinterpret_cast<const char*>(Data), Size);// Call the function we want to fuzzint result = string_to_int(input);// Do something with the result if needed (in this case, just print it)// This is optional, but can be helpful for debugging// std::cout << "Result: " << result << std::endl;return 0;
}

使用clang ++来编译

clang++ -fsanitize=fuzzer -o my_fuzz_test_fuzzer my_fuzz_test_fuzzer.cpp my_source.cpp

运行后程序崩溃并输出

ubuntu@VM-8-16-ubuntu:~/tmp$ ./my_fuzz_test_fuzzer -runs=10000
INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 271889240
INFO: Loaded 1 modules   (24 inline 8-bit counters): 24 [0x5634f4ff2fd8, 0x5634f4ff2ff0), 
INFO: Loaded 1 PC tables (24 PCs): 24 [0x5634f4ff2ff0,0x5634f4ff3170), 
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
terminate called after throwing an instance of 'std::invalid_argument'what():  stoi
==3398064== ERROR: libFuzzer: deadly signal
# ...
NOTE: libFuzzer has rudimentary signal handlers.Combine libFuzzer with AddressSanitizer or similar for better crash reports.
SUMMARY: libFuzzer: deadly signal
MS: 0 ; base unit: 0000000000000000000000000000000000000000artifact_prefix='./'; Test unit written to ./crash-da39a3ee5e6b4b0d3255bfef95601890afd80709
Base64: 

最后有用例输入产生的文件路径Test unit written to ./crash-da39a3ee5e6b4b0d3255bfef95601890afd80709,即

cat ./crash-a27ccd37d9bf8363d556137baf72042fd37165dc

说明输入为空的时候,会产生报错,根据产生异常的输入,从而可以更好的定位问题

按照正常的逻辑写一遍


#include <string>
#include <iostream>int string_to_int(const std::string& str) {// This function does not handle exceptions correctlyreturn std::stoi(str);
}int main()
{std::string inputStr = "";int ret = string_to_int(inputStr);return 0;
}
ubuntu@VM-8-16-ubuntu:~/tmp$ g++ my_source.cpp -o test_source
ubuntu@VM-8-16-ubuntu:~/tmp$ ./test_source 
terminate called after throwing an instance of 'std::invalid_argument'what():  stoi
Aborted (core dumped)

报错成立,还有如AFLHonggfuzzPeach FuzzerFuzz测试框架,大家有兴趣可以去试一试

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

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

相关文章

从深度伪造到恶意软件:网络安全迎来AI新挑战

如今&#xff0c;有越来越多的恶意行为者开始利用AI大语言模型开发能够绕过 YARA 规则的自我增强型恶意软件。 根据近日Recorded Future 发布的一份新报告&#xff1a;AI可以通过增强小型恶意软件变种的源代码来规避基于字符串的 YARA 规则&#xff0c;从而有效降低检测率。 …

这里是一本关于 DevOps 企业级 CI/CD 实战的书籍...

文章目录 &#x1f4cb; 前言&#x1f3af; 什么是 DevOps&#x1f3af; 什么是 CI/CD&#x1f3af;什么是 Jenkins&#x1f9e9; Jenkins 简单案例 &#x1f3af; DevOps 企业级实战书籍推荐&#x1f525; 参与方式 &#x1f4cb; 前言 企业级 CI/CD 实战是一个涉及到软件开发…

Linux CentOS 7.6安装Redis 6.2.6 详细保姆级教程

1、安装依赖 //检查是否有依赖 gcc -v //没有则安装 yum install -y gcc2、下载redis安装包 //进入home目录 cd /home //通过wget下载redis安装包 wget https://download.redis.io/releases/redis-6.2.6.tar.gz //解压安装包 tar -zxvf redis-6.2.6.tar.gz3、编译 //进入解压…

idea中常见快捷键及插件操作

1、双击shift【万能】 &#xff08;1&#xff09;输入pull&#xff0c;回车可以更新代码 &#xff08;2&#xff09;输入commit&#xff0c;回车可以提交代码 &#xff08;3&#xff09;输入history,可以查看提交记录 &#xff08;4&#xff09;输入break&#xff0c;回车可以查…

【Linux】如何使用git命令行与远程仓库建立连接(以Gitee为例)

目录 01.创建仓库 开源 初始化​编辑 设置模版 ​编辑 02.下载仓库到本地 03.提交贡献到远程仓库 01.创建仓库 首先在Gitee网站上登录你的账户&#xff0c;并创建一个新的仓库&#xff0c;输入仓库名称后就会自动生成仓库路径 开源 可以选择你的仓库是否开源。 开源仓…

企业如何选择一个开源「好」项目?

开源 三句半 oss-roast 需求明确是关键 风险考量要周全 开源虽好不白捡 别忘合规&#xff01; 显然&#xff0c;开源已成为一股不可阻挡的洪流&#xff0c;企业拥抱开源&#xff0c;积极参与开源项目不仅是响应技术潮流的必然选择&#xff0c;更是实现自身技术创新、市场拓展等…

rk3588 安卓13 需要暴露导航栏,状态栏的隐藏与显示接口

rk3588 安卓13 需要暴露导航栏&#xff0c;状态栏的隐藏与显示接口&#xff0c;因为源码使用了taskbar&#xff0c;是launcher3里面的导航栏&#xff0c;需要改成NavigationBar系统原本的导航栏&#xff0c;所以先改回&#xff0c;代码如下&#xff1a; LQXszcomplier171:~/te…

AI开源概览及工具使用

一、前言 随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型&#xff0c;如文心一言、通义千问等。各大应用也开始内置AI玩法&#xff0c;如抖音的AI特效&#xff1b; 关联资源&#xff1a;代码 GitHub、相关论文、项目Demo、产品文档、Grok Ai、gr…

【算法】雪花算法生成分布式 ID

SueWakeup 个人中心&#xff1a;SueWakeup 系列专栏&#xff1a;学习Java框架 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助播出! 目录 1. 什么是分布式 ID 2. 分布式 ID 基本要求 3. 数据库主键自增 4. UUID 5. S…

【高频SQL (进阶版)】1398.购买了产品A和产品B却没有购买产品C的顾客Plus

思路&#xff1a; 思路1&#xff1a;买了A&#xff0c;买了B&#xff0c;没有买C。 按人分组统计&#xff0c;A的数>0, B的数>0 ,C的数 0。 思路2&#xff1a;反过来查&#xff0c;用户id。在产品表里,产品名为A&#xff0c;为B的用户列表里&#xff0c;但是不在产品…

ab (Apache benchmark) - 压力/性能测试工具

Apache benchmark&#xff08;ab&#xff09; 安装window安装使用方法 - bin目录运行使用方法 - 任意目录运行 linux安装 基本命令介绍常用参数:输出结果分析&#xff1a; ab的man手册 安装 window安装 官网下载链接&#xff1a;https://www.apachehaus.com/cgi-bin/download…

c++ 指针大小

C的一个指针占内存几个字节&#xff1f; 结论&#xff1a; 取决于是64位编译模式还是32位编译模式&#xff08;注意&#xff0c;和机器位数没有直接关系&#xff09; 在64位编译模式下&#xff0c;指针的占用内存大小是8字节在32位编译模式下&#xff0c;指针占用内存大小是4字…

分布式之SleuthZipkin

Sleuth&Zipkin 学习当前课程&#xff0c;比必须要先掌握SpringCloud的基本应用&#xff08;Nacos&#xff0c;Feign调用&#xff09; 对Docker有一定的了解&#xff0c;知道docker-compose.yml如何启动一个容器 RabbitMQ&#xff0c;Elasticsearch有一定了解。 而且学习…

golang 操作redis

1. redis操作需要引入 github.com/gomodule/redigo/redis 包 go get github.com/gomodule/redigo/redis 2.封装redis操作对象&#xff0c;使用时便可调用 redis的 地址、端口、密码 放配置文件&#xff0c;用config获取即可 package databaseimport ("gin/config"…

[C++]20:unorderedset和unorderedmap结构和封装。

unorderedset和unorderedmap结构和封装 一.哈希表&#xff1a;1.直接定址法&#xff1a;2.闭散列的开放定址法&#xff1a;1.基本结构&#xff1a;2.insert3.find4.erase5.补充&#xff1a;6.pair<k,v> k的数据类型&#xff1a; 3.开散列的拉链法/哈希桶&#xff1a;1.基…

Spark面试重点

文章目录 1.简述hadoop 和 spark 的不同点&#xff08;为什么spark更快&#xff09;2.谈谈你对RDD的理解3.简述spark的shuffle过程4. groupByKey和reduceByKey的区别 1.简述hadoop 和 spark 的不同点&#xff08;为什么spark更快&#xff09; Hadoop 和 Spark 是两种用于大数据…

Python将 PDF 转换为 png 图片的教程

将PDF文件转换为PNG图片&#xff1a;Python实现方法 PDF文件因其跨平台和高保真的特性&#xff0c;在文档共享和打印中得到了广泛应用。然而&#xff0c;在某些情况下&#xff0c;我们需要将PDF页面转换为图片格式&#xff0c;例如在不支持PDF格式的平台上展示内容&#xff0c…

snort规则byte_math规则选项详解

byte_math规则选项的主要功能是从待检测的内存中获取指定的数据&#xff0c;并对数据按照要求进行加工处理&#xff0c;得到结果数值&#xff0c;供后续规则选项使用。 规则语法 规则格式 规则样式 byte_math:bytes <nbytes>,offset <offset>,oper <operate…

小程序中实现轮播图左向堆叠

1、效果图&#xff1a; 轮播图左向堆叠 2、封装的组件&#xff1a; my-swiper.wxml <view><view class"tower-swiper" bindtouchend"TowerEnd"><view class"tower-item" wx:for"{{swiperList}}" wx:key"index&q…

mabatis 下

mybatis 原生的API&注解的方式MyBatis-原生的API调用快速入门需求快速入门代码实现 MyBatis-注解的方式操作快速入门需求快速入门代码实现注意事项和说明 mybatis-config.xml配置文件详解说明properties属性settings全局参数定义typeAliases别名处理器typeHandlers类型处理…