Module libafl_bolts::cli

source ·
Expand description

A one-size-fits-most approach to defining runtime behavior of LibAFL fuzzers

The most common pattern of use will be to import and call parse_args.

§Example (Most Common)

The most common usage of the cli parser. Just call parse_args and use the results.

use libafl_bolts::cli::{parse_args, FuzzerOptions};

fn fuzz(options: FuzzerOptions) {}
fn replay(options: FuzzerOptions) {}

fn main() {
    // make sure to add `features = ["cli"]` to the `libafl` crate in `Cargo.toml`
    let parsed = parse_args();

    // call appropriate logic, passing in parsed options
    if parsed.replay.is_some() {
        replay(parsed);
    } else {
        fuzz(parsed);
    }

    log::info!("{:?}", parsed);
}

§Example (libafl_qemu)

use libafl_bolts::cli::{parse_args, FuzzerOptions};
use std::env;

// make sure to add `features = ["qemu_cli"]` to the `libafl` crate in `Cargo.toml`
use libafl_qemu::Qemu;

fn fuzz_with_qemu(mut options: FuzzerOptions) {
    env::remove_var("LD_LIBRARY_PATH");

    let env: Vec<(String, String)> = env::vars().collect();

    let qemu = Qemu::init(&mut options.qemu_args.to_vec(), &mut env).unwrap();
    // do other stuff...
}

fn replay(options: FuzzerOptions) {}

fn main() {
    // example command line invocation:
    // ./path-to-fuzzer -x something.dict -- ./path-to-fuzzer -L /path/for/qemu_tack_L ./target --target-opts
    let parsed = parse_args();

    // call appropriate logic, passing in parsed options
    if parsed.replay.is_some() {
        replay(parsed);
    } else {
        fuzz_with_qemu(parsed);
    }

    log::info!("{:?}", parsed);
}

Structs§

  • Top-level container for cli options/arguments/subcommands

Functions§

  • Parse from std::env::args_os(), exit on error