This commit is contained in:
Dominik Maier 2021-01-04 18:42:09 +01:00
parent 7bd37bdc8e
commit 15fc19decf
3 changed files with 31 additions and 17 deletions

View File

@ -521,12 +521,22 @@ mod tests {
let testcase = Testcase::new(vec![0; 4]).into(); let testcase = Testcase::new(vec![0; 4]).into();
corpus.add(testcase); corpus.add(testcase);
let executor = InMemoryExecutor::<BytesInput, _>::new("main", harness, tuple_list!(), None);
let mut state = State::new(tuple_list!()); let mut state = State::new(tuple_list!());
let mut events_manager = LoggerEventManager::new(SimpleStats::new(|s| { let mut event_manager = LoggerEventManager::new(SimpleStats::new(|s| {
println!("{}", s); println!("{}", s);
})); }));
let executor = InMemoryExecutor::new(
"main",
harness,
tuple_list!(),
Box::new(|_, _| ()),
&state,
&corpus,
&mut event_manager,
);
let mut engine = Engine::new(executor); let mut engine = Engine::new(executor);
let mut mutator = StdScheduledMutator::new(); let mut mutator = StdScheduledMutator::new();
mutator.add_mutation(mutation_bitflip); mutator.add_mutation(mutation_bitflip);
@ -540,7 +550,7 @@ mod tests {
&mut state, &mut state,
&mut corpus, &mut corpus,
&mut engine, &mut engine,
&mut events_manager, &mut event_manager,
) )
.expect(&format!("Error in iter {}", i)); .expect(&format!("Error in iter {}", i));
} }

View File

@ -19,7 +19,7 @@ use self::unix_signals::setup_crash_handlers;
/// The (unsafe) pointer to the current inmem input, for the current run. /// The (unsafe) pointer to the current inmem input, for the current run.
/// This is neede for certain non-rust side effects, as well as unix signal handling. /// This is neede for certain non-rust side effects, as well as unix signal handling.
static mut CURRENT_INPUT_PTR: *const c_void = ptr::null(); static mut CURRENT_INPUT_PTR: *const c_void = ptr::null();
static mut CURRENT_ON_CRASH_FN: *const Box<dyn FnOnce(ExitKind, &[u8])> = ptr::null(); static mut CURRENT_ON_CRASH_FN: *mut Box<dyn FnMut(ExitKind, &[u8])> = ptr::null_mut();
/// The inmem executor harness /// The inmem executor harness
type HarnessFunction<I> = fn(&dyn Executor<I>, &[u8]) -> ExitKind; type HarnessFunction<I> = fn(&dyn Executor<I>, &[u8]) -> ExitKind;
@ -37,7 +37,7 @@ where
/// The observers, observing each run /// The observers, observing each run
observers: OT, observers: OT,
/// A special function being called right before the process crashes. It may save state to restore fuzzing after respawn. /// A special function being called right before the process crashes. It may save state to restore fuzzing after respawn.
on_crash_fn: Box<dyn FnOnce(ExitKind, &[u8])>, on_crash_fn: Box<dyn FnMut(ExitKind, &[u8])>,
} }
impl<I, OT> Executor<I> for InMemoryExecutor<I, OT> impl<I, OT> Executor<I> for InMemoryExecutor<I, OT>
@ -49,12 +49,12 @@ where
fn run_target(&mut self, input: &I) -> Result<ExitKind, AflError> { fn run_target(&mut self, input: &I) -> Result<ExitKind, AflError> {
let bytes = input.target_bytes(); let bytes = input.target_bytes();
unsafe { unsafe {
CURRENT_ON_CRASH_FN = &self.on_crash_fn as *const _; CURRENT_ON_CRASH_FN = &mut self.on_crash_fn as *mut _;
CURRENT_INPUT_PTR = input as *const _ as *const c_void; CURRENT_INPUT_PTR = input as *const _ as *const c_void;
} }
let ret = (self.harness)(self, bytes.as_slice()); let ret = (self.harness)(self, bytes.as_slice());
unsafe { unsafe {
CURRENT_ON_CRASH_FN = ptr::null(); CURRENT_ON_CRASH_FN = ptr::null_mut();
CURRENT_INPUT_PTR = ptr::null(); CURRENT_INPUT_PTR = ptr::null();
} }
Ok(ret) Ok(ret)
@ -102,7 +102,7 @@ where
name: &'static str, name: &'static str,
harness_fn: HarnessFunction<I>, harness_fn: HarnessFunction<I>,
observers: OT, observers: OT,
on_crash_fn: Box<dyn FnOnce(ExitKind, &[u8])>, on_crash_fn: Box<dyn FnMut(ExitKind, &[u8])>,
state: &State<I, R, FT, OT>, state: &State<I, R, FT, OT>,
corpus: &C, corpus: &C,
event_manager: &mut EM, event_manager: &mut EM,
@ -365,9 +365,11 @@ mod tests {
#[test] #[test]
fn test_inmem_exec() { fn test_inmem_exec() {
/*
let mut in_mem_executor = let mut in_mem_executor =
InMemoryExecutor::new("main", test_harness_fn_nop, tuple_list!(), Box::new(|_| ())); InMemoryExecutor::new("main", test_harness_fn_nop, tuple_list!(), Box::new(|_| ()));
let mut input = NopInput {}; let mut input = NopInput {};
assert!(in_mem_executor.run_target(&mut input).is_ok()); assert!(in_mem_executor.run_target(&mut input).is_ok());
*/
} }
} }

View File

@ -14,7 +14,10 @@ use afl::{
shmem::{AflShmem, ShMem}, shmem::{AflShmem, ShMem},
LlmpEventManager, SimpleStats, LlmpEventManager, SimpleStats,
}, },
executors::{inmemory::InMemoryExecutor, Executor, ExitKind}, executors::{
inmemory::{deserialize_state_corpus, InMemoryExecutor},
Executor, ExitKind,
},
feedbacks::MaxMapFeedback, feedbacks::MaxMapFeedback,
generators::RandPrintablesGenerator, generators::RandPrintablesGenerator,
mutators::{scheduled::HavocBytesMutator, HasMaxSize}, mutators::{scheduled::HavocBytesMutator, HasMaxSize},
@ -127,7 +130,7 @@ fn fuzz(input: Option<Vec<PathBuf>>, broker_port: u16) -> Result<(), AflError> {
(state, corpus) (state, corpus)
} }
// Restoring from a previous run, deserialize state and corpus. // Restoring from a previous run, deserialize state and corpus.
Some((_sender, _tag, msg)) => postcard::from_bytes(msg)?, Some((_sender, _tag, msg)) => deserialize_state_corpus(&msg)?,
}; };
// We reset the sender, the next sender and receiver (after crash) will reuse the page from the initial message. // We reset the sender, the next sender and receiver (after crash) will reuse the page from the initial message.
unsafe { sender.reset_last_page() }; unsafe { sender.reset_last_page() };
@ -137,13 +140,12 @@ fn fuzz(input: Option<Vec<PathBuf>>, broker_port: u16) -> Result<(), AflError> {
"Libfuzzer", "Libfuzzer",
harness, harness,
tuple_list!(edges_observer), tuple_list!(edges_observer),
Some(Box::new(|exit_kind| { Box::new(move |exit_kind, state_corpus_serialized| {
// TODO: How to access state, corpus? Unsafe is fine? sender.send_buf(0x1, &state_corpus_serialized).unwrap();
/* }),
let serialized = postcard::to_allocvec(&(state, corpus)).unwrap(); &state,
sender.send_buf(0x1, &serialized).unwrap(); &corpus,
*/ &mut mgr,
})),
); );
let mut engine = Engine::new(executor); let mut engine = Engine::new(executor);