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