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

  • 场景问题
  • 报错解决
    • 编译阶段
    • 运行阶段
  • 进阶资料

本文小结fuzz测试遇到的高频问题及其解答。

场景问题


Q:fuzz主调函数OneInput/Initialize区别?
A:前者fuzz而框架的main函数中无限次循环,后者仅开始运行时调用初始化一次。

Q:如何调用手机当前fuzz目录下的动态库?

A:由于非系统路径动态库,每次运行的时候都需要提前手动配置下。解决方法如下

  • 法1:运行时链接当前xx目录下的动态库,指令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/xx
  • 法2:运行时链接指定xx.so动态库,指令:export LD_PRELOAD=/usr/lib/gcc/aarch64-linux-gnu/7.5.0/xx.so
  • 法3:运行可执行文件时指定链接动态库目录,指令:LD_LIBRARY_PATH=./lib/ ./demo_exe -max_len=65535 -len_control=0 -detect_leaks=0 ./corpus

Q:如何回归测试fuzz崩溃的某条码流?

A:末尾指定对应特定码流文件路径,指令:LD_LIBRARY_PATH=./lib/ ./demo_exe -max_len=65535 -len_control=0 -detect_leaks=0 ./crash-ce3xfaf6a5217xxxbf5f95fafa103

Q:如何保存测试崩溃的码流,并指定其文件名前缀?

A:prefix表示后面加的指定码流前缀文件名,./corpus表示保存到当前corpus目录下。指令:LD_LIBRARY_PATH=./lib/ ./demo_exe -max_len=65535 -len_control=0 -artifact_prefix=./corpus_crash -detect_leaks=1 ./corpus

Q:运行指令不同参数分别代表什么意思?

A:以当前指令为例,指令:LD_LIBRARY_PATH=./lib/ ./demo_exe -max_len=65535 -len_control=0 -artifact_prefix=./corpus_crash -detect_leaks=1 ./corpus

  • LD_LIBRARY_PATH,表示当前非系统动态库目录链接路径
  • max_len,设定输入的bytes乱流最大字节数
  • len_control,表示len的控制方式,默认为100,从小到大增长;为0,表示直接按最大len(max_len)来测试
  • -detect_leaks=0,不开启内存泄漏检测,加快fuzz速度
  • -rss_limit_mb=4096,给予4096M的内存使用空间
  • -corpus,存放当前的测试用例输入存放位置,本例中表示码流,对应oneinput中的data输入

Q:运行fuzz过程中的提示含义如何解读?

A:比如:\#52724 cov: 5041 ft: 24878 corp: 501/16Mb lim: 65535 exec/s: 4 rss: 97Mb L: 64554/65535 MS: 4 ChangeByte-CopyPart-CrossOver-ChangeBinInt,参数解读如下:

  • #52724:表示已经测试过52724个数据
  • cov:当前已经覆盖的代码块或边数
  • ft:尝试覆盖率的信号个数
  • corp:当前随机序列的入口个数,及其所占用的内存大小
  • lim:当前最大maxlen为65535字节,对应的oneinput函数中的size
  • exec/s:迭代速度,每秒xx次
  • rss:当前内存消耗
  • L:当前输入的实际所占字节

报错解决


编译阶段

报错:ld: error: undefined symbol: std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >::resize(unsigned long, char)

error:linker command failed with exit code 1

ld: error: undefined symbol: std::__ndk1::basic_streambuf<char, std::__ndk1::char_traits >::~basic_streambuf()

>>> FuzzerDataFlowTrace.cpp.o:(fuzzer::Command::toString() const) in archive D:/ProgramData/android-ndk-r23c/build//…/toolchains/llvm/prebuilt/windows-x86_64\lib64\clang\12.0.9\lib\linux\libclang_rt.fuzzer-aarch64-android.a

>>> referenced 18 more times

分析解决

  • 根因:未在application.mk中链接C++相关的基础库
  • 解决:在application.mk中,添加代码行:APP_STL := c++_shared

编译报错:无main函数等

ld: error: undefined symbol: LLVMFuzzerTestOneInput

>>> referenced by FuzzerMain.cpp:20 (out/llvm-project/compiler-rt/lib/fuzzer\FuzzerMain.cpp:20)

>>> FuzzerMain.cpp.o:(main) in archive D:/ProgramData/android-ndk-r23c/build//…/toolchains/llvm/prebuilt/windows-x86_64\lib64\clang\12.0.9\lib\linux\libclang_rt.fuzzer-aarch64-android.a

>>> did you mean to declare LLVMFuzzerTestOneInput(unsigned char const*, unsigned long) as extern “C”?【关键】【】【】

分析解决:

  1. andriod.mk中添加:cflags/ldflags要同时使用(以便于自动调用llvm的fuzzer main框架),这里可以解决无main问题,调用fuzzer框架里的main
LOCAL_CFLAGS += -fsanitize=fuzzer -fno-omit-frame-pointer
LOCAL_LDFLAGS += -fsanitize=fuzzer
  1. cc文件为CPP代码编译,其中C代码函数要用宏定义隔开,以免函数类型定义用cpp的方式导致无法
...cpp code#ifdef __cplusplusextern "C" {#endif...c code#ifdef __cplusplus}#endif

参考:https://stackoverflow.com/questions/48699256/clang-libfuzzer-undefined-reference-to-sanitizer-cov-trace-const-cmp8

运行阶段

报错:无程序报错行的具体偏移地址,无法反解析。ERROR: AddressSanitizer: heap-buffer-overflow on address

=25006==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x0050af50e175 at pc 0x006fd1344550 bp 0x007ffb7aeb10 sp 0x007ffb7ae2a0

READ of size 8300 at 0x0050af50e175 thread T0

AddressSanitizer:DEADLYSIGNAL

AddressSanitizer: nested bug in the same thread, aborting.

分析解决:

  • 原因:手机运行缺乏clang生成的asan动态库,无法打桩得到具体出问题的函数信息
  • 解决:
    • 找到编译附带生成的库:libclang_rt.asan-aarch64-android.so,与libc++_shared.so和可执行文件同目录
    • 同时注意编译选项:-g, o0

报错:CANNOT LINK EXECUTABLE “./demo_exe”: cannot locate symbol “__emutls_get_address”

CANNOT LINK EXECUTABLE "./demo_exe: cannot locate symbol “__emutls_get_address” referenced by “/data/local/tmp/”…

分析解决:

  • 根因:无C++基础动态库:libc++_shared.so
  • 解决:
    • application.mk中添加:APP_STL := c++_shared
    • 推入生成的库文件libc++_shared.so到手机
    • 当前文件夹作为链接库,指令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/xx

进阶资料


  1. The Art of Fuzzing - Demo 3: LibFuzzer Demonstration
  2. llvm-symbolizer指令解析官方详解,link

Fuzz测试之libfuzzer高频报错问题FAQ相关推荐

  1. Fuzz测试之libfuzzer使用小结

    Fuzz测试之libfuzzer使用小结 背景 基本原理 使用方法 主调DEMO 参考资料 背景 项目中,为测试算法的鲁棒性,经常会用到fuzz测试进行压力测试.fuzz测试是一种模糊测试方法,本质是 ...

  2. ceph-deploy离线部署ceph集群及报错解决FAQ

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  3. Wfuzz:一款强大的Web Fuzz测试工具 | 安装报错解决

    Wfuzz是一个基于Python的Web爆破程序,它支持多种方法来测试WEB应用的漏洞.你可以审计参数.登录认证.GET/POST方式爆破的表单,并且可以发掘未公开的资源,比如目录.文件和头部之类的. ...

  4. php的old函数,laravel单元测试之phpUnit中old()函数报错解决

    php 的 laravel单元测试之phpUnit中old()函数报错解决 前言 最近在做laravel单元测试.遇到了一个问题: 当添加的view里面使用old()函数时就会报错,正常url访问没问 ...

  5. eas报错日记_(FAQ)EAS服务启动失败[金蝶EAS]

    [问题]: (FAQ)EAS服务启动失败 版本: 6.0 模块: 系统部署 [答复]: 原因分析: 日志都是两周前的日志,显示都是SQLServer的数据库网络端口没有打开相关报错. 经沟通得知当前已 ...

  6. 统计本段话的高频词汇——报错:KeyError

    项目场景: 编写程序,实现用户随机输入一段话,统计本段话的高频词汇 原来的代码 import jieba txt = input("请输入一段话:") words = jieba. ...

  7. PHP获取input中的值相同报错,laravel单元测试之phpUnit中old()函数报错解决_php实例...

    前言 最近在做laravel单元测试.遇到了一个问题: 当添加的view里面使用old()函数时就会报错,正常url访问没问题,但是在phpUnit中就报错 错误原因: exception 'Runt ...

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

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

  9. golang defer 关闭文件 报错file may have nil or other unexpected value as its corresponding error

    错误实例: file, err := os.Open("xxx.txt") defer file.Close() if err != nil {return err } 初学者很多 ...

最新文章

  1. ASP.NET的软件开发规范_转载
  2. mysql5.7中使用group by报错
  3. 二进制转base64
  4. 少儿编程150讲轻松学Scratch(十二)-Scratch编程算法练习-选择排序
  5. 实例探究Python以并发方式编写高性能端口扫描器的方法
  6. 【数据库基础知识】数据库表格——主键和外键
  7. mac vim 配置文件
  8. android微信支付代码,详解android微信支付实例代码
  9. python的模块导入问题_python的模块导入问题
  10. 从多态性谈动态联编的必要性(c++)
  11. VMware vSAN入门必会知识点
  12. 安卓udp发包工具_好装逼牌udp-tcp发包工具
  13. EXCEL 分组取前十的数据
  14. 进制转换简单实现代码
  15. 中国数学界为之骄傲--庞加莱猜想的完美证明
  16. linux 删除文件的最后一行
  17. 基于数字孪生的智慧城市
  18. Intel 12代处理器主机 安装Ubuntu
  19. adb绕过夜神模拟器锁屏密码
  20. 利用python对Excel进行读写操作

热门文章

  1. 利用计算机或图形计算器在,利用图形计算器编写趣味数字游戏
  2. 是不是从Java培训班出来的人都被淘汰了?
  3. python3.x,一个关于queue.task_done()与queue.join()的实验
  4. AB实验分析方法论 - matching
  5. 学习笔记(01):OmniPlan项目管理就该这样学-使用关联线连接任务
  6. USB协议基本概念及usbmon日志解析
  7. 2023仿微信聊天软件系统开发独立部署聊天系统
  8. 计算机专业小新pro14,联想小新pro14对比小新air15 2021款哪个值得买
  9. jquery仿网站客服
  10. 《python爬虫120例》教程导航帖(2022.5.7更新)