From e3246ede0bb8167bacf7f43cfc09d2e003b06f3d Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Tue, 13 Jun 2023 21:38:30 +0200 Subject: [PATCH] eh_frame_hdr --- dlfo_eh_frame_100k_head | Bin 100000 -> 0 bytes eh_frame_hdr.bin | Bin 35124 -> 0 bytes src/arch.rs | 11 +-- src/dwarf/divination.rs | 174 +++++++++++++++++++--------------------- src/dwarf/mod.rs | 2 +- src/lib.rs | 13 ++- src/walk/fp.rs | 2 +- 7 files changed, 103 insertions(+), 99 deletions(-) delete mode 100644 dlfo_eh_frame_100k_head delete mode 100644 eh_frame_hdr.bin diff --git a/dlfo_eh_frame_100k_head b/dlfo_eh_frame_100k_head deleted file mode 100644 index 741f6f2570c02a9adf8777ad2e72dbc5eb7888b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100000 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 diff --git a/src/arch.rs b/src/arch.rs index 32ca5c0..1b8cc1a 100644 --- a/src/arch.rs +++ b/src/arch.rs @@ -1,7 +1,8 @@ use core::arch::asm; -use core::ffi; -pub fn get_rbp() -> *const usize { +use crate::Addr; + +pub(crate) fn get_rbp() -> Addr { let mut out; unsafe { asm!( @@ -10,10 +11,10 @@ pub fn get_rbp() -> *const usize { options(nostack, readonly) ); } - out + Addr(out) } -pub fn get_rip() -> *const ffi::c_void { +pub(crate) fn get_rip() -> Addr { let mut out; unsafe { asm!( @@ -22,5 +23,5 @@ pub fn get_rip() -> *const ffi::c_void { options(nostack, readonly), ); } - out + Addr(out) } diff --git a/src/dwarf/divination.rs b/src/dwarf/divination.rs index 7e37e12..e51df69 100644 --- a/src/dwarf/divination.rs +++ b/src/dwarf/divination.rs @@ -11,10 +11,12 @@ #![allow(non_camel_case_types)] -use core::{ffi, fmt, ptr::addr_of}; +use core::{ffi, fmt}; use crate::stdext::with_last_os_error_str; +use crate::Addr; + #[repr(C)] struct dl_find_object { dlfo_flags: ffi::c_ulonglong, @@ -37,62 +39,101 @@ pub struct DwarfInfo { /// The `.eh_frame_hdr` section. /// See /// and . +#[derive(Debug)] struct EhFrameHeader { version: u8, - eh_frame_ptr_enc: EhHeaderEncoded, - fde_count_enc: EhHeaderEncoded, - table_enc: EhHeaderEncoded, - encoded_fields: (), + eh_frame_ptr_enc: Encoding, + fde_count_enc: Encoding, + table_enc: Encoding, } -impl EhFrameHeader { - unsafe fn encoded_fields(&self) -> *const u8 { - addr_of!((*self).encoded_fields).cast::() - } - - unsafe fn eh_frame(&self) -> Option<*const u8> { - let ValueFormat::DW_EH_PE_sdata4 = self.eh_frame_ptr_enc.format() else { +fn eh_frame_hdr_ptr(addr: Addr) -> Option<*const EhFrameHeader> { + unsafe { + let mut out = core::mem::zeroed(); + let ret = _dl_find_object(addr.voidptr(), &mut out); + trace!("_dl_find_object returned {ret}"); + if ret != 0 { + with_last_os_error_str(|err| trace!("dl_find_object error: {err}")); return None; - }; - let ValueApplication::DW_EH_PE_pcrel = self.eh_frame_ptr_enc.application() else { + } + if out.dlfo_eh_frame.is_null() { + trace!("dlfo_eh_frame is null"); return None; - }; + } - let eh_frame_ptr = unsafe { self.encoded_fields().cast::().read_unaligned() }; + let text_len = out.dlfo_map_end as usize - out.dlfo_map_start as usize; + trace!( + "dwarf info; map: ({:p}, {:x}), dlfo_map_end: {:p}", + out.dlfo_map_start, + text_len, + out.dlfo_eh_frame + ); - Some( - self.encoded_fields() - .cast::() - .offset(eh_frame_ptr as isize), - ) - } - - fn fde_count(&self) -> Option { - let ValueFormat::DW_EH_PE_udata4 = self.fde_count_enc.format() else { + if !(out.dlfo_map_start..out.dlfo_map_end).contains(&addr.voidptr()) { + trace!("dl_find_object returned object out of range for addr: {addr:?}"); return None; - }; - let ValueApplication::DW_EH_PE_absptr = self.fde_count_enc.application() else { - return None; - }; - let fde_count = unsafe { self.encoded_fields().add(4).cast::().read() }; - Some(fde_count as _) + } + + Some(out.dlfo_eh_frame.cast::()) } } -impl fmt::Debug for EhFrameHeader { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("EhFrameHeader") - .field("version", &self.version) - .field("eh_frame_ptr_enc", &self.eh_frame_ptr_enc) - .field("fde_count_enc", &self.fde_count_enc) - .field("table_enc", &self.table_enc) - .field("fde_count", &self.fde_count()) - .finish() +pub(crate) fn dwarf_info(addr: Addr) -> Option { + unsafe { + let ptr = eh_frame_hdr_ptr(addr)?; + let header = ptr.read(); + let ptr = ptr.cast::().add(4); + + if header.version != 1 { + trace!("eh_frame_hdr version is not 1"); + return None; + } + + trace!("eh_frame_hdr: {:#?}", header); + + let (ptr, eh_frame_ptr) = read_encoded(ptr, header.eh_frame_ptr_enc); + let (_ptr, fde_count) = read_encoded(ptr, header.fde_count_enc); + + trace!("eh_frame: {eh_frame_ptr:?}"); + trace!("fde_count: {fde_count:?}"); + + trace!( + "eh_frame start: {:x?}", + core::slice::from_raw_parts(eh_frame_ptr as *const u8, 10) + ); + + crate::stdext::abort(); } } -struct EhHeaderEncoded(u8); -impl EhHeaderEncoded { +unsafe fn read_encoded(ptr: *const u8, encoding: Encoding) -> (*const u8, usize) { + let (new_ptr, value) = match encoding.format() { + ValueFormat::DW_EH_PE_uleb128 => todo!("uleb128"), + ValueFormat::DW_EH_PE_udata2 => (ptr.add(2), ptr.cast::().read_unaligned() as usize), + ValueFormat::DW_EH_PE_udata4 => (ptr.add(4), ptr.cast::().read_unaligned() as usize), + ValueFormat::DW_EH_PE_udata8 => (ptr.add(8), ptr.cast::().read_unaligned() as usize), + ValueFormat::DW_EH_PE_sleb128 => todo!("sleb128"), + ValueFormat::DW_EH_PE_sdata2 => (ptr.add(2), ptr.cast::().read_unaligned() as usize), + ValueFormat::DW_EH_PE_sdata4 => (ptr.add(4), ptr.cast::().read_unaligned() as usize), + ValueFormat::DW_EH_PE_sdata8 => (ptr.add(8), ptr.cast::().read_unaligned() as usize), + }; + + trace!("{ptr:p}, {value}"); + + let value = match encoding.application() { + ValueApplication::DW_EH_PE_absptr => value, + ValueApplication::DW_EH_PE_pcrel => ((value as isize) + (ptr as isize)) as usize, + ValueApplication::DW_EH_PE_textrel => todo!("textrel"), + ValueApplication::DW_EH_PE_datarel => todo!("datarel"), + ValueApplication::DW_EH_PE_funcrel => todo!("funcrel"), + ValueApplication::DW_EH_PE_aligned => todo!("aligned"), + }; + + (new_ptr, value) +} + +struct Encoding(u8); +impl Encoding { fn format(&self) -> ValueFormat { match self.0 & 0b1111 { 0x01 => ValueFormat::DW_EH_PE_uleb128, @@ -119,59 +160,12 @@ impl EhHeaderEncoded { } } -impl fmt::Debug for EhHeaderEncoded { +impl fmt::Debug for Encoding { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?} | {:?}", self.application(), self.format()) } } -pub fn dwarf_info(addr: *const ffi::c_void) -> Option { - unsafe { - let mut out = core::mem::zeroed(); - let ret = _dl_find_object(addr, &mut out); - trace!("_dl_find_object returned {ret}"); - if ret != 0 { - with_last_os_error_str(|err| trace!("dl_find_object error: {err}")); - return None; - } - if out.dlfo_eh_frame.is_null() { - trace!("dlfo_eh_frame is null"); - return None; - } - - let text_len = out.dlfo_map_end as usize - out.dlfo_map_start as usize; - trace!( - "dwarf info; map: ({:p}, {:x}), dlfo_map_end: {:p}", - out.dlfo_map_start, - text_len, - out.dlfo_eh_frame - ); - - if !(out.dlfo_map_start..out.dlfo_map_end).contains(&addr) { - trace!("dl_find_object returned object out of range for addr: {addr:p}"); - return None; - } - - let header = &*out.dlfo_eh_frame.cast::(); - - if header.version != 1 { - trace!("eh_frame_hdr version is not 1"); - return None; - } - trace!("eh_frame_hdr: {:#?}", header); - - let Some(ptr) = header.eh_frame() else { - trace!("could not find .eh_frame"); - return None; - }; - trace!("eh_frame pointer: {ptr:?}"); - - trace!("eh_frame start: {:?}", core::slice::from_raw_parts(ptr, 10)); - - crate::stdext::abort(); - } -} - #[derive(Debug, Clone, Copy)] #[repr(u8)] enum ValueFormat { diff --git a/src/dwarf/mod.rs b/src/dwarf/mod.rs index ca224b4..da28389 100644 --- a/src/dwarf/mod.rs +++ b/src/dwarf/mod.rs @@ -6,7 +6,7 @@ mod divination; mod parse; -pub use divination::{dwarf_info, DwarfInfo}; +pub(crate) use divination::dwarf_info; pub unsafe fn uwutables(eh_frame: *const u8) { trace!("getting uwutables from {:p}", eh_frame); diff --git a/src/lib.rs b/src/lib.rs index 992b608..53089eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ #![no_std] #![allow(dead_code)] -use core::sync::atomic::AtomicPtr; +use core::{ffi, sync::atomic::AtomicPtr}; // Get the macros into our local prelude. #[macro_use] @@ -15,12 +15,21 @@ mod identify; mod walk; +#[derive(Debug, Clone, Copy)] +struct Addr(*const ()); + +impl Addr { + fn voidptr(self) -> *const ffi::c_void { + self.0.cast() + } +} + #[allow(nonstandard_style)] pub unsafe extern "C" fn _UnwindRaiseException( exception_object: *mut uw::_Unwind_Exception, ) -> uw::_Unwind_Reason_Code { trace!("someone raised an exception with addr {exception_object:p}"); - let _di = crate::dwarf::dwarf_info(arch::get_rip() as _).unwrap(); + let _di = crate::dwarf::dwarf_info(arch::get_rip()).unwrap(); crate::dwarf::uwutables(core::ptr::null()); stdext::abort(); diff --git a/src/walk/fp.rs b/src/walk/fp.rs index fd39fec..65d4342 100644 --- a/src/walk/fp.rs +++ b/src/walk/fp.rs @@ -4,7 +4,7 @@ use crate::arch::get_rbp; use crate::stdext::trace; pub(crate) unsafe fn walk() { - let mut current_rbp = get_rbp(); + let mut current_rbp = get_rbp().0.cast::(); loop { trace!("walk... rbp={current_rbp:p}");