Skip to content

Commit 1f18b37

Browse files
Merge pull request #127 from wcampbell0x2a/deref-all-of-the-strings
2 parents 62687f9 + e3a6083 commit 1f18b37

File tree

6 files changed

+72
-19
lines changed

6 files changed

+72
-19
lines changed

images/screenshot.png

11 KB
Loading

src/gdb.rs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ fn recv_exec_result_memory(
411411
let last_written = written.pop_front().unwrap();
412412

413413
match last_written {
414-
Written::RegisterValue((base_reg, _n)) => {
414+
Written::RegisterValue((base_reg, begin)) => {
415415
debug!("new register val for {base_reg}");
416416
let thirty = thirty_two_bit.load(Ordering::Relaxed);
417417
let mut regs = registers_arc.lock().unwrap();
@@ -464,6 +464,26 @@ fn recv_exec_result_memory(
464464
}
465465
}
466466

467+
// all string? Request the next
468+
if val > 0xff {
469+
let bytes = val.to_le_bytes();
470+
if bytes.iter().all(|a| {
471+
a.is_ascii_alphabetic()
472+
|| a.is_ascii_graphic()
473+
|| a.is_ascii_whitespace()
474+
}) {
475+
let addr =
476+
data["begin"].strip_prefix("0x").unwrap().to_string();
477+
let addr = u64::from_str_radix(&addr, 16).unwrap();
478+
next_write.push(data_read_memory_bytes(addr + len, 0, len));
479+
written.push_back(Written::RegisterValue((
480+
reg.number.clone(),
481+
val,
482+
)));
483+
return;
484+
}
485+
}
486+
467487
if !is_code && val != 0 {
468488
// TODO: endian
469489
debug!("register deref: trying to read: {:02x}", val);
@@ -582,7 +602,23 @@ fn update_stack(
582602
return;
583603
}
584604
}
585-
// TODO: endian?
605+
606+
// all string? Request the next
607+
if val > 0xff {
608+
let bytes = val.to_le_bytes();
609+
if bytes
610+
.iter()
611+
.all(|a| a.is_ascii_alphabetic() || a.is_ascii_graphic() || a.is_ascii_whitespace())
612+
{
613+
let addr = data["begin"].strip_prefix("0x").unwrap().to_string();
614+
let addr = u64::from_str_radix(&addr, 16).unwrap();
615+
next_write.push(data_read_memory_bytes(addr + len, 0, len));
616+
written.push_back(Written::Stack(Some(begin)));
617+
return;
618+
}
619+
}
620+
621+
// regular value to request
586622
debug!("stack deref: trying to read as data: {val:02x}");
587623
next_write.push(data_read_memory_bytes(val, 0, len));
588624
written.push_back(Written::Stack(Some(begin)));
@@ -651,6 +687,7 @@ fn recv_exec_results_register_values(
651687
}
652688
}
653689
if !asked_for_code {
690+
// just a value
654691
next_write.push(data_read_memory_bytes(val_u32 as u64, 0, 4));
655692
written.push_back(Written::RegisterValue((
656693
r.number.clone(),
@@ -689,6 +726,7 @@ fn recv_exec_results_register_values(
689726
}
690727
}
691728
if !asked_for_code {
729+
// just a value
692730
next_write.push(data_read_memory_bytes(val_u64, 0, 8));
693731
written
694732
.push_back(Written::RegisterValue((r.number.clone(), val_u64)));

src/main.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,19 +1191,29 @@ mod tests {
11911191
);
11921192
let output = output.replace(&from, "<rbp_0>");
11931193

1194+
// rdx
11941195
let from = format!("0x{:02x}", registers[3].deref.map[0]);
11951196
let output = output.replace(&from, "<rdx_1>");
1196-
let from = std::str::from_utf8(&registers[3].deref.map[1].to_le_bytes())
1197-
.unwrap()
1198-
.to_string();
1199-
let output = output.replace(&from, "<rdx_2>");
1197+
let mut ret_s = "\"".to_string();
1198+
for r in registers[3].deref.map.iter().skip(1) {
1199+
ret_s.push_str(std::str::from_utf8(&r.to_le_bytes()).unwrap());
1200+
}
1201+
ret_s.push_str("\"");
1202+
let padding_width = ret_s.len() + 7;
1203+
let output = output
1204+
.replace(&ret_s, &format!("<rdx_2>{:padding$}", "", padding = padding_width));
12001205

1206+
// rsi
12011207
let from = format!("0x{:02x}", registers[4].deref.map[0]);
12021208
let output = output.replace(&from, "<rsi_1>");
1203-
let from = std::str::from_utf8(&registers[4].deref.map[1].to_le_bytes())
1204-
.unwrap()
1205-
.to_string();
1206-
let output = output.replace(&from, "<rsi_2>");
1209+
let mut ret_s = "\"".to_string();
1210+
for r in registers[4].deref.map.iter().skip(1) {
1211+
ret_s.push_str(std::str::from_utf8(&r.to_le_bytes()).unwrap());
1212+
}
1213+
ret_s.push_str("\"");
1214+
let padding_width = ret_s.len() + 7;
1215+
let output = output
1216+
.replace(&ret_s, &format!("<rsi_2>{:padding$}", "", padding = padding_width));
12071217

12081218
let from = format!("0x{:02x}", registers[6].deref.map[0]);
12091219
let output = output.replace(&from, "<rbp_1>");

src/snapshots/heretek__tests__render_app.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ snapshot_kind: text
99
" rax → 0x401825 → main+0 (push %rbp) "
1010
" rbx → 0x1 "
1111
" rcx → <rcx_0> → 0x04 "
12-
" rdx → <rdx_0> → <rdx_1> → "<rdx_2>" "
13-
" rsi → <rsi_0> → <rsi_1> → "<rsi_2>" "
12+
" rdx → <rdx_0> → <rdx_1> → <rdx_2> "
13+
" rsi → <rsi_0> → <rsi_1> → <rsi_2> "
1414
" rdi → 0x1 "
1515
" rbp → <stack_8> → <rbp_1> → <rbp_2> → 0x00 "
1616
" rsp → <stack_0> → <stack_6> → <stack_6_0> → <stack_6_1> → <rbp_1> → <rbp_2> → 0x00 "

src/ui/mod.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,18 +133,24 @@ pub fn add_deref_to_span(
133133
width: usize,
134134
) {
135135
for (i, v) in deref.map.iter().enumerate() {
136-
// check if ascii if last deref
137-
if i + 1 == deref.map.len() && *v > 0xff {
136+
// check if ascii
137+
if *v > 0xff {
138138
let bytes = (*v).to_le_bytes();
139139
if bytes
140140
.iter()
141141
.all(|a| a.is_ascii_alphabetic() || a.is_ascii_graphic() || a.is_ascii_whitespace())
142142
{
143-
if let Ok(s) = std::str::from_utf8(&bytes) {
144-
let cell = Span::from(format!("→ \"{}\"", s)).style(Style::new().fg(YELLOW));
145-
spans.push(cell);
146-
continue;
143+
// if we detect it's ascii, the rest is ascii
144+
let mut full_s = String::new();
145+
for r in deref.map.iter().skip(i) {
146+
let bytes = (*r).to_le_bytes();
147+
if let Ok(s) = std::str::from_utf8(&bytes) {
148+
full_s.push_str(s);
149+
}
147150
}
151+
let cell = Span::from(format!("→ \"{}\"", full_s)).style(Style::new().fg(YELLOW));
152+
spans.push(cell);
153+
return;
148154
}
149155
}
150156

src/ui/registers.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use std::sync::atomic::Ordering;
33

44
use super::{add_deref_to_span, apply_val_color, ORANGE, PURPLE, RED};
55

6-
use log::debug;
76
use ratatui::prelude::Stylize;
87
use ratatui::text::{Line, Span, Text};
98
use ratatui::widgets::{Block, Borders, Paragraph};

0 commit comments

Comments
 (0)