前言
最近在学习fuzz,发现macos下有一些和windows下不同的点导致学的不是很顺畅,于是把我踩过的坑记录一下。
主要教程:https://github.com/antonio-morales/Fuzzing101 基本上就是跟着这个为主线的,下文简称fuzz101
前置知识点:
- Liunx操作
- docker 部署
- clash上网环境
接下来默认使用clash上网环境环境,并使用虚拟网卡(TUN模式)以保证网络连通性。
但是还是要一台x86_64 的windows作为备用机才好,毕竟教程是面向x86_64下的
一、环境安装
1.1 docker环境准备
推荐使用docker容器安装,因为fuzz过程中会编译大量的旧版本库,或者依赖于旧版本组建,使用docker用完就丢才是正确选择。
macos安装docker:https://docs.docker.com/desktop/setup/install/mac-install/
我这里使用的是M3,直接安装苹果芯片版,然后就是常规的安装docker.app,这里没啥坑点,做一遍流程就好
1.2 docker镜像拉取
这里我拉取的是AFL++
官方的,而不是fuzz101
的
-
拉取镜像(仅需做一次,之后不用做)。
docker pull aflplusplus/aflplusplus:latest
如果拉取失败检查是否clash上网环境。
-
启动 AFLPlusPlus docker 容器:
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
出现这样就是成功
-
更新软件索引
apt update apt upgrade -y apt install sudo -y
前面两句是老熟人了,这里解释一下为什么要安装
sudo
,因为有些ai生成出来的带一大堆sudo,懒得一个个删除,反正sudo加不加都无所谓就干脆安装上了。
1.3 一些常见问题的解决
建议先去跟着教程做,做到出问题再来看,这一块是用来解决问题的,和上文关联性不是很强,但是又经常遇到就放在这里快速查阅了
1.3.1 出现./configure
出错
报错大概长这样:
这是因为项目太老了(2008-01-08),没办法识别aarch64(arm64)
架构
解决方案:
更新config.guess
和config.sub
GNU
的config.guess
和config.sub
是独立维护的,可以替换掉旧版本。
下载最新版本:
wget -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess'
wget -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub'
覆盖源码目录里的:
cp config.guess config.sub ./config/
再运行:
./configure --prefix="替换为你的目标安装目录" --disable-shared
就能看到正常识别了
1.3.2 插桩编译
直接走一遍这个流程
# 回到源码目录
cd $HOME/fuzzing_tiff/tiff-4.0.4# 清理
make clean 2>/dev/null || true# 设置编译器为 afl-clang-lto(或 afl-gcc/afl-clang-fast/)
export CC=afl-clang-lto
export CXX=afl-clang-lto
export CFLAGS='-O2 -g -fno-omit-frame-pointer'
export CXXFLAGS="$CFLAGS"
export LDFLAGS=''# 重新 configure
./configure --prefix="替换为你的目标安装目录 --disable-shared# 编译并安装
make -j$(nproc)
make install
如果要启用ASan
,做设置编译器后做:
export AFL_USE_ASAN=1
AFL_USE_ASAN=1 ./configure --prefix="替换为你的目标安装目录" --disable-shared
AFL_USE_ASAN=1 make -j$(nproc)
AFL_USE_ASAN=1 make install
1.3.3 代码覆盖率检测
原文:
https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise 4
这里摘抄出命令部分方便快速使用
代码覆盖率
代码覆盖率是一种软件指标,用于显示每行代码被触发的次数。通过使用代码覆盖率,我们将了解模糊器已经到达代码的哪些部分,并可视化模糊测试过程。
首先,我们需要安装 lcov。我们可以使用以下命令来完成:
sudo apt install lcov
现在我们需要使用标志(编译器和链接器)重建 libTIFF:--coverage
rm -r 源码目录/install
cd 源码目录
make cleanCFLAGS="--coverage" LDFLAGS="--coverage" ./configure --prefix="替换为你的目标安装目录" --disable-shared
make
make install
然后,我们可以通过键入以下内容来收集代码覆盖率数据:
cd 源码目录
lcov --zerocounters --directory ./
lcov --capture --initial --directory ./ --output-file app.info#运行要分析的应用程序,按照具体命令来执行
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
lcov --no-checksum --directory ./ --capture --output-file app2.info
我将尝试解释每个命令:
lcov --zerocounters --directory ./
:重置以前的计数器lcov --capture --initial --directory ./ --output-file app.info
:返回包含每条检测线的零覆盖率的“基线”覆盖率数据文件$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
:运行要分析的应用程序。您可以使用不同的输入多次运行它lcov --no-checksum --directory ./ --capture --output-file app2.info
:将当前覆盖状态保存到app2.info
文件中- 最后,我们必须生成 HTML 输出:
genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info
- 如果一切顺利,则在文件夹中创建了代码覆盖率报告。只需打开文件,您应该会看到如下内容:
html-coverage./html-coverage/index.html
很显然,这和fuzz不冲突,可以配合fuzz使用(在环境目录分别指定两者),然后优先运行lcov,之后运行fuzz即可。
二、一些感念
虽然说概念又多又杂,但是还是要理解一些非常重要的,至少知道怎么去问ai