fuzz测试之libfuzzer使用小结

news2024/12/23 5:26:29

fuzz测试之libfuzzer使用小结

    • 背景
    • 基本原理
    • 使用方法
    • 主调DEMO
    • 参考资料

背景


项目中,为测试算法的鲁棒性,经常会用到fuzz测试进行压力测试。fuzz测试是一种模糊测试方法,本质是通过灌入各种变异的随机数据,去遍历不同函数分支,以暴露程序中可能出现的问题。

*

接下来,本文以安卓平台LLVM自带的libFuzzer工具使用为例,简单介绍其使用方法。

基本原理


在学习使用之前,先了解其基本运行原理。LLVM中首先调用一次初始化接口LLVMFuzzerInitialize设定参数,然后通过反复调用接口LLVMFuzzerTestOneInput,不断灌入不同长度的随机数据,直到程序达到最大运行限制,或中途找到bug才中断退出。

使用方法


所需环境

  • 电脑硬件
    • NDK编译软件,使用NDK-R20及以上的版本,其clang编译器自带地址消毒和fuzz测试模块
    • adb软件,用于电脑与手机联调
  • 安卓手机(可使用开发者人员选项)

所需文件

  • CPP主调:
    • xx_fuzz.cc
  • 编译脚本:
    • andriod.mk
    • application.mk
  • 待测试算法源码
    • xx.c

基本流程

  • 电脑用NDK编译源文件,生成可执行文件
    • andriod.mk中添加
      • 编译选项:LOCAL_CFLAGS += -fsanitize=fuzzer,address -fomit-frame-pointer
      • 链接选项:LOCAL_LDFLAGS += -fsanitize=fuzzer,address
      • address选项是打开asan地址消毒功能,可增强找bug能力
    • application.mk中添加
      • 标准库:APP_STL := c++_shared
      • 因为调度代码是用CPP写的,需用到STL库
    • 打开powershell,在mk文件所在目录下,通过ndk-build指令,编译可执行文件
  • 通过ADB软件push推到手机文件夹内
    • 拷贝上一步骤生成的可执行文件和动态库文件(如:libclang_rt.asan-aarch64-android.solibc++_shared.so
    • 将之推到手机内,如/data/local/tmp/xx_fuzz/
      • 指令举例:adb push xx.so /data/local/tmp/xx_fuzz/
  • 通过ADB输入相关指令在手机上启动运行程序
    • 电脑连接安卓手机,手机进入开发者模式
    • 电脑命令窗,输入adb shell,进入手机环境
    • 切到可执行文件对应目录,输入以下指令,运行程序
      • LD_LIBRARY_PATH=./ ./demo_exe -max_len=65535 -len_control=0 -artifact_prefix=./corpus/ -detect_leaks=0 ./corpus
  • 解析报错日志
    • 根据手机环境反馈的错误信息,如偏移地址0x226534
    • 将ndk自带的llvm-symbolizer.exe所在目录添加到电脑环境变量的path中
    • 命令窗输入以下指令,解析报错相关代码上下文,分析算法,修复bug
      • 指令:llvm-symbolizer -e=demo_exe 0x226534 --print-source-context-lines=3
      • 模式:llvm-symbolizer -e=库名或EXE名 报错显示的偏移地址
  • 重点步骤
    • 打开fuzz测试的编译选项,并编译成功
    • LLVMFuzzerInitialize/LLVMFuzzerTestOneInput主调代码编写
  • 注意事项
    • 主调demo中不用写main函数,main由libfuzzer框架提供
    • c和cpp代码联合编译时,需用宏区分函数命名

具体MK文件编译脚本说明,见《NDK编译系列:构建C/CPP工程》。

主调DEMO


上面流程中用到的主调xx_fuzz.cc里的两个接口函数,框架模板如下:

#include <stddef.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

#ifdef __cplusplus
extern "C" {
#endif

int LLVMFuzzerInitialize(int argc, char **argv)
{
	// write your code
    return 0;
}

int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len)
{
	// write your code
    return 0;
}
    
#ifdef __cplusplus
}
#endif

进一步的,具体使用可以参考:libfuzzer从入门到放弃。

参考资料


  1. llvm-libfuzzer官方介绍
  2. 入门libFuzzer——编译链接
  3. libFuzzer使用总结教程
  4. libFuzzer学习
  5. Android NDK Address Sanitizer地址消毒ASAN
  6. aac的fuzzer测试工程

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

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

相关文章

蓝桥杯训练day1

前缀和差分1.前缀和(1)3956. 截断数组(2)795. 前缀和(3)796. 子矩阵的和(4)1230. K倍区间(5)99. 激光炸弹2.差分(1)797. 差分(2)差分矩阵(3)3729. 改变数组元素(4)100. 增减序列1.前缀和 (1)3956. 截断数组 方法1&#xff1a;暴力 先用两个数组分别保存前缀和&#xff0c;后缀…

如何快速、全面、深入地掌握一门编程语言

思考路线 如何快速&#xff1f; 什么样的Demo才能让人觉得你掌握了它&#xff1f; 空 判断&#xff1a;构造一个可以判断所有空的 is_empty 函数 for 循环&#xff1a;i 和 集合迭代两种 时间获取&#xff1a;年/月/日 时分秒 时间戳与时间格式互转 休眠时间函数 字符串处理…

对比学习MoCo损失函数infoNCE理解(附代码)

MoCo loss计算采用的损失函数是InfoNCE&#xff1a; ​​ 下面是MoCo的伪代码&#xff0c;MoCo这个loss的实现就是基于cross entropy loss。 将k作为q的正样本&#xff0c;因为k与q是来自同一张图像的不同视图&#xff1b;将queue作为q的负样本&#xff0c;因为queue中含有大量…

【Python学习笔记】44.Python3 MongoDB和urllib

前言 本章介绍Python的MongoDB和urllib。 Python MongoDB MongoDB 是目前最流行的 NoSQL 数据库之一&#xff0c;使用的数据类型 BSON&#xff08;类似 JSON&#xff09;。 PyMongo Python 要连接 MongoDB 需要 MongoDB 驱动&#xff0c;这里我们使用 PyMongo 驱动来连接。…

Ansys Zemax / SPEOS | 光源文件转换器

本文解释了如何在 SPEOS 与 Zemax 之间转换二进制光源文件。 下载 联系工作人员获取附件 简介 在本文中&#xff0c;为用户提供了一组Python代码&#xff0c;用于在Zemax和SPEOS之间转换源文件。 有些光源&#xff0c;如 .IES 文件&#xff0c;可在 SPEOS 和 Zemax 中进行…

计算机网络 | 谈谈TCP的流量控制与拥塞控制

文章目录一、TCP的流量控制1、利用滑动窗口实现流量控制【⭐⭐⭐】2、如何破解【死锁】局面❓二、TCP的拥塞控制1、拥塞控制的一般原理① 解决网络拥塞的误区② 拥塞控制与流量控制的关系【重点理解✔】2、TCP的拥塞控制方法① 接收窗口【rwnd】与拥塞窗口【cwnd】② 慢开始和拥…

BPE(Byte-Pair Encoding)简介

文章目录BPE简介Vocabulary构建Encoding and DecodingBPE简介 BPE是一种数据压缩算法的简单形式&#xff0c;数据中最常见的连续字节对被替换成该数据中不存在的字节。BPE的主要目标就是使用最少的token数目来表示一个corpus 在 A New Algorithm for Data Compression中首次提…

Spring IOC 容器 Bean 加载过程

Spring IOC 容器 Bean 加载过程 Spring 对于我们所有的类对象进行了统一抽象&#xff0c;抽象为 BeanDefinition &#xff0c;即 Bean 的定义&#xff0c;其中定义了类的全限定类名、加载机制、初始化方式、作用域等信息&#xff0c;用于对我们要自动装配的类进行生成。 Sprin…

新版本 | 异步复制、交易日历、自定义状态函数......请查收!

大家好~DolphinDB 最新版本近日已经发布&#xff0c;本次的 V2.00.9 与 V1.30.21 新版本推出了很多新功能&#xff0c;并对数据库做了全方位提升&#xff0c;是迄今为止新增功能最多的一次更新。新特性一览我们先来看一看新特性包含哪些方面&#xff1a;1、数据库针对数据安全和…

管理.模型.SWOT

1. SWOT 在企业战略规划中&#xff0c;通过辨析企业自身的竞争优势&#xff08;Strengths&#xff09;、劣势&#xff08;Weaknesses&#xff09;和外部环境为企业带来的机会&#xff08;Opportunities&#xff09;和威胁&#xff08; Threats&#xff09;&#xff0c;企业可制…

Interview系列 - 05 Java|Iterator迭代器|集合继承体系|Set List Map接口特性|List实现类区别

文章目录01. 迭代器 Iterator 是什么&#xff1f;02. 迭代器 Iterator 有什么特点&#xff1f;03. 迭代器 Iterator 怎么使用&#xff1f;04. 如何边遍历边移除 Collection 中的元素&#xff1f;05. Iterator 和 ListIterator 有什么区别&#xff1f;06. 数组和集合的区别&…

Alist ——本地网盘管理器

Alist ——本地网盘管理器 一、下载工具 Alist https://github.com/alist-org/alist二、启动登录 进入下载好的文件中&#xff0c;在地址栏输入cmd进入命令行启动 进入命令行输入 alist start启动 记住密码&#xff0c;和端口进入浏览器 输入 &#xff1a;127.0.0.1:5244用…

java final关键字 详解

概述&#xff1a;作用&#xff1a;细节&#xff1a;演示&#xff1a;总结&#xff1a;一、概述 : final [ˈ faɪnl]&#xff0c;最终的&#xff0c;最后的&#xff0c;决定性的&#xff0c;不可改变的。final作为Java中的一个关键字可以用来修饰类&#xff0c;方法&#xff0c…

【程序人生】从土木专员到网易测试工程师,薪资翻3倍,他经历了什么?

转行对于很多人来说&#xff0c;是一件艰难而又纠结的事情&#xff0c;或许缺乏勇气&#xff0c;或许缺乏魄力&#xff0c;或许内心深处不愿打破平衡。可对于我来说&#xff0c;转行是一件不可不为的事情&#xff0c;因为那意味着新的方向、新的希望。我是学工程管理的&#xf…

京东测试进阶之路:初入测试碎碎念篇

1、基本的测试用例设计方法 基本的测试用例设计方法&#xff08;边界值分析、等价类划分等&#xff09;。 业务和场景的积累&#xff0c;了解测试需求以及易出现的bug的地方。 多维角度设计测试用例&#xff08;用户、业务流程、异常场景、代码逻辑&#xff09;。 2、需求分析 …

idea自带maven位置、maven全局环境变量配置,安装jar到本地 mac

声明&#xff1a;本教程为mac版教程&#xff0c;Windows请路过 idea自带maven3配置全局环境变量 mac电脑maven3位置/Applications/IntelliJ\ IDEA.app/Contents/plugins/maven/lib/maven3配置全局变量,编~/.profile文件&#xff08;没有则新建&#xff09; export MAVEN/App…

JVM-JMM内存模型(happens-before、volatile)

前言 由于计算机的存储设备与处理器的运算速度有几个数量级的差距所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。 将运算需要使用到的数据复制到缓存中&#xff0c;让运算能快速进行&#xff0c;当运算…

Day895.MySql误删数据还原方案 -MySQL实战

MySql误删数据还原方案 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于MySql误删数据还原方案的内容。 传统的高可用架构是不能预防误删数据的&#xff0c;因为主库的一个 drop table 命令&#xff0c;会通过 binlog 传给所有从库和级联从库&#xff0c;进而导致整…

研报精选230220

目录 【行业230220国信证券】银行业行业专题&#xff1a;经济复苏中的优质中小银行【行业230220国信证券】汽车行业周报&#xff08;2023年第7周&#xff09;&#xff1a;吉利将发布新品牌“银河” &#xff0c;2022年宇通纯电动客车获欧洲销量冠军【行业230220开源证券】商贸零…

Java File相关操作

文章目录File文件操作IO流处理流缓冲流转换流对象流File文件操作 利用File类来操作。 文件操作中常用到相对目录和绝对路径 package org.File; import java.io.File; public class demo01 { public static void main(String[] args) { try{ File file new File("…