SKILL: Week 2: Finding Vulnerabilities Through Fuzzing
SkillFiles & storageGives your agent expert offensive security methods for attacks like SQL injection, shellcode, and exploit development.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the SKILL: Week 2: Finding Vulnerabilities Through Fuzzing skill
About this capability
claude-red is a curated library of offensive security skills designed for the Claude skills system. Each skill is a structured SKILL.md file that primes Claude with expert-level methodology for a specific attack surface — from SQLi to shellcode, EDR evasion to exploit development.
What this skill tells your AI
The instructions your AI receives, as published by snailsploit/claude-red in Skills/fuzzing/offensive-fuzzing-course/SKILL.md and read by ahel’s review.
Metadata
- Skill Name: fuzzing-course
- Folder: offensive-fuzzing-course
- Source: https://github.com/SnailSploit/offensive-checklist/blob/main/2-fuzzing.md
Description
Week 2 of the exploit development curriculum. Covers fuzzing methodology: target selection, corpus generation, coverage-guided fuzzing with AFL++/libFuzzer, structured fuzzing, and triage/deduplication. Use when setting up fuzz campaigns, selecting harness strategies, or triaging fuzzer output.
Trigger Phrases
Use this skill when the conversation involves any of:
fuzzing curriculum, AFL++, libFuzzer, coverage-guided fuzzing, corpus generation, harness, fuzz target, mutation, triage, crash dedup, week 2, exploit dev course
Instructions for Claude
When this skill is active:
- Load and apply the full methodology below as your operational checklist
- Follow steps in order unless the user specifies otherwise
- For each technique, consider applicability to the current target/context
- Track which checklist items have been completed
- Suggest next steps based on findings
Full Methodology
Week 2: Finding Vulnerabilities Through Fuzzing
Overview
created by AnotherOne from @Pwn3rzs Telegram channel.
This document is Week 2 of a multi‑week exploit development course, focusing on discovering vulnerabilities through fuzzing techniques and analyzing the crashes to determine exploitability.
Last week we studied vulnerability classes through real-world examples. This week we'll learn to find these vulnerabilities ourselves using fuzzing - the automated technique that has discovered thousands of critical security bugs in production software.
Fuzzing can feel a bit front‑loaded: you may spend time wiring harnesses and running campaigns without immediately finding exciting new bugs, especially on hardened or well‑tested targets. That’s normal, and it's one reason the next week on patch diffing often feels more directly "practical" — many companies already run large fuzzing setups and need people who can understand and exploit the bugs those systems uncover. Still, working through this week is important: it teaches you how fuzzers actually discover real vulnerabilities, so when you later triage crashes or study patches, you'll have a solid intuition for how those bugs were found and how to reproduce them.
Prerequisites
Before starting this week, ensure you have:
- A Linux virtual machine (Ubuntu 24.04 recommended) with at least 8GB RAM and 8 cpu cores
- Basic understanding of C/C++ programming
- Familiarity with command-line tools and debugging (GDB basics)
- Understanding of memory corruption vulnerabilities (from Week 1)
Day 1: Introduction to Fuzzing
- Goal: Understand the fundamentals of fuzzing and get hands-on experience with
AFL++. - Activities:
- Reading: "Fuzzing for Software Security Testing and Quality Assurance" by
Ari Takanen(From 1.3.2 to 1.3.8 and 2.4.1 to 2.7.5). - Online Resource:
- Fuzzing Book by
Andreas Zeller- Read "Introduction" and "Fuzzing Basics." AFL++Documentation - Follow the quick start guide.- Interactive Module to Learn Fuzzing
- Fuzzing Book by
- Real-World Context:
- Google OSS-Fuzz: Finding 36,000+ bugs across 1,000+ projects
- AFL Success Stories - Real vulnerabilities found by AFL
- Exercise:
- Set up a Linux virtual machine (VM) with the necessary tools installed, including compilers and debuggers
- Run
AFL++on a C program - If possible, use or write a small C program that contains a simple version of one of the Week 1 vulnerability classes (for example, a stack buffer overflow or integer overflow) so you can see fuzzing rediscover it.
- Reading: "Fuzzing for Software Security Testing and Quality Assurance" by
# Setting up AFL++
# Install build dependencies
sudo apt update
sudo apt install -y build-essential gcc-13-plugin-dev cpio python3-dev libcapstone-dev \
pkg-config libglib2.0-dev libpixman-1-dev automake autoconf python3-pip \
ninja-build cmake git wget python3.12-venv meson
# Install LLVM (check latest version at https://apt.llvm.org/)
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 19 all
# Verify LLVM installation
clang-19 --version
llvm-config-19 --version
# Install Rust (required for some AFL++ components)
curl --proto '=https' --tlsv1.2 -sSf "https://sh.rustup.rs" | sh
source ~/.cargo/env
# Build and install AFL++
mkdir -p ~/soft && cd ~/soft
git clone --depth 1 https://github.com/AFLplusplus/AFLplusplus.git
cd AFLplusplus
# NOTE: unicorn support might fail(you need to add the env or run ./build_unicorn_support.py and fix issues yourself)
make distrib
sudo make install
# Verify installation
which afl-fuzz
afl-fuzz --version
# Phase 1: Simple crash example
cd ~/ && mkdir -p tuts && cd tuts
git clone --branch main --depth 1 https://github.com/alex-maleno/Fuzzing-Module.git
cd Fuzzing-Module/exercise1 && mkdir -p build && cd build
# Compile with AFL++ instrumentation
CC=/usr/local/bin/afl-clang-fast CXX=/usr/local/bin/afl-clang-fast++ cmake ..
make
# Create seed inputs
cd .. && mkdir -p seeds && cd seeds
for i in {0..4}; do
dd if=/dev/urandom of=seed_$i bs=64 count=10 2>/dev/null
done
# Run AFL++ fuzzer
cd ../build
echo core | sudo tee /proc/sys/kernel/core_pattern
afl-fuzz -i ../seeds/ -o out -m none -d -- ./simple_crash
# Expected output: AFL++ interface showing coverage, crashes, etc.
# Look for crashes in out/crashes/ directory
# Phase 2: Medium complexity example
cd ~/tuts/Fuzzing-Module/exercise2 && mkdir -p build && cd build
CC=/usr/local/bin/afl-clang-lto CXX=/usr/local/bin/afl-clang-lto++ cmake ..
make
cd .. && mkdir -p seeds && cd seeds
for i in {0..4}; do
dd if=/dev/urandom of=seed_$i bs=64 count=10 2>/dev/null
done
cd ../build
afl-fuzz -i ../seeds/ -o out -m none -d -- ./medium
Success Criteria:
- AFL++ compiles and installs without errors
- Both fuzzing sessions start successfully
- You can see the AFL++ status screen showing paths found, crashes, etc.
- Check
out/crashes/directory for any discovered crashes
Troubleshooting:
- If
afl-clang-fastnot found: Check/usr/local/bin/is in PATH - If compilation fails: Ensure LLVM 19 is properly installed (
clang-19 --version) - If fuzzer doesn't start: Check CPU scaling governor (
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor)
Real-World Impact: AFL++ Finding CVE-2024-47606 (GStreamer)
Background: AFL++ and similar fuzzers are actively used to find vulnerabilities in production software. Let's examine a real case from Week 1.
Case Study - CVE-2024-47606 (GStreamer Signed-to-Unsigned Integer Underflow):
- Discovery Method: Continuous fuzzing campaigns by security researchers using AFL++ on media parsers
- The Bug: GStreamer's
qtdemux_parse_theora_extensionhad a signed integer underflow that became massive unsigned value - Attack Surface: MP4/MOV files processed automatically by browsers, media players, messaging apps
- Fuzzing Approach:
- Target: GStreamer's QuickTime demuxer (
qtdemux) - Seed corpus: Valid MP4 files from public datasets
- Instrumentation: Compiled with AFL++ and AddressSanitizer
- Mutation strategy: Structure-aware (understanding MP4 atoms)
- Result: Heap buffer overflow crash after ~48 hours of fuzzing
- Target: GStreamer's QuickTime demuxer (
Why Fuzzing Found It:
- Rare Input Combination: Required specific Theora extension size values that underflow
- Static Analysis Limitation: Signed-to-unsigned conversion buried in complex parsing logic
- Code Review Miss: Integer arithmetic looked correct without considering negative values
- Automated Testing Gap: Unit tests didn't cover malformed Theora extensions
The Discovery Process:
# 1) Generate a structured MP4 seed corpus (GitHub Security Lab generator)
cd ~/tuts && git clone --depth 1 https://github.com/github/securitylab.git
cd ~/tuts/securitylab/Fuzzing/GStreamer
make
mkdir -p corpus/mp4
./generator -o corpus/mp4
# 2) Build a vulnerable GStreamer (< 1.24.10) with AFL++ + ASan
cd ~/tuts
git clone --branch 1.24.9 --depth 1 https://gitlab.freedesktop.org/gstreamer/gstreamer.git
cd gstreamer
export CC=afl-clang-fast
export CXX=afl-clang-fast++
export CFLAGS="-O1 -g"
export CXXFLAGS="-O1 -g"
sudo apt-get install -y flex bison
# NOTE: this might take a while so you can just build parts of it, not all
meson setup build-afl --buildtype=debug -Db_sanitize=address
ninja -C build-afl -j"$(nproc)"
# 3) Fuzz the QuickTime demuxer pipeline with AFL++
mkdir -p findings
# NOTE: you can fuzz other binaries as well to find bugs
echo core | sudo tee /proc/sys/kernel/core_pattern
afl-fuzz -i ~/tuts/securitylab/Fuzzing/GStreamer/corpus/mp4 \
-o findings -m none -- \
./build-afl/subprojects/gstreamer/tools/gst-launch-1.0 \
filesrc location=@@ ! qtdemux ! fakesink
# Typical outcome after hours of fuzzing:
# - ASan crash inside qtdemux_parse_theora_extension()
# - heap-buffer-overflow in gst_buffer_fill() when copying attacker-controlled data
# Root cause (CVE-2024-47606 / GHSL-2024-166, fixed in 1.24.10):
# - 32-bit signed 'size' underflows → huge unsigned value
# - _sysmem_new_block() overflows when adding alignment/header → tiny (0x89-byte) allocation
# - memcpy() writes the huge size, corrupting GstMapInfo and allocator function pointers
Key Insight: Fuzzing excels at finding edge cases in complex parsers that humans would never manually test. The combination of:
- Coverage-guided mutation (AFL++ exploring new code paths)
- AddressSanitizer (detecting memory corruption immediately)
- Persistent fuzzing (running for days/weeks)
...makes it more effective than manual testing for this vulnerability class.
Key Takeaways
- Fuzzing finds real vulnerabilities: Not just theoretical crashes, but exploitable bugs in production software
- Coverage-guided fuzzing is powerful: AFL++ intelligently explores code paths rather than random mutation
- Sanitizers are essential: ASAN, UBSAN turn subtle bugs into immediate crashes
- Time matters: Many bugs require hours/days of fuzzing to discover
- Seed corpus quality affects results: Starting with valid inputs helps reach deeper code paths
Discussion Questions
- Why did fuzzing find
CVE-2024-47606when code review and unit testing didn't? - What advantages does coverage-guided fuzzing have over purely random fuzzing?
- How do sanitizers (ASAN, UBSAN) enhance fuzzing effectiveness?
- What types of vulnerabilities are fuzzing best suited to find? What types does it miss?
- How can seed corpus selection impact fuzzing effectiveness?
Day 2: Continue Fuzzing with AFL++
- Goal: Understand and apply advanced fuzzing techniques.
- Activities:
- Reading: Continue with "Fuzzing for Software Security Testing and Quality Assurance" (From 3.3 to 3.9.8).
- Real-World Examples:
- AFL++ finds CVE-2020-9385 in ZINT Barcode Generator - Stack buffer overflow discovered through fuzzing
- AFL++ Fuzzing in Depth - How to effectively use afl++
- Suricata IDS CVE-2019-16411 - Out-of-bounds read found via fuzzing
- Exercise:
- Experiment with different
AFL++options (for example, dictionary-based fuzzing, persistent mode). - Running
AFL++with a real-world application like a file format parser to mimic real-world scenarios. - Optionally, target an image or media parser so you can practice finding heap overflows and out-of-bounds reads similar to the libWebP and GStreamer bugs from Week 1.
- Experiment with different
# Fuzzing a image parser (dlib imglab)
# NOTE: you can pull older versions to guarantee vulnerable code paths
cd ~/tuts && git clone --depth 1 --branch v19.24.6 https://github.com/davisking/dlib.git
cd dlib/tools/imglab && mkdir -p build && cd build
# Configure sanitizers for better crash detection
export AFL_USE_UBSAN=1
export AFL_USE_ASAN=1
export ASAN_OPTIONS="detect_leaks=1:abort_on_error=1:allow_user_segv_handler=0:handle_abort=1:symbolize=0"
# Install dependencies
sudo apt install -y libx11-dev libavdevice-dev libavfilter-dev libavformat-dev libavcodec-dev \
libswresample-dev libswscale-dev libavutil-dev libjxl-dev libjxl-tools
# Compile with AFL++ and sanitizers
cmake -DCMAKE_C_COMPILER=afl-clang-fast \
-DDLIB_NO_GUI_SUPPORT=0 \
-DCMAKE_CXX_COMPILER=afl-clang-fast++ \
-DCMAKE_CXX_FLAGS="-fsanitize=address,leak,undefined -g" \
-DCMAKE_C_FLAGS="-fsanitize=address,leak,undefined -g" ..
make -j$(nproc)
# Prepare seed corpus
mkdir -p fuzz/image/in
cp ../../../examples/faces/testing.xml fuzz/image/in/
# TODO: try to improve the fuzzing speed using https://aflplus.plus/docs/fuzzing_in_depth/#i-improve-the-speed
# Run AFL++ in parallel mode (Master + Slave instances)
# Terminal 1: Master instance
echo core | sudo tee /proc/sys/kernel/core_pattern
afl-fuzz -i fuzz/image/in -o fuzz/image/out -M Master -- ./imglab --stats @@
# Terminal 2: Slave instance (for parallel fuzzing)
afl-fuzz -i fuzz/image/in -o fuzz/image/out -S Slave1 -- ./imglab --stats @@
# Install crash analysis tools
sudo apt install -y gdb python3-pip valgrind
wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/py
echo "source ~/.gdbinit-gef.py" >> ~/.gdbinit
# Minimize a crashing input while preserving the crashing behavior (afl-tmin)
# NOTE: there might be no crashes, either fuzz longer or go back to an older tag
CRASH=$(ls ~/tuts/dlib/tools/imglab/build/fuzz/image/out/Master/crashes/id* 2>/dev/null | head -n1)
afl-tmin -i "$CRASH" -o ~/tuts/dlib/tools/imglab/build/fuzz/image/out/Master/crashes/minimized_crash -- ./imglab --stats @@
# Cluster and triage crashes with casr-afl (from CASR tools)
# NOTE: there might be no crashes, either fuzz longer or go back to an older tag
CASR_URL="https://github.com/ispras/casr/releases/latest/download/casr-x86_64-unknown-linux-gnu.tar.xz"
INSTALL_DIR="$HOME/.local"
mkdir -p "$INSTALL_DIR"
wget -O "$INSTALL_DIR/casr-x86_64-unknown-linux-gnu.tar.xz" "$CASR_URL"
tar -xJf "$INSTALL_DIR/casr-x86_64-unknown-linux-gnu.tar.xz" -C "$INSTALL_DIR"
export PATH="$INSTALL_DIR/casr-x86_64-unknown-linux-gnu/bin:$PATH" # provides casr-afl
# Now run casr-afl on the AFL++ output directory
casr-afl -i ~/tuts/dlib/tools/imglab/build/fuzz/image/out/Master -o ~/tuts/dlib/tools/imglab/build/fuzz/image/out/Master_casr_reports
Expected Outputs:
- AFL++ status screen showing increasing coverage
- Crashes appearing in
fuzz/image/out/Master/crashes/orfuzz/image/out/Slave1/crashes/ - AddressSanitizer reports for memory corruption bugs
What to Look For:
- Crashes with
SIGSEGVorSIGABRTsignals - AddressSanitizer reports showing heap buffer overflows, use-after-free, etc.
- Unique crash signatures (different stack traces)
Troubleshooting:
- If compilation fails: Check that all dependencies are installed
- If no crashes found: Let fuzzer run longer (hours/days for real targets)
- If crashes are false positives: Review ASAN options and adjust
Real-World Campaign: Fuzzing Image Parsers
Case Study - CVE-2023-4863 (libWebP Heap Buffer Overflow):
From Week 1, you learned about this critical vulnerability. Let's understand how fuzzing could have (and did) discover similar bugs.
- The Target: libWebP image decoder, used by Chrome, Firefox, and countless applications
- Why It's Fuzzing-Friendly:
- Pure input-to-output: takes file bytes, produces image
- No network/filesystem dependencies
- Deterministic execution
- Complex parsing logic with many edge cases
Fuzzing Campaign Strategy:
# Real-world fuzzing setup for image parsers
cd ~/tuts && git clone --depth 1 --branch 1.0.0 https://chromium.googlesource.com/webm/libwebp
cd libwebp && sudo apt-get -y install gcc make autoconf automake libtool
# Compile with AFL++ and all sanitizers
export CC=afl-clang-fast
export CXX=afl-clang-fast++
export AFL_USE_ASAN=1
export AFL_USE_UBSAN=1
export CFLAGS="-fsanitize=address,undefined -g"
export CXXFLAGS="-fsanitize=address,undefined -g"
./autogen.sh
./configure
make -j$(nproc)
# Create fuzzing harness
cat > fuzz_webp.c << 'EOF'
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <webp/decode.h>
#include <webp/types.h>
int main(int argc, char **argv) {
if (argc < 2) return 1;
FILE *f = fopen(argv[1], "rb");
if (!f) return 1;
fseek(f, 0, SEEK_END);
size_t size = ftell(f);
fseek(f, 0, SEEK_SET);
uint8_t *data = malloc(size);
fread(data, 1, size, f);
fclose(f);
// Fuzz target: decode WebP image
int width, height;
uint8_t *output = WebPDecodeRGBA(data, size, &width, &height);
if (output) free(output);
free(data);
return 0;
}
EOF
# Compile fuzzing harness
afl-clang-fast -I./src -o fuzz_webp fuzz_webp.c \
-L./src/.libs -lwebp -fsanitize=address,undefined -g
# Collect seed corpus (valid WebP images)
mkdir -p ~/tuts/libwebp/seeds
# Download some WebP test images
wget -q -O ~/tuts/libwebp/seeds/test1.webp https://www.gstatic.com/webp/gallery/1.webp
wget -q -O ~/tuts/libwebp/O seeds/test2.webp https://www.gstatic.com/webp/gallery/2.webp
wget -q -O ~/tuts/libwebp/O seeds/test3.webp https://www.gstatic.com/webp/gallery/3.webp
# Run AFL++ fuzzer
export LD_LIBRARY_PATH=./src/.libs:$LD_LIBRARY_PATH
afl-fuzz -i seeds/ -o findings/ -m none -d -- ./fuzz_webp @@
# Real campaigns run for weeks. OSS-Fuzz runs 24/7.
# Expected: Crashes in findings/crashes/ directory
# Analysis: ASAN reports showing heap buffer overflows
What Fuzzing Discovered:
In the real CVE-2023-4863 case:
- Initial crash: Heap buffer overflow in
BuildHuffmanTable() - Root cause: Malformed Huffman coding data caused out-of-bounds write
- ASAN output: Immediate detection of corruption with exact location
- Exploitability: Function pointer hijack possible via heap corruption
Why This Bug Survived Testing:
- Unit tests: Covered valid WebP files, not malformed Huffman tables
- Static analysis: Complex pointer arithmetic hard to verify
- Code review: Bounds check looked correct in isolation
- Fuzzing advantage: Generated millions of mutated WebP files, including edge cases
Parallel Fuzzing for Speed:
# Real campaigns use multiple CPU cores
# Master instance
afl-fuzz -i seeds/ -o findings/ -M master -m none -- ./fuzz_webp @@
# Slave instances (in separate terminals or tmux)
for i in {1..5}; do
afl-fuzz -i seeds/ -o findings/ -S slave$i -m none -- ./fuzz_webp @@ &
done
# Check status
afl-whatsup findings/
# Expected output:
# Master: 1234 paths, 5 crashes
# Slave1: 987 paths, 2 crashes
# Slave2: 1056 paths, 3 crashes
# ... (instances share corpus and findings)
Corpus Management and Seed Selection
Why Seed Quality Matters:
# Bad seed corpus: random bytes
dd if=/dev/urandom of=bad_seed.webp bs=1024 count=10
# Result: AFL++ spends time on invalid inputs that fail early parsing
# Coverage: Only reaches format validation code
# Good seed corpus: valid WebP files
# Result: AFL++ mutates valid structure, reaches deep parsing logic
# Coverage: Explores Huffman decoding, color space conversion, filters
Building Effective Seed Corpus:
# 1. Collect diverse valid inputs
mkdir -p corpus
# - Different sizes (small, medium, large)
# - Different features (lossy, lossless, animated)
# - Different color spaces (RGB, YUV, alpha channel)
wget -r -l1 -A webp https://www.gstatic.com/webp/gallery/ -P corpus/
# 2. Minimize corpus (remove redundant files)
afl-cmin -i corpus/ -o corpus_min/ -- ./fuzz_webp @@
# 3. Minimize individual files (shrink while preserving coverage)
mkdir -p corpus_tmin
for f in corpus_min/*; do
afl-tmin -i "$f" -o "corpus_tmin/$(basename $f)" -- ./fuzz_webp @@
done
# Result: Smaller corpus = faster fuzzing iterations
# Original: 50 files, 5MB total
# Minimized: 15 files, 500KB total (same coverage)
Key Takeaways
- Image parsers are prime fuzzing targets: Complex, widely-deployed, handle untrusted input
- OSS-Fuzz prevents 0-days: Continuous fuzzing finds bugs before attackers
- Parallel fuzzing scales linearly: 8 cores = ~8x throughput
- Corpus quality > corpus size: Minimized, diverse seeds outperform large random corpus
- Dictionaries accelerate discovery: Format-aware tokens reach deeper code paths faster
Discussion Questions
- Why are image/media parsers particularly well-suited for fuzzing compared to other software?
- How does corpus minimization improve fuzzing efficiency without losing coverage?
- What trade-offs exist between fuzzing speed (lightweight instrumentation) and bug detection (heavy sanitizers)?
- Why did OSS-Fuzz find bugs in libwebp that years of production use didn't reveal?
- How can you determine if a fuzzing campaign has reached diminishing returns and should target a different component?
- How can you improve fuzzing speed?
Day 3: Introduction to Google FuzzTest
- Goal: Understand in-process fuzzing with FuzzTest and how to turn unit tests into coverage-guided fuzzers that actually find memory corruption bugs.
- Activities:
- Reading: Continue with "Fuzzing for Software Security Testing and Quality Assurance" (From 4.2.1 to 4.4).
- Online Resources:
- Google FuzzTest - Read the README and "Getting Started".
- Property-based fuzzing vs example-based testing - Short motivation for FuzzTest.
- Exercises:
- Set up FuzzTest in a small CMake project and run a trivial property-based test.
- Use FuzzTest + AddressSanitizer to rediscover a simple heap buffer overflow (Week 1 vulnerability class).
- Extend the fuzz target to cover a small parser-style function, similar to the image/format parsers from Days 1–2.
Why FuzzTest in a vulnerability-focused course?
FuzzTest is a unit-test-style, in-process fuzzing framework from Google that:
- Integrates with GoogleTest: You write
TESTandFUZZ_TESTside by side in the same file. - Uses coverage-guided fuzzing under the hood (libFuzzer-style) but hides boilerplate harness code.
- Works great for libraries and core logic (parsers, decoders, crypto helpers) where you already have unit tests.
- Is ideal for CI: The same binary can run fast deterministic tests or long-running fuzz campaigns depending on flags.
Where AFL++/Honggfuzz are great for whole programs and black-box binaries, FuzzTest shines when you have source code and want to fuzz individual C++ functions directly.
Lab 1: Set up FuzzTest and run a basic property
mkdir -p ~/tuts/first_fuzz_project && cd ~/tuts/first_fuzz_project
git clone --branch main --depth 1 https://github.com/google/fuzztest.git
cat <<EOT > CMakeLists.txt
# GoogleTest requires at least C++17
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(fuzztest)
enable_testing()
include(GoogleTest)
fuzztest_setup_fuzzing_flags()
add_executable(
first_fuzz_test
first_fuzz_test.cc
)
link_fuzztest(first_fuzz_test)
gtest_discover_tests(first_fuzz_test)
EOT
cat <<EOT > first_fuzz_test.cc
#include "fuzztest/fuzztest.h"
#include "gtest/gtest.h"
TEST(MyTestSuite, OnePlusTwoIsTwoPlusOne) {
EXPECT_EQ(1 + 2, 2 + 1);
}
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 4k
- Forks
- 597
- Last commit
- Aug 2026
Advanced
- Catalog kind
- skill
- Gateway key
offensive-fuzzing-course- Source
- github.com/snailsploit/claude-red