Add -i flag to stack command. (#1978)

* Add support for reverse stack growth

* Fix lint errors

* Updated rsp to be at zero

* updated index along with offset
pull/1983/head
suhassuhas 2 years ago committed by GitHub
parent 40ed3a3bd1
commit eb3225162f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -73,6 +73,16 @@ parser.add_argument(
help="Show the stack frame, from rsp to rbp",
)
parser.add_argument(
"-i",
"--inverse",
dest="inverse",
action="store_true",
default=False,
help="Show the stack reverse growth",
)
parser.add_argument(
"address", nargs="?", default="$sp", type=int, help="The address to telescope at."
)
@ -84,7 +94,9 @@ parser.add_argument(
@pwndbg.commands.ArgparsedCommand(parser, category=CommandCategory.MEMORY)
@pwndbg.commands.OnlyWhenRunning
def telescope(address=None, count=telescope_lines, to_string=False, reverse=False, frame=False):
def telescope(
address=None, count=telescope_lines, to_string=False, reverse=False, frame=False, inverse=False
):
"""
Recursively dereferences pointers starting at the specified address
($sp by default)
@ -141,9 +153,14 @@ def telescope(address=None, count=telescope_lines, to_string=False, reverse=Fals
for reg in pwndbg.gdblib.regs.common:
reg_values[pwndbg.gdblib.regs[reg]].append(reg)
start = address
stop = address + (count * ptrsize)
step = ptrsize
if not inverse:
start = address
stop = address + (count * ptrsize)
step = ptrsize
else:
start = address + ((count - 1) * ptrsize)
stop = address - ptrsize
step = -1 * ptrsize
# Find all registers which show up in the trace, map address to regs
regs: dict[int, str] = {}
@ -201,13 +218,18 @@ def telescope(address=None, count=telescope_lines, to_string=False, reverse=Fals
collapse_repeating_values()
result.append("<Could not read memory at %#x>" % addr)
break
if inverse:
line_offset = addr - (stop + ptrsize) + (telescope.offset * ptrsize)
idx_offset = int((start - stop - ptrsize) / ptrsize) - (i + telescope.offset)
else:
line_offset = addr - start + (telescope.offset * ptrsize)
idx_offset = i + telescope.offset
line = T.offset(
"%02x%s%04x%s"
% (
i + telescope.offset,
idx_offset,
delimiter,
addr - start + (telescope.offset * ptrsize),
line_offset,
separator,
)
) + " ".join(
@ -259,6 +281,16 @@ parser.add_argument(
default=False,
help="Show the stack frame, from rsp to rbp",
)
parser.add_argument(
"-i",
"--inverse",
dest="inverse",
action="store_true",
default=False,
help="Show reverse stack growth",
)
parser.add_argument("count", nargs="?", default=8, type=int, help="number of element to dump")
parser.add_argument(
"offset",
@ -271,10 +303,12 @@ parser.add_argument(
@pwndbg.commands.ArgparsedCommand(parser, category=CommandCategory.STACK)
@pwndbg.commands.OnlyWhenRunning
def stack(count, offset, frame) -> None:
def stack(count, offset, frame, inverse) -> None:
ptrsize = pwndbg.gdblib.typeinfo.ptrsize
telescope.repeat = stack.repeat
telescope(address=pwndbg.gdblib.regs.sp + offset * ptrsize, count=count, frame=frame)
telescope(
address=pwndbg.gdblib.regs.sp + offset * ptrsize, count=count, frame=frame, inverse=inverse
)
parser = argparse.ArgumentParser(

Loading…
Cancel
Save