Fix bug in writing to PC under LLDB (#2481)

pull/2482/head
Matt. 1 year ago committed by GitHub
parent dcc8db7021
commit 14ba7ac86a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -24,6 +24,7 @@ import pwndbg
import pwndbg.lib.memory
from pwndbg.aglib import load_aglib
from pwndbg.dbg import selection
from pwndbg.lib.regs import reg_sets
T = TypeVar("T")
@ -95,6 +96,7 @@ class LLDBFrame(pwndbg.dbg_mod.Frame):
proc: LLDBProcess
def __init__(self, inner: lldb.SBFrame, proc: LLDBProcess):
assert inner.IsValid()
self.inner = inner
self.proc = proc
@ -119,6 +121,12 @@ class LLDBFrame(pwndbg.dbg_mod.Frame):
if val < 0:
raise RuntimeError("Tried to write a register with a negative value")
# Writing to the PC using the normal register write flow causes the
# inner object to be automatically invalidated by LLDB, so we have to
# handle jumps manually using SBFrame::SetPC.
if name.lower() == reg_sets[pwndbg.aglib.arch.name].pc:
return self.inner.SetPC(val)
name = rename_register(name, self.proc)
# This one is quite bad. LLDB register writes happen through the private
@ -171,6 +179,14 @@ class LLDBFrame(pwndbg.dbg_mod.Frame):
f"could not set value of register '{name}' to '{val}': {error}"
)
# We know this register got written to, we can trigger this
# event.
self.proc.dbg._trigger_event(pwndbg.dbg_mod.EventType.REGISTER_CHANGED)
# Make sure we've caught and handled the special cases in which the inner object
# might be invalidated by the command.
assert self.inner.IsValid()
# This might slow things down, but I'm not entirely sure selecting
# the thread in the way we do is enough to make LLDB write to the
# right register in all cases, so we check the value of the register
@ -179,10 +195,6 @@ class LLDBFrame(pwndbg.dbg_mod.Frame):
int(self.regs().by_name(name)) == val
), "wrote to a register, but read back different value. this is a bug"
# We know this register got written to, we can trigger this
# event.
self.proc.dbg._trigger_event(pwndbg.dbg_mod.EventType.REGISTER_CHANGED)
return True
@override

Loading…
Cancel
Save