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() diff --git a/qiling/debugger/qdb/qdb.py b/qiling/debugger/qdb/qdb.py index 4dd516e7c..288dd4343 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) @@ -437,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]}") 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 ]")