inmem fuzzer -> inprocess fuzzer

This commit is contained in:
Dominik Maier 2021-02-09 09:42:19 +01:00
parent 75972653fe
commit 40a7301344
8 changed files with 87 additions and 19 deletions

View File

@ -31,7 +31,7 @@ use self::os_signals::setup_crash_handlers;
type HarnessFunction<E> = fn(&E, &[u8]) -> ExitKind; type HarnessFunction<E> = fn(&E, &[u8]) -> ExitKind;
/// The inmem executor simply calls a target function, then returns afterwards. /// The inmem executor simply calls a target function, then returns afterwards.
pub struct InMemoryExecutor<I, OT> pub struct InProcessExecutor<I, OT>
where where
I: Input + HasTargetBytes, I: Input + HasTargetBytes,
OT: ObserversTuple, OT: ObserversTuple,
@ -45,7 +45,7 @@ where
phantom: PhantomData<I>, phantom: PhantomData<I>,
} }
impl<I, OT> Executor<I> for InMemoryExecutor<I, OT> impl<I, OT> Executor<I> for InProcessExecutor<I, OT>
where where
I: Input + HasTargetBytes, I: Input + HasTargetBytes,
OT: ObserversTuple, OT: ObserversTuple,
@ -100,7 +100,7 @@ where
} }
} }
impl<I, OT> Named for InMemoryExecutor<I, OT> impl<I, OT> Named for InProcessExecutor<I, OT>
where where
I: Input + HasTargetBytes, I: Input + HasTargetBytes,
OT: ObserversTuple, OT: ObserversTuple,
@ -110,7 +110,7 @@ where
} }
} }
impl<I, OT> HasObservers<OT> for InMemoryExecutor<I, OT> impl<I, OT> HasObservers<OT> for InProcessExecutor<I, OT>
where where
I: Input + HasTargetBytes, I: Input + HasTargetBytes,
OT: ObserversTuple, OT: ObserversTuple,
@ -126,7 +126,7 @@ where
} }
} }
impl<I, OT> InMemoryExecutor<I, OT> impl<I, OT> InProcessExecutor<I, OT>
where where
I: Input + HasTargetBytes, I: Input + HasTargetBytes,
OT: ObserversTuple, OT: ObserversTuple,
@ -376,7 +376,7 @@ mod tests {
use core::marker::PhantomData; use core::marker::PhantomData;
use crate::{ use crate::{
executors::{Executor, ExitKind, InMemoryExecutor}, executors::{Executor, ExitKind, InProcessExecutor},
inputs::Input, inputs::Input,
tuples::tuple_list, tuples::tuple_list,
}; };
@ -389,7 +389,7 @@ mod tests {
fn test_inmem_exec() { fn test_inmem_exec() {
use crate::inputs::NopInput; use crate::inputs::NopInput;
let mut in_mem_executor = InMemoryExecutor::<NopInput, ()> { let mut in_process_executor = InProcessExecutor::<NopInput, ()> {
harness_fn: test_harness_fn_nop, harness_fn: test_harness_fn_nop,
// TODO: on_crash_fn: Box::new(|_, _, _, _, _| ()), // TODO: on_crash_fn: Box::new(|_, _, _, _, _| ()),
observers: tuple_list!(), observers: tuple_list!(),
@ -397,6 +397,6 @@ mod tests {
phantom: PhantomData, phantom: PhantomData,
}; };
let mut input = NopInput {}; let mut input = NopInput {};
assert!(in_mem_executor.run_target(&mut input).is_ok()); assert!(in_process_executor.run_target(&mut input).is_ok());
} }
} }

View File

@ -1,7 +1,7 @@
//! Executors take input, and run it in the target. //! Executors take input, and run it in the target.
pub mod inmemory; pub mod inprocess;
pub use inmemory::InMemoryExecutor; pub use inprocess::InProcessExecutor;
#[cfg(feature = "runtime")] #[cfg(feature = "runtime")]
pub mod runtime; pub mod runtime;

View File

@ -245,7 +245,7 @@ mod tests {
use crate::{ use crate::{
corpus::{Corpus, InMemoryCorpus, Testcase}, corpus::{Corpus, InMemoryCorpus, Testcase},
executors::{Executor, ExitKind, InMemoryExecutor}, executors::{Executor, ExitKind, InProcessExecutor},
inputs::{BytesInput, Input}, inputs::{BytesInput, Input},
mutators::{mutation_bitflip, ComposedByMutations, StdScheduledMutator}, mutators::{mutation_bitflip, ComposedByMutations, StdScheduledMutator},
stages::StdMutationalStage, stages::StdMutationalStage,
@ -277,7 +277,7 @@ mod tests {
}); });
let mut event_manager = LoggerEventManager::new(stats); let mut event_manager = LoggerEventManager::new(stats);
let mut executor = InMemoryExecutor::new( let mut executor = InProcessExecutor::new(
"main", "main",
harness, harness,
tuple_list!(), tuple_list!(),

View File

@ -914,7 +914,7 @@ mod tests {
use super::*; use super::*;
use crate::{ use crate::{
corpus::{Corpus, InMemoryCorpus}, corpus::{Corpus, InMemoryCorpus},
executors::InMemoryExecutor, executors::InProcessExecutor,
inputs::BytesInput, inputs::BytesInput,
state::State, state::State,
utils::StdRand, utils::StdRand,

View File

@ -0,0 +1,68 @@
struct Tokens {
vec: Vec<Vec<u8>>,
}
impl AsAny for Tokens {
}
/// Insert a dictionary token
pub fn mutation_tokeninsert<I, M, R, S>(
mutator: &mut M,
rand: &mut R,
state: &mut S,
input: &mut I,
) -> Result<MutationResult, AflError>
where
M: HasMaxSize,
I: Input + HasBytesVec,
R: Rand,
S: HasMetadata,
{
let tokens: &Tokens = &state.metadata().get::<Tokens>().unwrap();
let tokens = tokens.token_vec;
if mutator.tokens.size() == 0 {
return Ok(MutationResult::Skipped);
}
let token = &mutator.tokens[rand.below(token.size())];
let token_len = token.size();
let size = input.bytes().len();
let off = if size == 0 {
0
} else {
rand.below(core::cmp::min(
size,
(mutator.max_size() - token_len) as u64,
)) as usize
} as usize;
input.bytes_mut().resize(size + token_len, 0);
mem_move(input.bytes_mut(), token, 0, off, len);
Ok(MutationResult::Mutated)
}
/// Overwrite with a dictionary token
pub fn mutation_tokenreplace<I, M, R, S>(
mutator: &mut M,
rand: &mut R,
state: &S,
input: &mut I,
) -> Result<MutationResult, AflError>
where
M: HasMaxSize,
I: Input + HasBytesVec,
R: Rand,
S: HasMetadata,
{
if mutator.tokens.size() > len || !len {
return Ok(MutationResult::Skipped);
}
let token = &mutator.tokens[rand.below(token.size())];
let token_len = token.size();
let size = input.bytes().len();
let off = rand.below((mutator.max_size() - token_len) as u64) as usize;
mem_move(input.bytes_mut(), token, 0, off, len);
Ok(MutationResult::Mutated)
}

View File

@ -7,7 +7,7 @@ use std::{env, path::PathBuf, process::Command};
use afl::{ use afl::{
corpus::{Corpus, InMemoryCorpus}, corpus::{Corpus, InMemoryCorpus},
events::{LlmpEventManager, SimpleStats}, events::{LlmpEventManager, SimpleStats},
executors::{inmemory::InMemoryExecutor, Executor, ExitKind}, executors::{inprocess::InProcessExecutor, Executor, ExitKind},
feedbacks::MaxMapFeedback, feedbacks::MaxMapFeedback,
generators::RandPrintablesGenerator, generators::RandPrintablesGenerator,
inputs::{BytesInput, Input}, inputs::{BytesInput, Input},
@ -229,7 +229,7 @@ fn fuzz(input: Option<Vec<PathBuf>>, broker_port: u16) -> Result<(), AflError> {
*/ */
// Create the engine // Create the engine
let mut executor = InMemoryExecutor::new( let mut executor = InProcessExecutor::new(
"Libfuzzer", "Libfuzzer",
harness, harness,
tuple_list!(edges_observer), tuple_list!(edges_observer),

View File

@ -15,7 +15,7 @@ use afl::engines::Fuzzer;
use afl::engines::State; use afl::engines::State;
use afl::engines::StdFuzzer; use afl::engines::StdFuzzer;
use afl::events::{LlmpEventManager, SimpleStats}; use afl::events::{LlmpEventManager, SimpleStats};
use afl::executors::inmemory::InMemoryExecutor; use afl::executors::inmemory::InProcessExecutor;
use afl::executors::{Executor, ExitKind}; use afl::executors::{Executor, ExitKind};
use afl::feedbacks::MaxMapFeedback; use afl::feedbacks::MaxMapFeedback;
use afl::generators::RandPrintablesGenerator; use afl::generators::RandPrintablesGenerator;
@ -121,7 +121,7 @@ pub fn main() {
}); });
let edges_feedback = MaxMapFeedback::new_with_observer(&NAME_COV_MAP, &edges_observer); let edges_feedback = MaxMapFeedback::new_with_observer(&NAME_COV_MAP, &edges_observer);
let executor = InMemoryExecutor::new("Libfuzzer", harness, tuple_list!(edges_observer)); let executor = InProcessExecutor::new("Libfuzzer", harness, tuple_list!(edges_observer));
let mut state = State::new(tuple_list!(edges_feedback)); let mut state = State::new(tuple_list!(edges_feedback));
let mut engine = Engine::new(executor); let mut engine = Engine::new(executor);

View File

@ -8,7 +8,7 @@ use afl::engines::Fuzzer;
use afl::engines::State; use afl::engines::State;
use afl::engines::StdFuzzer; use afl::engines::StdFuzzer;
use afl::events::{LlmpEventManager, SimpleStats}; use afl::events::{LlmpEventManager, SimpleStats};
use afl::executors::inmemory::InMemoryExecutor; use afl::executors::inmemory::InProcessExecutor;
use afl::executors::{Executor, ExitKind}; use afl::executors::{Executor, ExitKind};
use afl::feedbacks::MaxMapFeedback; use afl::feedbacks::MaxMapFeedback;
use afl::generators::RandPrintablesGenerator; use afl::generators::RandPrintablesGenerator;
@ -72,7 +72,7 @@ pub extern "C" fn fuzz_main_loop() {
}); });
let edges_feedback = MaxMapFeedback::new_with_observer(&NAME_COV_MAP, &edges_observer); let edges_feedback = MaxMapFeedback::new_with_observer(&NAME_COV_MAP, &edges_observer);
let executor = InMemoryExecutor::new("QEMUFuzzer", harness, tuple_list!(edges_observer)); let executor = InProcessExecutor::new("QEMUFuzzer", harness, tuple_list!(edges_observer));
let mut state = State::new(tuple_list!(edges_feedback)); let mut state = State::new(tuple_list!(edges_feedback));
let mut engine = Engine::new(executor); let mut engine = Engine::new(executor);