linux下fuzz初试
字数 1050 2025-08-20 18:18:04
Linux下Fuzz测试工具AFL和Syzkaller使用指南
一、AFL (American Fuzzy Lop) 使用教程
1. AFL简介
AFL是一种通过提供随机生成的输入来测试软件,搜索能导致程序崩溃的输入的fuzz测试工具。特点包括:
- 通过对源码进行重新编译时进行插桩的方式自动产生测试用例
- 较低的性能消耗
- 高效的fuzzing策略和最小化技巧
- 支持对有源码和无源码程序的测试(无源码需要QEMU支持)
2. AFL安装步骤
- 从官网下载源码压缩包并解压
- 编译安装:
make sudo make install - 配置coredumps输出:
echo core > /proc/sys/kernel/core_pattern
3. AFL测试示例
3.1 编译测试程序
对于有源码的程序,使用afl代替gcc/clang编译:
C程序:
CC=/path/to/afl/afl-gcc ./configure
make clean all
C++程序:
CXX=/path/to/afl/afl-g++ ./configure
make clean all
3.2 示例测试程序
#include <stdio.h>
#include <signal.h>
int func(char *data) {
if(data[0] == 'A')
raise(SIGSEGV);
else
printf("ok\n");
return 0;
}
int main(int argc, char *argv[]) {
char buf[233] = {0};
FILE *input = NULL;
input = fopen(argv[1], "r");
if(input != 0) {
fscanf(input, "%s", &buf);
printf("buf is %s\n", buf);
func(buf);
fclose(input);
} else
printf("error!");
return 0;
}
3.3 编译和运行
- 使用afl-gcc编译:
./afl-gcc test.c -o test - 运行fuzz测试:
./afl-fuzz -i testcase -o Testout ./test @@testcase:输入目录Testout:输出目录@@:表示从文件中读取输入
二、Syzkaller内核模糊测试教程
1. Syzkaller简介
Syzkaller是一款无监督的覆盖引导内核模糊器,支持多种操作系统内核测试。
2. 准备工作
2.1 编译内核
需要开启以下内核选项:
CONFIG_KCOV=y
CONFIG_DEBUG_INFO=y
CONFIG_KASAN=y
CONFIG_KASAN_INLINE=y
2.2 安装Go语言环境
- 下载并安装Go:
wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz tar -xf go1.8.1.linux-amd64.tar.gz mv go goroot - 设置环境变量:
export GOROOT=`pwd`/goroot export PATH=$GOROOT/bin:$PATH mkdir gopath export GOPATH=`pwd`/gopath
2.3 安装Syzkaller
go get -u -d github.com/google/syzkaller/...
cd gopath/src/github.com/google/syzkaller/
mkdir workdir
make
3. 创建Debian-wheezy镜像
- 安装debootstrap:
sudo apt-get install debootstrap - 使用脚本创建镜像:
完成后会生成:cd gopath/src/github.com/google/syzkaller/tools/ ./create-image.sh- wheezy.id_rsa(私钥)
- wheezy.id_rsa.pub(公钥)
- wheezy.img(镜像文件)
4. 启动QEMU虚拟机
设置环境变量:
export KERNEL=/home/edvison/linux-kernel
export IMG=/home/edvison/gopath/src/github.com/google/syzkaller/tools
启动脚本:
qemu-system-x86_64 \
-kernel $KERNEL/arch/x86_64/boot/bzImage \
-append "console=ttyS0 root=/dev/sda debug earlyprintk=serial slub_debug=QUZ"\
-hda $IMG/wheezy.img \
-net user,hostfwd=tcp::10021-:22 -net nic \
--nographic \
-enable-kvm \
-m 2G \
-smp 2 \
-pidfile vm.pid \
2>&1 | tee vm.log
停止QEMU实例:
sudo kill $(cat vm.pid)
5. 配置SSH无密码登录
- 生成SSH密钥:
ssh-keygen -t rsa - 将公钥复制到虚拟机
- 修改虚拟机SSH配置(/etc/ssh/sshd_config):
PermitRootLogin without-password RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile /root/.ssh/id_rsa.pub RhostsRSAAuthentication yes PermitEmptyPasswords no PasswordAuthentication no UsePAM no - 重启SSH服务:
/etc/init.d/ssh restart
6. 传输Syzkaller二进制文件
如果遇到密钥格式问题,使用dropbearconvert转换:
sudo apt install dropbear
dropbearconvert openssh dropbear id_rsa id_rsa_dropbear
scp -P 10021 -i id_rsa_dropbear -r $(GOPATH)/bin root@127.0.0.1
7. 启动Syzkaller
- 创建配置文件my.cfg
- 运行:
./bin/syz-manager -config=my.cfg - 在浏览器访问
127.0.0.1:10233查看调试信息
三、关键点总结
- AFL适用于用户态程序测试,Syzkaller适用于内核测试
- AFL需要配置coredump输出方式
- Syzkaller需要特定的内核编译选项
- 虚拟机SSH配置和无密码登录是关键步骤
- 两种工具都需要准备测试环境和样本
通过以上步骤,可以成功搭建并使用AFL和Syzkaller进行模糊测试。