mirror of https://github.com/pwndbg/pwndbg.git
Add retaddr command
parent
e8b4fbf8e5
commit
5f0e84294c
@ -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
|
||||||
Loading…
Reference in new issue