The Zorya Fuzzer is an automated test campaign orchestrator for the Zorya concolic executor. It allows you to configure multiple test runs with different starting addresses and arguments in a single JSON file, then execute them all systematically.
- JSON Configuration: Define all test parameters in a single configuration file
- Multiple Test Runs: Execute multiple starting addresses with different arguments automatically
- Timeout Management: Set individual timeouts for each test (default: 5 minutes)
- Organized Results: Each test run stores its results in a separate directory
- Summary Reports: Get comprehensive summaries of all test results
- SAT State Detection: Automatically detects and reports when satisfiable states are found
Build the fuzzer binary:
cd /path/to/zorya-fuzzer
cargo build --release --bin zorya-fuzzerThe binary will be available at: target/release/zorya-fuzzer
Create an example configuration:
./target/release/zorya-fuzzer --create-example my_config.jsonThis creates a template JSON file that you can edit with your specific test configurations.
Edit the JSON file with your binary path, language settings, and test cases:
{
"global": {
"language": "go",
"compiler": "gc",
"binary_path": "./my_binary",
"thread_scheduling": "main_only",
"log_mode": "verbose",
"negate_path_flag": true
},
"tests": [
{
"id": "test_function_1",
"mode": "function",
"start_address": "0x401000",
"args": "none",
"timeout_seconds": 300,
"env_vars": {}
},
{
"id": "test_main",
"mode": "main",
"start_address": "0x401500",
"args": "arg1 arg2",
"timeout_seconds": 300,
"env_vars": {}
}
]
}Execute all test configurations:
./target/release/zorya-fuzzer my_config.json- language: Source language of the binary (
"go","c","c++") - compiler: Compiler used (
"gc","tinygo","gcc","clang") - binary_path: Path to the target binary (P-code will be automatically generated)
- thread_scheduling: Thread scheduling policy (
"main_only","round_robin") - log_mode: Logging verbosity (
"verbose","trace_only") - negate_path_flag: Enable path negation analysis (boolean)
- id: Unique identifier for the test (used for result directory naming)
- mode: Execution mode:
"function": Start from a specific function"start": Start from program start"main": Start from main function
- start_address: Starting address in hex format (e.g.,
"0x401000") - args: Binary arguments as a string (use
"none"for no arguments) - timeout_seconds: Execution timeout in seconds (default: 300)
- env_vars: Additional environment variables (optional)
The fuzzer creates a fuzzer_results/ directory with the following structure:
fuzzer_results/
├── fuzzer_summary.txt # Overall campaign summary
├── test_function_1/ # Results for each test
│ ├── execution_log.txt # Detailed execution log
│ ├── execution_trace.txt # Function call trace
│ ├── FOUND_SAT_STATE.txt # SAT states (if found)
│ ├── stdout.txt # Standard output
│ └── stderr.txt # Standard error
├── test_main/
│ └── ...
└── ...
Same as Zorya main project.