Fuzz测试之libfuzzer使用小结
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
指令,编译可执行文件
- andriod.mk中添加
- 通过ADB软件push推到手机文件夹内
- 拷贝上一步骤生成的可执行文件和动态库文件(如:
libclang_rt.asan-aarch64-android.so
和libc++_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" {#endifint LLVMFuzzerInitialize(int argc, char **argv)
{// write your codereturn 0;
}int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len)
{// write your codereturn 0;
}#ifdef __cplusplus
}
#endif
进一步的,具体使用可以参考:libfuzzer从入门到放弃。
参考资料
- llvm-libfuzzer官方介绍
- 入门libFuzzer——编译链接
- libFuzzer使用总结教程
- libFuzzer学习
- Android NDK Address Sanitizer地址消毒ASAN
- aac的fuzzer测试工程
Fuzz测试之libfuzzer使用小结相关推荐
- Fuzz测试之libfuzzer高频报错问题FAQ
Fuzz测试之libfuzzer高频报错问题FAQ 场景问题 报错解决 编译阶段 运行阶段 进阶资料 本文小结fuzz测试遇到的高频问题及其解答. 场景问题 Q:fuzz主调函数OneInput/In ...
- CTS(14)---Android O CTS 测试之Media相关测试小结(二)
Android O CTS 测试之Media相关测试小结(二) CtsMediaTestCases android.media.cts.VideoDecoderPerfTest failed fail ...
- fuzz测试之syzkaller(linux kernel fuzz)
目录 一.fuzz 二.syzkaller简介 三.syzkaller整体架构 四.使用syzkaller进行Linux内核漏洞挖掘 环境准备 构建 运行syzkaller 一.fuzz 模糊测试 ( ...
- 职场经验:算法测试之实践与小结
本文主要对于算法测试的类型和方法做一下总结.在项目中,所接触算法测试的类型主要包括如下图所示的几个方面 01 算法模型 根据之前的调研,在测试阶段,对于新采用的算法模型,比如协同过滤,机器学习算法等的 ...
- Android 单元测试之Mockito
在博客Android 单元测试之JUnit4中,我们简单地介绍了:什么是单元测试,为什么要用单元测试,并展示了一个简单的单元测试例子.在文章中,我们只是展示了对有返回类型的目标public方法进行了单 ...
- 测试笔试题汇总(测试开发)
一.yy欢聚时代软件测试笔试题https://blog.csdn.net/xinjing2018/article/details/80740481 欢聚时代笔试. 二. 1,10111001对应的八进 ...
- Go中fuzzing系统的原理分析
我是一只可爱的土拨鼠,专注于分享 Go 职场.招聘和求职,解 Gopher 之忧!欢迎关注我. 欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习. 相信模糊测试大家已经很熟 ...
- 使用libFuzzer fuzz Chrome V8入门指南
本文讲的是使用libFuzzer fuzz Chrome V8入门指南, 什么是V8? V8(也称为Chrome V8)是由Chromium Project开发的用于Google Chrome浏览器 ...
- fuzz系列之libfuzzer
前言 本文以 libfuzzer-workshop 为基础 介绍 libFuzzer 的使用. libFuzzer简介 libFuzzer 是一个in-process,coverage-guided, ...
最新文章
- 医学+数据科学,必将大有可为 | 清华生物医学影像研究中心赵锡海
- Chapter 3 Phenomenon——23
- 用perl访问Oracle
- Oracle查询优化-05元数据查询
- 芒果云接吗_芒果糯米饭是生产力的关键吗?
- 服务器怎么做虚拟空间,服务器怎么做虚拟空间
- 19【推荐系统19】SNR:多任务学习
- 图解wordpress模板架构
- 关系型数据库的ACID指的是什么?
- Taylor Swift -- Crazier 附英文和中文歌词
- 前后端分离实现上传图片的功能
- 计算机编程 高斯消元,高斯-若尔当消元法
- L1-007 念数字(C语言)
- 大专毕业,从6个月开发转入测试岗位的一些感悟——写在测试岗位3年之际
- 我为方舟CPU李德磊代言 对中兴事件的看法
- c语言常量中有换行符,处理 Qt 中文提示 “常量中有换行符”
- Unity初级案例-愤怒的小鸟:四:11解决重复划线和小鸟轮换速度突然变大的问题+12添加小鸟飞出的拖尾效果+13整合场景和解决无法显示划线弹弓的问题
- 人均劳动生产率的单位_国家统计局解读2016年工资数据:与劳动生产率基本同步增长...
- 小白的柳州麻将黑科技.Part1 = 你不知道的门清
- Web常用的服务器软件整理(Win+Linux)
热门文章
- AppScan扫描器的用法
- Gatling:Cookie
- ACL访问控制列表——命名访问控制列表(实操!!!)
- 安装-唯一客服系统文档中心
- 《思考,快与慢》-结合消费者市场的分析|倪钰桐谈商业
- 菲涅尔区在线计算|无线传输损耗计算|dB(m,i)与功率(W)换算
- 斜杠“/“和反斜杠“\“理解和区别
- [深度学习工具]·音频特征提取pyAudioAnalysis工具包
- 马斯克400条聊天记录被法院公开,原来推特收购是在短信上谈崩的
- linux上组建和挂载磁盘阵列