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++的编译器选择顺序
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和种子文件
参数变异问题