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" {#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从入门到放弃。

参考资料


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

Fuzz测试之libfuzzer使用小结相关推荐

  1. Fuzz测试之libfuzzer高频报错问题FAQ

    Fuzz测试之libfuzzer高频报错问题FAQ 场景问题 报错解决 编译阶段 运行阶段 进阶资料 本文小结fuzz测试遇到的高频问题及其解答. 场景问题 Q:fuzz主调函数OneInput/In ...

  2. CTS(14)---Android O CTS 测试之Media相关测试小结(二)

    Android O CTS 测试之Media相关测试小结(二) CtsMediaTestCases android.media.cts.VideoDecoderPerfTest failed fail ...

  3. fuzz测试之syzkaller(linux kernel fuzz)

    目录 一.fuzz 二.syzkaller简介 三.syzkaller整体架构 四.使用syzkaller进行Linux内核漏洞挖掘 环境准备 构建 运行syzkaller 一.fuzz 模糊测试 ( ...

  4. 职场经验:算法测试之实践与小结

    本文主要对于算法测试的类型和方法做一下总结.在项目中,所接触算法测试的类型主要包括如下图所示的几个方面 01 算法模型 根据之前的调研,在测试阶段,对于新采用的算法模型,比如协同过滤,机器学习算法等的 ...

  5. Android 单元测试之Mockito

    在博客Android 单元测试之JUnit4中,我们简单地介绍了:什么是单元测试,为什么要用单元测试,并展示了一个简单的单元测试例子.在文章中,我们只是展示了对有返回类型的目标public方法进行了单 ...

  6. 测试笔试题汇总(测试开发)

    一.yy欢聚时代软件测试笔试题https://blog.csdn.net/xinjing2018/article/details/80740481 欢聚时代笔试. 二. 1,10111001对应的八进 ...

  7. Go中fuzzing系统的原理分析

    我是一只可爱的土拨鼠,专注于分享 Go 职场.招聘和求职,解 Gopher 之忧!欢迎关注我. 欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习. 相信模糊测试大家已经很熟 ...

  8. 使用libFuzzer fuzz Chrome V8入门指南

    本文讲的是使用libFuzzer fuzz Chrome V8入门指南, 什么是V8?  V8(也称为Chrome V8)是由Chromium Project开发的用于Google Chrome浏览器 ...

  9. fuzz系列之libfuzzer

    前言 本文以 libfuzzer-workshop 为基础 介绍 libFuzzer 的使用. libFuzzer简介 libFuzzer 是一个in-process,coverage-guided, ...

最新文章

  1. 医学+数据科学,必将大有可为 | 清华生物医学影像研究中心赵锡海
  2. Chapter 3 Phenomenon——23
  3. 用perl访问Oracle
  4. Oracle查询优化-05元数据查询
  5. 芒果云接吗_芒果糯米饭是生产力的关键吗?
  6. 服务器怎么做虚拟空间,服务器怎么做虚拟空间
  7. 19【推荐系统19】SNR:多任务学习
  8. 图解wordpress模板架构
  9. 关系型数据库的ACID指的是什么?
  10. Taylor Swift -- Crazier 附英文和中文歌词
  11. 前后端分离实现上传图片的功能
  12. 计算机编程 高斯消元,高斯-若尔当消元法
  13. L1-007 念数字(C语言)
  14. 大专毕业,从6个月开发转入测试岗位的一些感悟——写在测试岗位3年之际
  15. 我为方舟CPU李德磊代言 对中兴事件的看法
  16. c语言常量中有换行符,处理 Qt 中文提示 “常量中有换行符”
  17. Unity初级案例-愤怒的小鸟:四:11解决重复划线和小鸟轮换速度突然变大的问题+12添加小鸟飞出的拖尾效果+13整合场景和解决无法显示划线弹弓的问题
  18. 人均劳动生产率的单位_国家统计局解读2016年工资数据:与劳动生产率基本同步增长...
  19. 小白的柳州麻将黑科技.Part1 = 你不知道的门清
  20. Web常用的服务器软件整理(Win+Linux)

热门文章

  1. AppScan扫描器的用法
  2. Gatling:Cookie
  3. ACL访问控制列表——命名访问控制列表(实操!!!)
  4. 安装-唯一客服系统文档中心
  5. 《思考,快与慢》-结合消费者市场的分析|倪钰桐谈商业
  6. 菲涅尔区在线计算|无线传输损耗计算|dB(m,i)与功率(W)换算
  7. 斜杠“/“和反斜杠“\“理解和区别
  8. [深度学习工具]·音频特征提取pyAudioAnalysis工具包
  9. 马斯克400条聊天记录被法院公开,原来推特收购是在短信上谈崩的
  10. linux上组建和挂载磁盘阵列