mirror of https://github.com/pwndbg/pwndbg.git
Add valist command (#1524)
parent
825efda796
commit
beb2d3f8cb
@ -0,0 +1,51 @@
|
||||
import argparse
|
||||
|
||||
import gdb
|
||||
|
||||
import pwndbg.chain
|
||||
import pwndbg.color as C
|
||||
import pwndbg.commands
|
||||
|
||||
parser = argparse.ArgumentParser(description="Dumps the arguments of a va_list.")
|
||||
parser.add_argument("addr", type=int, help="Address of the va_list")
|
||||
parser.add_argument("count", type=int, nargs="?", default=8, help="Number of arguments to dump")
|
||||
|
||||
|
||||
@pwndbg.commands.ArgparsedCommand(parser)
|
||||
@pwndbg.commands.OnlyWhenRunning
|
||||
def valist(addr: gdb.Value, count: int) -> None:
|
||||
# The `va_list` struct looks like this:
|
||||
#
|
||||
# ```
|
||||
# typedef struct {
|
||||
# unsigned int gp_offset;
|
||||
# unsigned int fp_offset;
|
||||
# void *overflow_arg_area;
|
||||
# void *reg_save_area;
|
||||
# } va_list[1];
|
||||
# ```
|
||||
|
||||
addr = int(addr)
|
||||
gp_offset = pwndbg.gdblib.memory.u32(addr)
|
||||
gp_index = gp_offset / 8
|
||||
|
||||
overflow_arg_area = pwndbg.gdblib.memory.u64(addr + 8)
|
||||
reg_save_area = pwndbg.gdblib.memory.u64(addr + 16)
|
||||
|
||||
indent = " " * len("gp_offset => ")
|
||||
heading = C.blue("reg_save_area".ljust(len(indent) - 1))
|
||||
print(f"{C.blue('reg_save_area')}")
|
||||
for i in range(6):
|
||||
line = ""
|
||||
if i == gp_index:
|
||||
line += "gp_offset => "
|
||||
else:
|
||||
line += indent
|
||||
|
||||
line += pwndbg.chain.format(reg_save_area + i * 8)
|
||||
print(line)
|
||||
|
||||
print()
|
||||
print(f"{C.blue('overflow_arg_area')}")
|
||||
for i in range(count - 6):
|
||||
print(indent + pwndbg.chain.format(overflow_arg_area + i * 8))
|
||||
Loading…
Reference in new issue