forward NewTestcase, executor as arg to EventManager::process

This commit is contained in:
Andrea Fioraldi 2021-02-15 15:27:55 +01:00
parent 092f65bbbd
commit a599a9f998
9 changed files with 60 additions and 240 deletions

View File

@ -16,6 +16,8 @@ use crate::{
llmp::{self, LlmpClient, LlmpClientDescription, Tag}, llmp::{self, LlmpClient, LlmpClientDescription, Tag},
shmem::ShMem, shmem::ShMem,
}, },
executors::{HasObservers, Executor},
observers::ObserversTuple,
corpus::Corpus, corpus::Corpus,
events::{BrokerEventResult, Event, EventManager}, events::{BrokerEventResult, Event, EventManager},
executors::ExitKind, executors::ExitKind,
@ -248,18 +250,21 @@ where
} }
// Handle arriving events in the client // Handle arriving events in the client
fn handle_in_client<C, FT, OC, OFT, R>( fn handle_in_client<C, E, FT, OC, OFT, OT, R>(
&mut self, &mut self,
state: &mut State<C, FT, I, OC, OFT, R>, state: &mut State<C, FT, I, OC, OFT, R>,
_sender_id: u32, sender_id: u32,
event: Event<I>, event: Event<I>,
_executor: &mut E,
) -> Result<(), Error> ) -> Result<(), Error>
where where
C: Corpus<I, R>, C: Corpus<I, R>,
E: Executor<I> + HasObservers<OT>,
FT: FeedbacksTuple<I>, FT: FeedbacksTuple<I>,
R: Rand, R: Rand,
OC: Corpus<I, R>, OC: Corpus<I, R>,
OFT: FeedbacksTuple<I>, OFT: FeedbacksTuple<I>,
OT: ObserversTuple
{ {
match event { match event {
Event::NewTestcase { Event::NewTestcase {
@ -273,11 +278,17 @@ where
// TODO: here u should match client_config, if equal to the current one do not re-execute // TODO: here u should match client_config, if equal to the current one do not re-execute
// we need to pass engine to process() too, TODO // we need to pass engine to process() too, TODO
#[cfg(feature = "std")] #[cfg(feature = "std")]
println!("Received new Testcase"); println!("Received new Testcase from {}", sender_id);
let observers = postcard::from_bytes(&observers_buf)?;
let observers: OT = postcard::from_bytes(&observers_buf)?;
// TODO include ExitKind in NewTestcase // TODO include ExitKind in NewTestcase
let interestingness = state.is_interesting(&input, &observers, ExitKind::Ok)?; let fitness = state.is_interesting(&input, &observers, ExitKind::Ok)?;
state.add_if_interesting(input, interestingness)?; if fitness > 0 {
if !state.add_if_interesting(input, fitness)?.is_none() {
#[cfg(feature = "std")]
println!("Added received Testcase");
}
}
Ok(()) Ok(())
} }
_ => Err(Error::Unknown(format!( _ => Err(Error::Unknown(format!(
@ -306,16 +317,19 @@ where
} }
} }
fn process<C, FT, OC, OFT, R>( fn process<C, E, FT, OC, OFT, OT, R>(
&mut self, &mut self,
state: &mut State<C, FT, I, OC, OFT, R>, state: &mut State<C, FT, I, OC, OFT, R>,
executor: &mut E,
) -> Result<usize, Error> ) -> Result<usize, Error>
where where
C: Corpus<I, R>, C: Corpus<I, R>,
E: Executor<I> + HasObservers<OT>,
FT: FeedbacksTuple<I>, FT: FeedbacksTuple<I>,
R: Rand, R: Rand,
OC: Corpus<I, R>, OC: Corpus<I, R>,
OFT: FeedbacksTuple<I>, OFT: FeedbacksTuple<I>,
OT: ObserversTuple
{ {
// TODO: Get around local event copy by moving handle_in_client // TODO: Get around local event copy by moving handle_in_client
let mut events = vec![]; let mut events = vec![];
@ -340,7 +354,7 @@ where
let count = events.len(); let count = events.len();
events events
.drain(..) .drain(..)
.try_for_each(|(sender_id, event)| self.handle_in_client(state, sender_id, event))?; .try_for_each(|(sender_id, event)| self.handle_in_client(state, sender_id, event, executor))?;
Ok(count) Ok(count)
} }
@ -451,18 +465,21 @@ where
.send_buf(_LLMP_TAG_RESTART, &state_corpus_serialized) .send_buf(_LLMP_TAG_RESTART, &state_corpus_serialized)
} }
fn process<C, FT, OC, OFT, R>( fn process<C, E, FT, OC, OFT, OT, R>(
&mut self, &mut self,
state: &mut State<C, FT, I, OC, OFT, R>, state: &mut State<C, FT, I, OC, OFT, R>,
executor: &mut E,
) -> Result<usize, Error> ) -> Result<usize, Error>
where where
C: Corpus<I, R>, C: Corpus<I, R>,
E: Executor<I> + HasObservers<OT>,
FT: FeedbacksTuple<I>, FT: FeedbacksTuple<I>,
R: Rand, R: Rand,
OC: Corpus<I, R>, OC: Corpus<I, R>,
OFT: FeedbacksTuple<I>, OFT: FeedbacksTuple<I>,
OT: ObserversTuple
{ {
self.llmp_mgr.process(state) self.llmp_mgr.process(state, executor)
} }
fn fire<C, FT, OC, OFT, R>( fn fire<C, FT, OC, OFT, R>(

View File

@ -5,6 +5,8 @@ use alloc::{string::ToString, vec::Vec};
use crate::{ use crate::{
corpus::Corpus, corpus::Corpus,
events::{BrokerEventResult, Event, EventManager}, events::{BrokerEventResult, Event, EventManager},
executors::{HasObservers, Executor},
observers::ObserversTuple,
feedbacks::FeedbacksTuple, feedbacks::FeedbacksTuple,
inputs::Input, inputs::Input,
state::State, state::State,
@ -31,21 +33,24 @@ where
I: Input, I: Input,
ST: Stats, //CE: CustomEvent<I, OT>, ST: Stats, //CE: CustomEvent<I, OT>,
{ {
fn process<C, FT, OC, OFT, R>( fn process<C, E, FT, OC, OFT, OT, R>(
&mut self, &mut self,
state: &mut State<C, FT, I, OC, OFT, R>, state: &mut State<C, FT, I, OC, OFT, R>,
_executor: &mut E,
) -> Result<usize, Error> ) -> Result<usize, Error>
where where
C: Corpus<I, R>, C: Corpus<I, R>,
E: Executor<I> + HasObservers<OT>,
FT: FeedbacksTuple<I>, FT: FeedbacksTuple<I>,
R: Rand, R: Rand,
OC: Corpus<I, R>, OC: Corpus<I, R>,
OFT: FeedbacksTuple<I>, OFT: FeedbacksTuple<I>,
OT: ObserversTuple
{ {
let count = self.events.len(); let count = self.events.len();
while self.events.len() > 0 { while self.events.len() > 0 {
let event = self.events.pop().unwrap(); let event = self.events.pop().unwrap();
self.handle_in_client(state, 0, event)?; self.handle_in_client(state, event)?;
} }
Ok(count) Ok(count)
} }
@ -62,7 +67,7 @@ where
OC: Corpus<I, R>, OC: Corpus<I, R>,
OFT: FeedbacksTuple<I>, OFT: FeedbacksTuple<I>,
{ {
match Self::handle_in_broker(&mut self.stats, 0, &event)? { match Self::handle_in_broker(&mut self.stats, &event)? {
BrokerEventResult::Forward => self.events.push(event), BrokerEventResult::Forward => self.events.push(event),
BrokerEventResult::Handled => (), BrokerEventResult::Handled => (),
}; };
@ -85,7 +90,6 @@ where
// Handle arriving events in the broker // Handle arriving events in the broker
fn handle_in_broker( fn handle_in_broker(
stats: &mut ST, stats: &mut ST,
_sender_id: u32,
event: &Event<I>, event: &Event<I>,
) -> Result<BrokerEventResult, Error> { ) -> Result<BrokerEventResult, Error> {
match event { match event {
@ -134,7 +138,6 @@ where
fn handle_in_client<C, FT, OC, OFT, R>( fn handle_in_client<C, FT, OC, OFT, R>(
&mut self, &mut self,
_state: &mut State<C, FT, I, OC, OFT, R>, _state: &mut State<C, FT, I, OC, OFT, R>,
_sender_id: u32,
event: Event<I>, event: Event<I>,
) -> Result<(), Error> ) -> Result<(), Error>
where where

View File

@ -10,6 +10,7 @@ use serde::{Deserialize, Serialize};
use crate::{ use crate::{
corpus::Corpus, feedbacks::FeedbacksTuple, inputs::Input, observers::ObserversTuple, corpus::Corpus, feedbacks::FeedbacksTuple, inputs::Input, observers::ObserversTuple,
executors::{HasObservers, Executor},
state::State, utils::Rand, Error, state::State, utils::Rand, Error,
}; };
@ -156,16 +157,19 @@ where
/// Lookup for incoming events and process them. /// Lookup for incoming events and process them.
/// Return the number of processes events or an error /// Return the number of processes events or an error
fn process<C, FT, OC, OFT, R>( fn process<C, E, FT, OC, OFT, OT, R>(
&mut self, &mut self,
state: &mut State<C, FT, I, OC, OFT, R>, state: &mut State<C, FT, I, OC, OFT, R>,
executor: &mut E,
) -> Result<usize, Error> ) -> Result<usize, Error>
where where
C: Corpus<I, R>, C: Corpus<I, R>,
E: Executor<I> + HasObservers<OT>,
FT: FeedbacksTuple<I>, FT: FeedbacksTuple<I>,
R: Rand, R: Rand,
OC: Corpus<I, R>, OC: Corpus<I, R>,
OFT: FeedbacksTuple<I>; OFT: FeedbacksTuple<I>,
OT: ObserversTuple;
/// Serialize all observers for this type and manager /// Serialize all observers for this type and manager
fn serialize_observers<OT>(&mut self, observers: &OT) -> Result<Vec<u8>, Error> fn serialize_observers<OT>(&mut self, observers: &OT) -> Result<Vec<u8>, Error>
@ -226,16 +230,19 @@ impl<I> EventManager<I> for NopEventManager<I>
where where
I: Input, I: Input,
{ {
fn process<C, FT, OC, OFT, R>( fn process<C, E, FT, OC, OFT, OT, R>(
&mut self, &mut self,
_state: &mut State<C, FT, I, OC, OFT, R>, _state: &mut State<C, FT, I, OC, OFT, R>,
_executor: &mut E,
) -> Result<usize, Error> ) -> Result<usize, Error>
where where
C: Corpus<I, R>, C: Corpus<I, R>,
E: Executor<I> + HasObservers<OT>,
FT: FeedbacksTuple<I>, FT: FeedbacksTuple<I>,
R: Rand, R: Rand,
OC: Corpus<I, R>, OC: Corpus<I, R>,
OFT: FeedbacksTuple<I>, OFT: FeedbacksTuple<I>,
OT: ObserversTuple,
{ {
Ok(0) Ok(0)
} }
@ -259,10 +266,9 @@ where
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::bolts::tuples::{tuple_list, MatchNameAndType, Named}; use crate::bolts::tuples::{tuple_list};
use crate::events::Event; use crate::events::Event;
use crate::inputs::bytes::BytesInput; use crate::inputs::bytes::BytesInput;
use crate::observers::ObserversTuple;
use crate::observers::StdMapObserver; use crate::observers::StdMapObserver;
use crate::utils::current_time; use crate::utils::current_time;
@ -272,7 +278,7 @@ mod tests {
fn test_event_serde() { fn test_event_serde() {
let obv = StdMapObserver::new("test", unsafe { &mut MAP }); let obv = StdMapObserver::new("test", unsafe { &mut MAP });
let map = tuple_list!(obv); let map = tuple_list!(obv);
let observers_buf = map.serialize().unwrap(); let observers_buf = postcard::to_allocvec(&map).unwrap();
let i = BytesInput::new(vec![0]); let i = BytesInput::new(vec![0]);
let e = Event::NewTestcase { let e = Event::NewTestcase {
@ -296,7 +302,7 @@ mod tests {
time: _, time: _,
executions: _, executions: _,
} => { } => {
let o = map.deserialize(&observers_buf).unwrap(); let o: tuple_list!(StdMapObserver::<u32>) = postcard::from_bytes(&observers_buf).unwrap();
let test_observer = o.match_name_type::<StdMapObserver<u32>>("test").unwrap(); let test_observer = o.match_name_type::<StdMapObserver<u32>>("test").unwrap();
assert_eq!("test", test_observer.name()); assert_eq!("test", test_observer.name());
} }

View File

@ -68,7 +68,7 @@ where
self.stages_mut() self.stages_mut()
.perform_all(rand, executor, state, manager, idx)?; .perform_all(rand, executor, state, manager, idx)?;
manager.process(state)?; manager.process(state, executor)?;
Ok(idx) Ok(idx)
} }

View File

@ -277,7 +277,7 @@ where
pub fn new_default() -> Self { pub fn new_default() -> Self {
let mut scheduled = StdScheduledMutator::<C, I, R, S>::new(); let mut scheduled = StdScheduledMutator::<C, I, R, S>::new();
scheduled.add_mutation(mutation_bitflip); scheduled.add_mutation(mutation_bitflip);
scheduled.add_mutation(mutation_byteflip); /*scheduled.add_mutation(mutation_byteflip);
scheduled.add_mutation(mutation_byteinc); scheduled.add_mutation(mutation_byteinc);
scheduled.add_mutation(mutation_bytedec); scheduled.add_mutation(mutation_bytedec);
scheduled.add_mutation(mutation_byteneg); scheduled.add_mutation(mutation_byteneg);
@ -307,7 +307,7 @@ where
scheduled.add_mutation(mutation_tokenreplace); scheduled.add_mutation(mutation_tokenreplace);
scheduled.add_mutation(mutation_crossover_insert); scheduled.add_mutation(mutation_crossover_insert);
scheduled.add_mutation(mutation_crossover_replace); scheduled.add_mutation(mutation_crossover_replace);*/
//scheduled.add_mutation(mutation_splice); //scheduled.add_mutation(mutation_splice);
HavocBytesMutator { HavocBytesMutator {

View File

@ -57,18 +57,10 @@ pub trait ObserversTuple:
/// Do whatever you need to do after a run. /// Do whatever you need to do after a run.
/// This is called right after the last execution /// This is called right after the last execution
fn post_exec_all(&mut self) -> Result<(), Error>; fn post_exec_all(&mut self) -> Result<(), Error>;
//fn for_each(&self, f: fn(&dyn Observer)); //fn for_each(&self, f: fn(&dyn Observer));
//fn for_each_mut(&mut self, f: fn(&mut dyn Observer)); //fn for_each_mut(&mut self, f: fn(&mut dyn Observer));
/// Serialize this tuple to a buf
fn serialize(&self) -> Result<Vec<u8>, Error> {
Ok(postcard::to_allocvec(&self)?)
}
/// Deserilaize
fn deserialize(&self, serialized: &[u8]) -> Result<Self, Error> {
Ok(postcard::from_bytes(serialized)?)
}
} }
impl ObserversTuple for () { impl ObserversTuple for () {

View File

@ -159,7 +159,7 @@ where
phantom: PhantomData, phantom: PhantomData,
}, },
)?; )?;
manager.process(self)?; manager.process(self, executor)?;
Ok(()) Ok(())
} }
} }
@ -456,7 +456,7 @@ where
phantom: PhantomData, phantom: PhantomData,
}, },
)?; )?;
manager.process(self)?; manager.process(self, executor)?;
Ok(()) Ok(())
} }

View File

@ -8,9 +8,9 @@ use afl::{
bolts::{tuples::tuple_list, shmem::UnixShMem}, bolts::{tuples::tuple_list, shmem::UnixShMem},
corpus::{Corpus, InMemoryCorpus}, corpus::{Corpus, InMemoryCorpus},
events::setup_restarting_mgr, events::setup_restarting_mgr,
events::{SimpleStats}, stats::{SimpleStats},
executors::{inprocess::InProcessExecutor, Executor, ExitKind}, executors::{inprocess::InProcessExecutor, Executor, ExitKind},
feedbacks::MaxMapFeedback, feedbacks::{CrashFeedback, MaxMapFeedback},
inputs::Input, inputs::Input,
mutators::{scheduled::HavocBytesMutator, HasMaxSize}, mutators::{scheduled::HavocBytesMutator, HasMaxSize},
observers::StdMapObserver, observers::StdMapObserver,
@ -40,7 +40,7 @@ where
__lafl_edges_map[2] = 1; __lafl_edges_map[2] = 1;
if buf.len() > 1 && buf[1] == 'b' as u8 { if buf.len() > 1 && buf[1] == 'b' as u8 {
__lafl_edges_map[3] = 1; __lafl_edges_map[3] = 1;
std::process::abort(); //std::process::abort();
} }
} }
} }
@ -64,7 +64,7 @@ fn fuzz(input: Option<Vec<PathBuf>>, broker_port: u16) -> Result<(), Error> {
// The restarting state will spawn the same process again as child, then restartet it each time it crashes. // The restarting state will spawn the same process again as child, then restartet it each time it crashes.
let (state_opt, mut restarting_mgr) = let (state_opt, mut restarting_mgr) =
setup_restarting_mgr::<_, _, _, _, UnixShMem, _>(stats, broker_port).expect("Failed to setup the restarter".into()); setup_restarting_mgr::<_, _, _, _, _, _, UnixShMem, _>(stats, broker_port).expect("Failed to setup the restarter".into());
let edges_observer = let edges_observer =
StdMapObserver::new_from_ptr(&NAME_COV_MAP, unsafe { &mut __lafl_edges_map[0] as *mut u8 }, __lafl_max_edges_size as usize); StdMapObserver::new_from_ptr(&NAME_COV_MAP, unsafe { &mut __lafl_edges_map[0] as *mut u8 }, __lafl_max_edges_size as usize);
@ -78,6 +78,8 @@ fn fuzz(input: Option<Vec<PathBuf>>, broker_port: u16) -> Result<(), Error> {
&NAME_COV_MAP, &NAME_COV_MAP,
&edges_observer &edges_observer
)), )),
InMemoryCorpus::new(),
tuple_list!(CrashFeedback::new()),
) )
}, },
}; };

View File

@ -1,200 +0,0 @@
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
Connected to port 1337
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
First run. Let's set it all up
We're a client, let's fuzz :)
Loading file "./corpus/not_kitty_alpha.png" ...
Loading file "./corpus/not_kitty.png" ...
Loading file "./corpus/not_kitty_icc.png" ...
Loading file "./corpus/not_kitty_gamma.png" ...
We imported 4 inputs from disk.
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 44163 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 45491 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 46731 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 47582 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 47827 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 48092 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 49215 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 50339 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 50610 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 51319 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 51560 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 52084 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 52352 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 53343 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 55900 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 56577 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 57101 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 57367 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 58069 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 58335 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 59147 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 60457 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 60723 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 60989 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 61386 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 61643 bytes from previous instance)
We're a client, let's fuzz :)
Child crashed!
Waiting for broker...
Bye!
Workdir: "/home/andrea/Desktop/libAFLrs/fuzzers/libfuzzer_libpng"
We're a client, let's fuzz :)
Subsequent run. Let's load all data from shmem (received 62747 bytes from previous instance)
We're a client, let's fuzz :)