frida: modules may be relative paths; move to ahash for filenames; fix tls bug

This commit is contained in:
s1341 2021-04-30 15:35:40 +03:00
parent cdbbcd03a8
commit dea96ab59c
4 changed files with 30 additions and 20 deletions

View File

@ -197,9 +197,10 @@ pub fn main() {
env::args() env::args()
.nth(3) .nth(3)
.expect("no modules to instrument specified") .expect("no modules to instrument specified")
.split(":") .split(':')
.map(|module_name| std::fs::canonicalize(module_name).unwrap())
.collect(), .collect(),
vec![PathBuf::from("./corpus")], &vec![PathBuf::from("./corpus")],
PathBuf::from("./crashes"), PathBuf::from("./crashes"),
1337, 1337,
) )
@ -224,8 +225,8 @@ fn fuzz(
unsafe fn fuzz( unsafe fn fuzz(
module_name: &str, module_name: &str,
symbol_name: &str, symbol_name: &str,
modules_to_instrument: Vec<&str>, modules_to_instrument: Vec<PathBuf>,
corpus_dirs: Vec<PathBuf>, corpus_dirs: &Vec<PathBuf>,
objective_dir: PathBuf, objective_dir: PathBuf,
broker_port: u16, broker_port: u16,
) -> Result<(), Error> { ) -> Result<(), Error> {

View File

@ -27,7 +27,7 @@ termcolor = "1.1.2"
serde = "1.0" serde = "1.0"
backtrace = { version = "0.3.58", default-features = false, features = ["std", "serde"] } backtrace = { version = "0.3.58", default-features = false, features = ["std", "serde"] }
num-traits = "0.2.14" num-traits = "0.2.14"
seahash = "4.1.0" ahash = "0.7"
[target.'cfg(unix)'.dependencies] [target.'cfg(unix)'.dependencies]
gothook = { version = "0.1" } gothook = { version = "0.1" }

View File

@ -31,6 +31,7 @@ use std::{
cell::{RefCell, RefMut}, cell::{RefCell, RefMut},
ffi::c_void, ffi::c_void,
io::{self, Write}, io::{self, Write},
path::PathBuf,
rc::Rc, rc::Rc,
}; };
use termcolor::{Color, ColorSpec, WriteColor}; use termcolor::{Color, ColorSpec, WriteColor};
@ -697,7 +698,7 @@ impl AsanRuntime {
/// Initialize the runtime so that it is read for action. Take care not to move the runtime /// Initialize the runtime so that it is read for action. Take care not to move the runtime
/// instance after this function has been called, as the generated blobs would become /// instance after this function has been called, as the generated blobs would become
/// invalid! /// invalid!
pub fn init(&mut self, modules_to_instrument: &[&str]) { pub fn init(&mut self, modules_to_instrument: &[PathBuf]) {
// workaround frida's frida-gum-allocate-near bug: // workaround frida's frida-gum-allocate-near bug:
unsafe { unsafe {
for _ in 0..512 { for _ in 0..512 {
@ -730,7 +731,7 @@ impl AsanRuntime {
self.unpoison_all_existing_memory(); self.unpoison_all_existing_memory();
for module_name in modules_to_instrument { for module_name in modules_to_instrument {
#[cfg(unix)] #[cfg(unix)]
self.hook_library(module_name); self.hook_library(module_name.to_str().unwrap());
} }
} }
@ -786,15 +787,14 @@ impl AsanRuntime {
pub fn register_thread(&self) { pub fn register_thread(&self) {
let mut allocator = Allocator::get(); let mut allocator = Allocator::get();
let (stack_start, stack_end) = Self::current_stack(); let (stack_start, stack_end) = Self::current_stack();
println!("current stack: {:#016x}-{:#016x}", stack_start, stack_end);
allocator.map_shadow_for_region(stack_start, stack_end, true); allocator.map_shadow_for_region(stack_start, stack_end, true);
//let (tls_start, tls_end) = Self::current_tls(); let (tls_start, tls_end) = Self::current_tls();
//allocator.map_shadow_for_region(tls_start, tls_end, true); allocator.map_shadow_for_region(tls_start, tls_end, true);
//println!( println!(
//"registering thread with stack {:x}:{:x} and tls {:x}:{:x}", "registering thread with stack {:x}:{:x} and tls {:x}:{:x}",
//stack_start as usize, stack_end as usize, tls_start as usize, tls_end as usize stack_start as usize, stack_end as usize, tls_start as usize, tls_end as usize
//); );
} }
/// Determine the stack start, end for the currently running thread /// Determine the stack start, end for the currently running thread
@ -829,6 +829,9 @@ impl AsanRuntime {
/// Determine the tls start, end for the currently running thread /// Determine the tls start, end for the currently running thread
fn current_tls() -> (usize, usize) { fn current_tls() -> (usize, usize) {
let tls_address = unsafe { get_tls_ptr() } as usize; let tls_address = unsafe { get_tls_ptr() } as usize;
// we need to mask off the highest byte, due to 'High Byte Ignore"
#[cfg(target_os = "android")]
let tls_address = tls_address & 0xffffffffffffff;
let (start, end, _, _) = find_mapping_for_address(tls_address).unwrap(); let (start, end, _, _) = find_mapping_for_address(tls_address).unwrap();
(start, end) (start, end)

View File

@ -1,3 +1,6 @@
use ahash::AHasher;
use std::hash::Hasher;
use libafl::inputs::{HasTargetBytes, Input}; use libafl::inputs::{HasTargetBytes, Input};
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
@ -26,7 +29,7 @@ use frida_gum::{Gum, Module, PageProtection};
use num_traits::cast::FromPrimitive; use num_traits::cast::FromPrimitive;
use rangemap::RangeMap; use rangemap::RangeMap;
use std::rc::Rc; use std::{path::PathBuf, rc::Rc};
use crate::{asan_rt::AsanRuntime, FridaOptions}; use crate::{asan_rt::AsanRuntime, FridaOptions};
@ -82,9 +85,12 @@ impl<'a> FridaHelper<'a> for FridaInstrumentationHelper<'a> {
fn post_exec<I: Input + HasTargetBytes>(&mut self, input: &I) { fn post_exec<I: Input + HasTargetBytes>(&mut self, input: &I) {
if self.options.drcov_enabled() { if self.options.drcov_enabled() {
let mut hasher = AHasher::new_with_keys(0, 0);
hasher.write(input.target_bytes().as_slice());
let filename = format!( let filename = format!(
"./coverage/{:016x}.drcov", "./coverage/{:016x}.drcov",
seahash::hash(input.target_bytes().as_slice()) hasher.finish(),
); );
DrCovWriter::new(&filename, &self.ranges, &mut self.drcov_basic_blocks).write(); DrCovWriter::new(&filename, &self.ranges, &mut self.drcov_basic_blocks).write();
} }
@ -193,7 +199,7 @@ impl<'a> FridaInstrumentationHelper<'a> {
gum: &'a Gum, gum: &'a Gum,
options: FridaOptions, options: FridaOptions,
_harness_module_name: &str, _harness_module_name: &str,
modules_to_instrument: &'a [&str], modules_to_instrument: &'a [PathBuf],
) -> Self { ) -> Self {
let mut helper = Self { let mut helper = Self {
map: [0u8; MAP_SIZE], map: [0u8; MAP_SIZE],
@ -214,11 +220,11 @@ impl<'a> FridaInstrumentationHelper<'a> {
if options.stalker_enabled() { if options.stalker_enabled() {
for (id, module_name) in modules_to_instrument.iter().enumerate() { for (id, module_name) in modules_to_instrument.iter().enumerate() {
let (lib_start, lib_end) = find_mapping_for_path(module_name); let (lib_start, lib_end) = find_mapping_for_path(module_name.to_str().unwrap());
println!("including range {:x}-{:x} for {}", lib_start, lib_end, module_name); println!("including range {:x}-{:x} for {:?}", lib_start, lib_end, module_name);
helper helper
.ranges .ranges
.insert(lib_start..lib_end, (id as u16, module_name)); .insert(lib_start..lib_end, (id as u16, module_name.to_str().unwrap()));
} }
if helper.options.drcov_enabled() { if helper.options.drcov_enabled() {