微信小程序自助建站,网站改版灵感库,WordPress字段值展示页面,godaddy主机到网站fuzz测试之libfuzzer使用小结背景基本原理使用方法主调DEMO参考资料背景 项目中#xff0c;为测试算法的鲁棒性#xff0c;经常会用到fuzz测试进行压力测试。fuzz测试是一种模糊测试方法#xff0c;本质是通过灌入各种变异的随机数据#xff0c;去遍历不同函数分支#xf…
fuzz测试之libfuzzer使用小结背景基本原理使用方法主调DEMO参考资料背景 项目中为测试算法的鲁棒性经常会用到fuzz测试进行压力测试。fuzz测试是一种模糊测试方法本质是通过灌入各种变异的随机数据去遍历不同函数分支以暴露程序中可能出现的问题。
*
接下来本文以安卓平台LLVM自带的libFuzzer工具使用为例简单介绍其使用方法。
基本原理 在学习使用之前先了解其基本运行原理。LLVM中首先调用一次初始化接口LLVMFuzzerInitialize设定参数然后通过反复调用接口LLVMFuzzerTestOneInput不断灌入不同长度的随机数据直到程序达到最大运行限制或中途找到bug才中断退出。
使用方法 所需环境
电脑硬件 NDK编译软件使用NDK-R20及以上的版本其clang编译器自带地址消毒和fuzz测试模块adb软件用于电脑与手机联调 安卓手机可使用开发者人员选项
所需文件
CPP主调 xx_fuzz.cc 编译脚本 andriod.mkapplication.mk 待测试算法源码 xx.c
基本流程
电脑用NDK编译源文件生成可执行文件 andriod.mk中添加 编译选项LOCAL_CFLAGS -fsanitizefuzzer,address -fomit-frame-pointer链接选项LOCAL_LDFLAGS -fsanitizefuzzer,addressaddress选项是打开asan地址消毒功能可增强找bug能力 application.mk中添加 标准库APP_STL : c_shared因为调度代码是用CPP写的需用到STL库 打开powershell在mk文件所在目录下通过ndk-build指令编译可执行文件 通过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_len65535 -len_control0 -artifact_prefix./corpus/ -detect_leaks0 ./corpus 解析报错日志 根据手机环境反馈的错误信息如偏移地址0x226534将ndk自带的llvm-symbolizer.exe所在目录添加到电脑环境变量的path中命令窗输入以下指令解析报错相关代码上下文分析算法修复bug 指令llvm-symbolizer -edemo_exe 0x226534 --print-source-context-lines3模式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地址消毒ASANaac的fuzzer测试工程