sudo apt install meson ninja-build valgrind clang-20 binutils libglib-2.0-dev cmake python3-venv
安装 Rust 工具链。
将 libafl 克隆到 fuzzer 目录旁边,并检出正确的提交
git clone https://github.com/AFLplusplus/LibAFL.git libafl/
cd libafl
git checkout 6e7ea0da898b63c5098f84c0908a8c427a5c73ff
git apply ../patches/libafl/module_snapshot.patch
git apply ../patches/libafl/snapshot.patch
git apply ../patches/libafl/libafl_bolts_wide.patch
git apply ../patches/libafl/libafl_targets_simd.patch
cd ..
git clone https://gitlab.freedesktop.org/slirp/libslirp.git
cd libslirp
git checkout 4ddbcd5cc4f7a14473ebfc1dcdd1afb4edf96908
git apply ../patches/libslirp/meson_fuzzing.patch
git apply ../patches/libslirp/meson_options.patch
git apply ../patches/libslirp/meson.patch
git apply ../patches/libslirp/qemu_target.patch
git apply ../patches/libslirp/tcp_input.patch
git apply ../patches/libslirp/tcp_outpt.patch
CC=clang-20 CXX=clang++-20 meson build
ninja -C build
ret 指令的偏移量要么在 IDA/Binja/ghidra 中打开二进制文件,找到 cksum 函数中 ret 指令的偏移量,要么
nm -n build/fuzzing/qemu-target | grep cksum
objdump -d --disassemble=cksum build/fuzzing/qemu-target | grep -E '\bret[qwl]?\b'
用你找到的第二个偏移量减去第一个偏移量,并将该值替换到 fuzzer/src/libslirp/hooks.rs:200 中
cd ../fuzzer
cargo +nightly build --release
注意:根据你的 llvm 安装情况,你可能需要指定 LLVM_CONFIG_PATH 环境变量。
cp ../libslirp/build/fuzzing/qemu-target ./target/release/
cd target/release
mkdir corpus
RUST_LOG=warn ./slirp-snapshots-stateful-fuzzer
警告:此功能在虚拟机共享文件夹或网络挂载中无法工作。
执行步骤 6 以修改 offline_reproducer/runner/src/libslirp/hooks.rs:17 中的偏移量。然后编译 runner 和 driver
cd runner
cargo +nightly-2026-06-11 build --release
cp target/release/offline_runner ../../fuzzer/target/release
cp target/release/x86_64-unknown-linux-gnu/release/libafl_qemu_asan_host.so ../../fuzzer/target/release
cd ../driver
cargo +nightly build --release
cp target/release/offline_driver ../../fuzzer/target/release
cd ../../fuzzer/target/release
mkdir corpus coverage repro_files
在一个终端中运行 driver,然后在另一个终端中运行 fuzzer。
RUST_LOG=warn ./offline_driver
RUST_LOG=warn ./slirp-snapshots-stateful-fuzzer
覆盖率文件将存储在 coverage 文件夹中,可以使用 bncov(binja)/lighthouse(ida/binja)/lightkeeper(ghidra)打开。如有必要,可以使用 drcov-merge 进行合并。