定向模糊测试工具windranger的使用教程

本文主要介绍发表于ICSE 2022的一个定向模糊测试工具windranger的使用方法。

论文全称是:WindRanger: A Directed Greybox Fuzzer driven by Deviation Basic Blocks
工具介绍网址:https://sites.google.com/view/windranger-directed-fuzzing/

docker安装

docker pull ardu/windranger

如果要本地安装,可以利用docker history之类的命令逆向出所需的依赖,然后安装。

官方示例

首先基于该镜像创建一个docker 容器

docker run -ti --privileged --cpus=1 ardu/windranger /bin/bash

进入容器后,实际上可以看到example文件夹中,作者给出了示例脚本。下面详细介绍下脚本中各个命令的含义。

git clone https://github.com/libming/libming.git libming-CVE-2018-8807
cd libming-CVE-2018-8807
git checkout b72cc2f
./autogen.sh
mkdir build; cd build
CC=~/gllvm/gclang CXX=~/gllvm/gclang++ ../configure --disable-shared
make clean; make
cd util; ~/gllvm/get-bc swftophp
cd ../
mkdir fuzz; cd fuzz
cp ../util/swftophp.bc .
echo $'decompile.c:398' > targets
~/windranger/instrument/bin/cbi --targets=targets swftophp.bc
~/windranger/fuzz/afl-clang-fast swftophp.ci.bc -lpng16 -lm -lz -lfreetype -o swftophp.ci
mkdir in; wget -P in http://condor.depaul.edu/sjost/hci430/flash-examples/swf/bumble-bee1.swf
AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 AFL_SKIP_CPUFREQ=1 ~/windranger/fuzz/afl-fuzz -d -i in/ -o out ./swftophp.ci @@

下载待测软件libming,并切换到有漏洞的分支。

git clone https://github.com/libming/libming.git libming-CVE-2018-8807
cd libming-CVE-2018-8807
git checkout b72cc2f

接着使用gllvm工具将软件编译为字节码形式。

mkdir build; cd build
CC=~/gllvm/gclang CXX=~/gllvm/gclang++ ../configure --disable-shared
make clean; make 
cd util; ~/gllvm/get-bc swftophp # 提取字节码,在swftophp所在目录生成swftophp.bc文件

创建fuzz文件夹,需要注意使用afl-fuzz命令的时候需要在这个文件夹下。因为afl-fuzz硬编码了文件路径,会在当前目录下查找插桩生成的distance.txt文件夹。所以如果不在该目录下fuzz,会报distance.txt不存在的错误。

mkdir fuzz; cd fuzz
cp ../util/swftophp.bc .
echo $'decompile.c:398' > targets #设置定向的目标
~/windranger/instrument/bin/cbi --targets=targets swftophp.bc # 静态分析,计算距离等
~/windranger/fuzz/afl-clang-fast swftophp.ci.bc -lpng16 -lm -lz -lfreetype -o swftophp.ci #用afl-clang-fast将字节码编译为二进制文件

in文件是放置初始种子。然后就可以开始测试swftophp文件了。

  • AFL_SKIP_CPUFREQ=1:这会跳过CPU的扩展策略。如果不想更改默认设置(比如没有root权限)的话,这个挺有用。代价是一些性能损失。
  • AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1:If you are Jakub, you may need AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES. Others need not apply, unless they also want to disable the /proc/sys/kernel/core_pattern check(来自AFL++的文档)
mkdir in; wget -P in http://condor.depaul.edu/sjost/hci430/flash-examples/swf/bumble-bee1.swf
AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 AFL_SKIP_CPUFREQ=1 ~/windranger/fuzz/afl-fuzz -d -i in/ -o out ./swftophp.ci @@

如果要批量跑的话,需要设置下面的环境变量为1,让afl-fuzz跑的时候不绑定在一个核上。

export AFL_NO_AFFINITY=1

测试libtiff

上面介绍完了官方给的样例。下面用该工具来测试下另一个库libtiff。其实整体流程是一样的。

TARGET=${1} #TARGET需要自己事先定义好行号,如"tiffcrop.c:564"
ARGS=${2} # tiffcrop 的测试参数,比如"-R90 @@ tmp.out"
#VERSION=${3}
PROGRAM=/home/SVF-tools/libtiff
WORK="$PROGRAM/work"
rm -rf "$WORK"
mkdir -p "$WORK"
mkdir -p "$WORK/lib" "$WORK/include"

# 1.下载libtiff
git clone https://gitlab.com/libtiff/libtiff.git
cd libtiff
pushd $PROGRAM
#git checkout $VERSION
./autogen.sh
CC=~/gllvm/gclang CXX=~/gllvm/gclang++ ./configure --disable-shared --prefix="$WORK"
make clean; make
make install
## 获取待测程序tiffcrop的字节码
cd tools;~/gllvm/get-bc tiffcrop
popd
#运行完静态分析后,可以在当前目录下发现多了一些文本文件,比如distance.txt等
~/windranger/instrument/bin/cbi --targets=$TARGET $PROGRAM/tools/tiffcrop.bc
# 需要把一些库带上编译。如果报undefined reference的错误,就是少了一些链接库
~/windranger/fuzz/afl-clang-fast $PROGRAM/tools/tiffcrop.ci.bc $WORK/lib/libtiffxx.a $WORK/lib/libtiff.a -lz -lm -ljpeg -Wl,-Bstatic -llzma -Wl,-Bdynamic -o $PROGRAM/tools/tiffcrop.ci

export AFL_NO_AFFINITY=1 ## 不绑定一个核
# 需要提前把libitff的初始种子放到in文件夹中
~/windranger/fuzz/afl-fuzz -i /home/SVF-tools/temp/in/ -o ~/temp/out $PROGRAM/tools/tiffcrop.ci $ARGS

跑完后,可以用afl-cov等软件分析跑的结果,这里就不再赘述。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值