LibFuzzer学习

LibFuzzer 学习

本文章来自于开源软件供应链点亮计划的Openeuler社区项目
项目名称:No.112 qemu设备fuzz测试完善

前言

LibFuzzer是一个in-processcoverage-basedevolutionary的模糊测试引擎,是LLVM项目的一部分。它与被测库链接,通过特定的入口点将模糊测试的输入提供给被测函数。在测试过程中不断变异输入,并统计代码覆盖率和崩溃情况。

LibFuzzer 使用方法

实验环境

采用了鹏程实验室的云主机,操作系统为OpenEuler

[root@host-10-0-0-94 libFuzzer]# lscpu
Architecture:                    aarch64
CPU op-mode(s):                  64-bit
Byte Order:                      Little Endian
CPU(s):                          4

[root@host-10-0-0-94 libFuzzer]# cat /etc/os-release
NAME="openEuler"
VERSION="20.03 (LTS-SP1)"

简单使用

入门教学

  1. 安装llvm和clang

    • 源码编译:对于机器性能尤其是内存(8GB)和硬盘(15-20GB)的要求比较高,需要对编译命令进行一些优化。需要额外安装LibFuzzer依赖的compile-rt
    git clone https://gitee.com/mirrors/LLVM.git
    cd LLVM ; mkdir build ; cd build
    cmake -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt" -DCMAKE_BUILD_TYPE="Release" -DLLVM_TARGETS_TO_BUILD="host" -G "Unix Makefiles" ../llvm
    make -j4
    
    • 二进制安装:下载对应版本的二进制文件,方便在不同版本间切换。可以使用软链接添加到环境变量中方便使用。
    • 包管理器安装,版本较低,自带了libFuzzer。
    # sudo apt/dnf search xxx 可以查看包管理器中包含的软件以及对应版本
    sudo apt/dnf install clang llvm compiler-rt
    
  2. 编译被测二进制文件,加入LibFuzzer的编译选项

    // LibFuzzer提供的函数接口,在被测源代码fuzz_me.cc中实现
    extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
      DoSomethingInterestingWithMyAPI(Data, Size);
      return 0;  // Non-zero return values are reserved for future use.
    }
    
    # clang会去寻找libclang_rt.xxx.a的静态链接库,即sanitizers
    # 除了ASAN,还可以添加UBSAN,TSAN等其他sanitizers
    clang -fsantize=address,fu
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值