introduce INPUT_BYTES_OFFSET constant

This commit is contained in:
Alwin Berger 2022-06-06 00:42:45 +02:00
parent 2466fc5cb6
commit eb3914e5c1
5 changed files with 38 additions and 22 deletions

View File

@ -34,6 +34,7 @@ use wcet_qemu_sys::sysstate::helpers::QemuSystemStateHelper;
use wcet_qemu_sys::sysstate::observers::QemuSysStateObserver; use wcet_qemu_sys::sysstate::observers::QemuSysStateObserver;
use wcet_qemu_sys::sysstate::feedbacks::SysStateFeedbackState; use wcet_qemu_sys::sysstate::feedbacks::SysStateFeedbackState;
use wcet_qemu_sys::sysstate::feedbacks::NovelSysStateFeedback; use wcet_qemu_sys::sysstate::feedbacks::NovelSysStateFeedback;
use wcet_qemu_sys::sysstate::INPUT_BYTES_OFFSET;
use wcet_qemu_sys::worst::QemuHashMapObserver; use wcet_qemu_sys::worst::QemuHashMapObserver;
use wcet_qemu_sys::minimizer::QemuCaseMinimizerStage; use wcet_qemu_sys::minimizer::QemuCaseMinimizerStage;
use hashbrown::HashMap; use hashbrown::HashMap;
@ -530,6 +531,7 @@ fn fuzz(
let mut buf = target.as_slice(); let mut buf = target.as_slice();
let mut len = buf.len(); let mut len = buf.len();
let mut int_tick : Option<u32> = None; let mut int_tick : Option<u32> = None;
if INPUT_BYTES_OFFSET!= 0 {
if len > 2 { if len > 2 {
let mut t : [u8; 4] = [0,0,0,0]; // 4 extra bytes determine the tick to execute an interrupt let mut t : [u8; 4] = [0,0,0,0]; // 4 extra bytes determine the tick to execute an interrupt
t[0]=buf[0]; t[0]=buf[0];
@ -538,13 +540,16 @@ fn fuzz(
buf = &buf[2..]; buf = &buf[2..];
len = buf.len(); len = buf.len();
} }
}
if len >= 32 { if len >= 32 {
buf = &buf[0..32]; buf = &buf[0..32];
len = 32; len = 32;
} }
unsafe { unsafe {
if INPUT_BYTES_OFFSET!= 0 {
libafl_int_offset = 347780+int_tick.unwrap_or(0); libafl_int_offset = 347780+int_tick.unwrap_or(0);
}
// INTR_OFFSET = int_tick; // INTR_OFFSET = int_tick;
emu.write_mem(test_length_ptr,&(len as u32).to_le_bytes()); emu.write_mem(test_length_ptr,&(len as u32).to_le_bytes());
emu.write_mem(input_addr,buf); emu.write_mem(input_addr,buf);
@ -610,7 +615,7 @@ fn fuzz(
// let tracing = ShadowTracingStage::new(&mut executor); // let tracing = ShadowTracingStage::new(&mut executor);
// The order of the stages matter! // The order of the stages matter!
let mut stages = tuple_list!(QemuCaseMinimizerStage::new(16),mutation); let mut stages = tuple_list!(mutation,QemuCaseMinimizerStage::new(16));
// Remove target ouput (logs still survive) // Remove target ouput (logs still survive)
#[cfg(unix)] #[cfg(unix)]
@ -642,6 +647,7 @@ fn fuzz(
.unwrap(); .unwrap();
let newgraph = feedbackstate.graph.map( let newgraph = feedbackstate.graph.map(
|_, n| n.get_taskname(), |_, n| n.get_taskname(),
// |_, n| format!("{} {:?}",n.get_taskname(),n.get_input_counts().iter().min().unwrap_or(&0)),
|_, e| e, |_, e| e,
); );
let tempg = format!("{:?}",Dot::with_config(&newgraph, &[Config::EdgeNoLabel])); let tempg = format!("{:?}",Dot::with_config(&newgraph, &[Config::EdgeNoLabel]));

View File

@ -4,6 +4,7 @@ use wcet_qemu_sys::sysstate::helpers::INTR_OFFSET;
use std::io::Read; use std::io::Read;
use wcet_qemu_sys::sysstate::observers::QemuSysStateObserver; use wcet_qemu_sys::sysstate::observers::QemuSysStateObserver;
use wcet_qemu_sys::sysstate::feedbacks::DumpSystraceFeedback; use wcet_qemu_sys::sysstate::feedbacks::DumpSystraceFeedback;
use wcet_qemu_sys::sysstate::INPUT_BYTES_OFFSET;
use wcet_qemu_sys::worst::QemuHashMapObserver; use wcet_qemu_sys::worst::QemuHashMapObserver;
use wcet_qemu_sys::{ use wcet_qemu_sys::{
worst::{DumpMapFeedback,DummyFeedback}, worst::{DumpMapFeedback,DummyFeedback},
@ -339,6 +340,7 @@ fn fuzz(
let mut buf = target.as_slice(); let mut buf = target.as_slice();
let mut len = buf.len(); let mut len = buf.len();
let mut int_tick : Option<u32> = None; let mut int_tick : Option<u32> = None;
if INPUT_BYTES_OFFSET!= 0 {
if len > 2 { if len > 2 {
let mut t : [u8; 4] = [0,0,0,0]; // 4 extra bytes determine the tick to execute an interrupt let mut t : [u8; 4] = [0,0,0,0]; // 4 extra bytes determine the tick to execute an interrupt
t[0]=buf[0]; t[0]=buf[0];
@ -347,13 +349,16 @@ fn fuzz(
buf = &buf[2..]; buf = &buf[2..];
len = buf.len(); len = buf.len();
} }
}
if len >= 32 { if len >= 32 {
buf = &buf[0..32]; buf = &buf[0..32];
len = 32; len = 32;
} }
unsafe { unsafe {
// libafl_int_offset = 347780+int_tick.unwrap_or(0); if INPUT_BYTES_OFFSET!= 0 {
libafl_int_offset = 347780+int_tick.unwrap_or(0);
}
// INTR_OFFSET = int_tick; // INTR_OFFSET = int_tick;
emu.write_mem(test_length_ptr,&(len as u32).to_le_bytes()); emu.write_mem(test_length_ptr,&(len as u32).to_le_bytes());
emu.write_mem(input_addr,buf); emu.write_mem(input_addr,buf);

View File

@ -104,6 +104,9 @@ impl SysGraphNode {
pub fn get_taskname(&self) -> &str { pub fn get_taskname(&self) -> &str {
&self.base.current_task.task_name &self.base.current_task.task_name
} }
pub fn get_input_counts(&self) -> Vec<u32> {
self.variants.iter().map(|x| x.input_counter).collect()
}
} }
impl PartialEq for SysGraphNode { impl PartialEq for SysGraphNode {
fn eq(&self, other: &SysGraphNode) -> bool { fn eq(&self, other: &SysGraphNode) -> bool {
@ -456,13 +459,12 @@ where
let mut collection : Vec<Vec<u8>> = Vec::new(); let mut collection : Vec<Vec<u8>> = Vec::new();
let mut current_pointer : usize = 0; let mut current_pointer : usize = 0;
let INPUT_BYTES_OFFSET = 0; // Offset for interrupt bytes
for t in &trace.inner { for t in &trace.inner {
let node = &g[*t]; let node = &g[*t];
for v in &node.variants { for v in &node.variants {
if v.input == input.bytes() { if v.input == input.bytes() {
if v.input_counter > current_pointer.try_into().unwrap() { if v.input_counter > current_pointer.try_into().unwrap() {
collection.push(v.input[INPUT_BYTES_OFFSET+current_pointer..INPUT_BYTES_OFFSET+v.input_counter as usize].to_owned()); collection.push(v.input[current_pointer..v.input_counter as usize].to_owned());
current_pointer = v.input_counter as usize; current_pointer = v.input_counter as usize;
} }
break; break;
@ -474,7 +476,7 @@ where
collection[index_to_mutate][i] = myrand.below(0xFF) as u8; collection[index_to_mutate][i] = myrand.below(0xFF) as u8;
} }
for i in collection.concat().iter().enumerate() { for i in collection.concat().iter().enumerate() {
input.bytes_mut()[INPUT_BYTES_OFFSET+i.0]=*i.1; input.bytes_mut()[i.0]=*i.1;
} }
Ok(MutationResult::Mutated) Ok(MutationResult::Mutated)
@ -547,7 +549,7 @@ where
// follow the path, extract snippets from last reads, find common snippets. // follow the path, extract snippets from last reads, find common snippets.
// those are likley keys parts. choose random parts from other sibling traces // those are likley keys parts. choose random parts from other sibling traces
let inp_c_end = g[*trace.inner.last().unwrap()].base.input_counter; let inp_c_end = g[*trace.inner.last().unwrap()].base.input_counter;
let mut num_to_reverse = 1; let mut num_to_reverse = myrand.below(trace.inner.len().try_into().unwrap());
for t in trace.inner.iter().rev() { for t in trace.inner.iter().rev() {
let int_c_prefix = g[*t].base.input_counter; let int_c_prefix = g[*t].base.input_counter;
if int_c_prefix < inp_c_end { if int_c_prefix < inp_c_end {

View File

@ -15,6 +15,8 @@ pub mod observers;
pub mod feedbacks; pub mod feedbacks;
pub mod graph; pub mod graph;
pub const INPUT_BYTES_OFFSET : u32 = 2; // Offset for interrupt bytes
// Constants // Constants
const NUM_PRIOS: usize = 5; const NUM_PRIOS: usize = 5;

View File

@ -1,3 +1,4 @@
use crate::sysstate::INPUT_BYTES_OFFSET;
use libafl::inputs::HasTargetBytes; use libafl::inputs::HasTargetBytes;
use libafl::bolts::HasLen; use libafl::bolts::HasLen;
use libafl::bolts::tuples::Named; use libafl::bolts::tuples::Named;
@ -129,7 +130,7 @@ for mut i in input.drain(..) {
start_tick: start_tick, start_tick: start_tick,
end_tick: i.qemu_tick, end_tick: i.qemu_tick,
ready_list_after: collector, ready_list_after: collector,
input_counter: i.input_counter, input_counter: i.input_counter+INPUT_BYTES_OFFSET,
last_pc: i.last_pc, last_pc: i.last_pc,
}); });
start_tick=i.qemu_tick; start_tick=i.qemu_tick;