Add valist command (#1524)

pull/1526/head
Gulshan Singh 3 years ago committed by GitHub
parent 825efda796
commit beb2d3f8cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -16,7 +16,7 @@ c = ColorConfig(
)
def get(address, text=None):
def get(address, text=None) -> str:
"""
Returns a colorized string representing the provided address.

@ -639,6 +639,7 @@ def load_commands() -> None:
import pwndbg.commands.start
import pwndbg.commands.telescope
import pwndbg.commands.tls
import pwndbg.commands.valist
import pwndbg.commands.version
import pwndbg.commands.vmmap
import pwndbg.commands.windbg

@ -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…
Cancel
Save