diff --git a/pwndbg/auxv.py b/pwndbg/auxv.py index 269f2d579..92275f4c1 100644 --- a/pwndbg/auxv.py +++ b/pwndbg/auxv.py @@ -248,4 +248,5 @@ def get_execfn(): addr -= 1 v = pwndbg.strings.get(addr, 1024) - return os.path.abspath(v) + if v: + return os.path.abspath(v) diff --git a/pwndbg/memory.py b/pwndbg/memory.py index f4c56d53a..98efa09a3 100644 --- a/pwndbg/memory.py +++ b/pwndbg/memory.py @@ -68,6 +68,16 @@ def poke(address): except: return False return True +def string(addr): + data = bytearray() + while peek(addr): + byte = read(addr, 1) + if byte == b'\x00': + break + data += byte + addr += 1 + return data + def byte(addr): return readtype(pwndbg.typeinfo.uchar, addr) def uchar(addr): return readtype(pwndbg.typeinfo.uchar, addr) def ushort(addr): return readtype(pwndbg.typeinfo.ushort, addr) diff --git a/pwndbg/strings.py b/pwndbg/strings.py index 5158421a0..713a1f54d 100644 --- a/pwndbg/strings.py +++ b/pwndbg/strings.py @@ -9,6 +9,7 @@ import string import gdb import pwndbg.events +import pwndbg.memory import pwndbg.typeinfo length = 15 @@ -32,20 +33,14 @@ def get(address, maxlen = None): maxlen = length try: - sz = gdb.Value(address) - sz = sz.cast(pwndbg.typeinfo.pchar) - sz = sz.string('ascii', 'replace', maxlen) - sz = pwndbg.memory.read(address, len(sz)) - sz = sz.rstrip('\x00') + sz = pwndbg.memory.string(address) + sz = sz.decode('latin-1', 'replace') if not sz or not all(s in string.printable for s in sz): return None - - sz = str(sz) except Exception as e: return None - if len(sz) < maxlen: return sz