diff --git a/pwndbg/__init__.py b/pwndbg/__init__.py index 2fbd3e3ca..6608cc078 100755 --- a/pwndbg/__init__.py +++ b/pwndbg/__init__.py @@ -39,6 +39,7 @@ import pwndbg.commands.ropper import pwndbg.commands.search import pwndbg.commands.segments import pwndbg.commands.shell +import pwndbg.commands.stack import pwndbg.commands.start import pwndbg.commands.telescope import pwndbg.commands.theme diff --git a/pwndbg/commands/stack.py b/pwndbg/commands/stack.py new file mode 100644 index 000000000..987b8a5d1 --- /dev/null +++ b/pwndbg/commands/stack.py @@ -0,0 +1,38 @@ +import argparse + +import gdb + +import pwndbg.arch +import pwndbg.chain +import pwndbg.commands +import pwndbg.regs +import pwndbg.vmmap + +p = argparse.ArgumentParser(description=''' +Print out the stack addresses that contain return addresses +''') + +@pwndbg.commands.ArgparsedCommand(p) +def retaddr(): + sp = pwndbg.regs.sp + stack = pwndbg.vmmap.find(sp) + + # Enumerate all return addresses + frame = gdb.newest_frame() + addresses = [] + while frame: + addresses.append(frame.pc()) + frame = frame.older() + + # Find all of them on the stack + start = stack.vaddr + stop = start + stack.memsz + while addresses and start < sp < stop: + value = pwndbg.memory.u(sp) + + if value in addresses: + index = addresses.index(value) + del addresses[:index] + print(pwndbg.chain.format(sp)) + + sp += pwndbg.arch.ptrsize