inmem fuzzer -> inprocess fuzzer
This commit is contained in:
parent
75972653fe
commit
40a7301344
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
|
|
||||||
|
@ -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!(),
|
||||||
|
@ -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,
|
||||||
|
68
afl/src/mutators/token_mutations.rs
Normal file
68
afl/src/mutators/token_mutations.rs
Normal 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)
|
||||||
|
}
|
@ -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),
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user