From 6eb5b6b1437251f6173ba7373922840a5e314479 Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Thu, 20 Oct 2022 15:35:26 +0800 Subject: [PATCH 1/4] handle x/s case in qdb --- qiling/debugger/qdb/memory.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/qiling/debugger/qdb/memory.py b/qiling/debugger/qdb/memory.py index 9dbece6a9..e26f49302 100644 --- a/qiling/debugger/qdb/memory.py +++ b/qiling/debugger/qdb/memory.py @@ -167,8 +167,19 @@ def parse(self, line: str): for each in output: print(f"0x{each.address:x}: {each.mnemonic}\t{each.op_str}") + elif ft == "s": + # handle read c-style string + try: + print(f"0x{addr:08x}: {self.ql.os.utils.read_cstring(addr)}") + except: + return f"error reading c-style string at 0x{addr:08x}" + else: lines = 1 if ct <= 4 else math.ceil(ct / 4) + # parse command + prefix = "0x" if ft in ("x", "a") else "" + pad = '0' + str(sz*2) if ft in ('x', 'a', 't') else '' + ft = ft.lower() if ft in ("x", "o", "b", "d") else ft.lower().replace("t", "b").replace("a", "x") mem_read = [] for offset in range(ct): @@ -186,9 +197,6 @@ def parse(self, line: str): idx = line * self.ql.arch.pointersize for each in mem_read[idx:idx+self.ql.arch.pointersize]: data = self.fmt_unpack(each, sz) - prefix = "0x" if ft in ("x", "a") else "" - pad = '0' + str(sz*2) if ft in ('x', 'a', 't') else '' - ft = ft.lower() if ft in ("x", "o", "b", "d") else ft.lower().replace("t", "b").replace("a", "x") print(f"{prefix}{data:{pad}{ft}}\t", end="") print() From a261e4aae8f096d101fe1f8c15812400a610d173 Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Thu, 20 Oct 2022 15:36:14 +0800 Subject: [PATCH 2/4] remove redundant print and prefix R when dumping stack --- qiling/debugger/qdb/render/render.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qiling/debugger/qdb/render/render.py b/qiling/debugger/qdb/render/render.py index 393e7707b..3d5e67d6f 100644 --- a/qiling/debugger/qdb/render/render.py +++ b/qiling/debugger/qdb/render/render.py @@ -100,7 +100,7 @@ def render_stack_dump(self, arch_sp: int) -> None: if (val := self.try_read_pointer(addr)[0]): # defined to be try_read_pointer(addr)[0] - dereferneces pointer # @TODO: Bug here where the values on the stack are being displayed in 32-bit format - print(f"RSP + 0x{idx*self.pointersize:02x}│ [0x{addr:08x}] —▸ 0x{self.unpack(val):08x}", end="") + print(f"SP + 0x{idx*self.pointersize:02x}│ [0x{addr:08x}] —▸ 0x{self.unpack(val):08x}", end="") # try to dereference wether it's a pointer if (buf := self.try_read_pointer(addr))[0] is not None: @@ -188,7 +188,6 @@ def context_stack(self) -> None: display context stack dump """ - print(f"{self.ql.arch.regs.arch_sp:x}") self.render_stack_dump(self.ql.arch.regs.arch_sp) @Render.divider_printer("[ REGISTERS ]") From 5e30ea41eec333ffdb40f301a74fbc226fad51af Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Thu, 20 Oct 2022 15:36:59 +0800 Subject: [PATCH 3/4] handle delay slot properly both in command step_in and step_over --- qiling/debugger/qdb/qdb.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/qiling/debugger/qdb/qdb.py b/qiling/debugger/qdb/qdb.py index 4dd516e7c..be852726d 100644 --- a/qiling/debugger/qdb/qdb.py +++ b/qiling/debugger/qdb/qdb.py @@ -229,8 +229,12 @@ def do_step_in(self, *args) -> Optional[bool]: if self.ql.arch == QL_ARCH.CORTEX_M: self.ql.arch.step() else: - self._run(count=1) + step = 1 + # make sure follow branching + if prophecy.going is True and self.ql.arch.type == QL_ARCH.MIPS: + step += 1 + self._run(count=step) self.do_context() @SnapshotManager.snapshot @@ -245,7 +249,12 @@ def do_step_over(self, *args) -> Optional[bool]: if prophecy.going: cur_insn = self.predictor.disasm(self.cur_addr) - self.set_breakpoint(self.cur_addr + cur_insn.size, is_temp=True) + bp_addr = self.cur_addr + cur_insn.size + + if self.ql.arch.type == QL_ARCH.MIPS: + bp_addr += cur_insn.size + + self.set_breakpoint(bp_addr, is_temp=True) else: self.set_breakpoint(prophecy.where, is_temp=True) From c8612f0d3be3232152862364d453bd6a350e9fd6 Mon Sep 17 00:00:00 2001 From: ucgJhe Date: Thu, 20 Oct 2022 15:38:11 +0800 Subject: [PATCH 4/4] display map info in command show --- qiling/debugger/qdb/qdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiling/debugger/qdb/qdb.py b/qiling/debugger/qdb/qdb.py index be852726d..288dd4343 100644 --- a/qiling/debugger/qdb/qdb.py +++ b/qiling/debugger/qdb/qdb.py @@ -446,7 +446,7 @@ def do_show(self, *args) -> None: """ for info_line in self.ql.mem.get_formatted_mapinfo(): - self.ql.log.info(info_line) + qdb_print(QDB_MSG.INFO, info_line) qdb_print(QDB_MSG.INFO, f"Breakpoints: {[hex(addr) for addr in self.bp_list.keys()]}") qdb_print(QDB_MSG.INFO, f"Marked symbol: {[{key:hex(val)} for key,val in self.marker.mark_list]}")