From 2b507038b84bdf6ca410831e42f3b176e79cea45 Mon Sep 17 00:00:00 2001 From: Stuart Nevans Locke Date: Sun, 28 Apr 2019 03:14:10 -0400 Subject: [PATCH] Update Leakfind (#620) * Fix stride vs step also fix warning * Fix behaviour on 0x8000000000000000 with negative offsets * Fix spacing * Update FEATURES.md * Rename file --- FEATURES.md | 5 +++++ caps/leakfind.png | Bin 0 -> 42444 bytes pwndbg/commands/leakfind.py | 9 +++++---- 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 caps/leakfind.png diff --git a/FEATURES.md b/FEATURES.md index ba95316fd..508716b38 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -136,6 +136,11 @@ Pwndbg makes searching the target memory space easy, with a complete and easy-to ![](caps/search.png) +## Finding Leaks +![](caps/leakfind.png) +Finding leak chains can be done using the `leakfind` command. It recurisvely inspects address ranges for pointers, and reports on all pointers found. + + ## Telescope Inspecting memory dumps is easy with the `telescope` command. It recursively dereferences a range of memory, letting you see everything at once. As an added bonus, Pwndbg checks all of the available registers to see if they point into the memory range. diff --git a/caps/leakfind.png b/caps/leakfind.png new file mode 100644 index 0000000000000000000000000000000000000000..6d96bdbdd2999d94c3c7fd5e2f8859a96e35ce4b GIT binary patch literal 42444 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 literal 0 HcmV?d00001 diff --git a/pwndbg/commands/leakfind.py b/pwndbg/commands/leakfind.py index bb3398927..f234edba9 100644 --- a/pwndbg/commands/leakfind.py +++ b/pwndbg/commands/leakfind.py @@ -15,6 +15,7 @@ import gdb import pwndbg.color.chain as C import pwndbg.color.memory as M +import pwndbg.color.message as message import pwndbg.color.theme as theme import pwndbg.commands import pwndbg.vmmap @@ -66,10 +67,9 @@ parser.add_argument("-s", "--step", nargs="?", default=0x1, help="Step to add be parser.add_argument('--negative_offset',nargs="?", default=0x0, help="Max negative offset to search before an address when looking for a leak") @pwndbg.commands.ArgparsedCommand(parser) @pwndbg.commands.OnlyWhenRunning -def leakfind(address=None, page_name=None, max_offset=0x40, max_depth=0x4, stride=0x1, negative_offset=0x0): +def leakfind(address=None, page_name=None, max_offset=0x40, max_depth=0x4, step=0x1, negative_offset=0x0): if address is None: raise argparse.ArgumentTypeError('No starting address provided.') - foundPages = pwndbg.vmmap.find(address) if not foundPages: @@ -82,9 +82,9 @@ def leakfind(address=None, page_name=None, max_offset=0x40, max_depth=0x4, strid # Just warn the user that a large depth might be slow. # Probably worth checking offset^depth < threshold. Do this when more benchmarking is established. if max_depth > 8: - print("leakfind may take a while to run on larger depths.") + print(message.warn("leakfind may take a while to run on larger depths.")) - stride = int(stride) + stride = int(step) address = int(address) max_offset = int(max_offset) negative_offset = int(negative_offset) @@ -111,6 +111,7 @@ def leakfind(address=None, page_name=None, max_offset=0x40, max_depth=0x4, strid time_to_depth_increase -= 1 for cur_addr in range(cur_start_addr - negative_offset, cur_start_addr + max_offset, stride): try: + cur_addr &= pwndbg.arch.ptrmask result = int(pwndbg.memory.pvoid(cur_addr)) if result in visited_map or result in visited_set: continue