fuzz心得

目标选择

fuzz普通程序

  • 可使用多个程序运行参数,提高代码覆盖率,增加发现错误机会
  • 找到合适的种子文件

fuzz库文件

  • 需要编写harness,调用库文件api,或者现成的API应用程序
  • 插桩时要将库文件和应用程序都考虑进来

fuzz网络程序

  • 将网络数据包保存成本地文件,作为输入提供给fuzz
如tcpdump抓包分析工具,使用了libpcap库提供的接口,将网络数据包转化为.pcap文件,再读入文件分析处理

目标构建

配置(configure)

  • autoreconf命令

    • 用于在configure命令前更新配置文件
    autoreconf -fvi
    
  • --prefix参数

    • 如果不指定 --prefix,则安装程序的可执行文件默认放在 /usr/local/bin ;库文件默认放在 /usr/local/lib ;配置文件默认放在/usr/local/etc ;其它的资源文件放在 /usr/local/share

    • 如果指定 --prefix比如: --prefix="/usr/local/keepalived" ,则此软件的所有文件都放到 /usr/local/keepalived 目录下

  • 指定编译器

CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure
  • 指定LLVM_CONFIG
export LLVM_CONFIG="llvm-config-11"	在configure命令前运行
  • 使用动态/静态链接
./configure --enable-shared=no	关闭动态链接
  • pkg_config_path环境变量

    • 用于指定编译时的链接库位置,如下所示
    ./configure PKG_CONFIG_PATH=$HOME/libexif/install/lib/pkgconfig
    
    • 此时pkgconfig路径下有libexif.pc文件,内含lib和include路径
  • 调试时关闭优化选项

CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure

编译(make)

  • -j4/-j8 使用4/8进程同时执行4/8条编译命令
  • ninja并行编译,可替代make,提升编译速度

编译器选择

  • AFL++的编译器选择顺序

image-20220701113157798

fuzz运行

运行参数

  • -x指定字典
  • -M和-S进行并行fuzz,只有主fuzz能加-D选项确定性变异

界面

  • corpus count:对应afl->queued_items, Total number of queued testcases

崩溃分析

漏洞分析

  • 崩溃现场查看调用栈、寄存器和内存
  • 在崩溃前函数下断点,看是什么操作导致了程序崩溃(断点函数可以选择bt的上层应用程序函数而不是库函数,尽量断到程序崩溃前一刻)

ASAN

  • AFL加上ASAN可以检测出更多错误,如UAF,缓冲区溢出,越界,内存泄露

  • 新版的LLVM和gcc都支持带ASAN编译

  • 启用ASAN:AFL_USE_ASAN=1 -fsanitize=address,configure、make、make install前都要加

  • AFL启用ASAN要解除内存限制,使用-m none

辅助工具

代码覆盖率展示

  • gcov是代码覆盖率测试工具,只能用于gcc编译程序,在源码目录下运行程序会生成gcov文件,打开显示代码覆盖率文本
  • lcov是gcov的图形化前端工具,编译时加入coverage选项,在源码目录下运行程序,可生成代码覆盖率报告html
  • 以lcov为例
1.编译时加入选项
CFLAGS="--coverage" LDFLAGS="--coverage" ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
2.重置以前的计数器,后面几步都需要在源码目录下运行
lcov --zerocounters --directory ./
3.生成包含零覆盖率的“基线”覆盖率数据文件
lcov --capture --initial --directory ./ --output-file app.info
4.运行待分析程序,可运行多次输入
tiffinfo -D demo.tiff
5.将当前覆盖率状态保存到app2.info文件
lcov --no-checksum --directory ./ --capture --output-file app2.info
6.生成html输出
genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info
  • 成功后会在html-coverage文件夹中创建代码覆盖率报告,打开html-coverage/index.html,可看到总覆盖率和各文件的行覆盖率和函数覆盖率

afl-whatsup

  • 用于查看每个fuzzer的运行状态和总体运行概况,加上-s选项只显示概况
afl-whatsup -s out_dir

afl-gotcpu

  • 用于查看每个核心的使用状态

问题

gdb插件问题,源代码显示问题

-s和种子文件

参数变异问题

posted @ 2022-10-04 20:55  z5onk0  阅读(253)  评论(0编辑  收藏  举报