Debugging Tips & Cheatsheet

注意
本文最后更新于 2024-03-18,文中内容可能已过时。

Debugging Tips

GDB

  • GDB 的 apropos <topic> 命令可以显示与给定 <topic> 相关的所有已注册命令

  • GDB 的 follow-fork-mode 可用于设置在 fork() 调用后跟踪父级或子级

    • 跟踪 fork 的父进程(fork() 返回值大于 0):set follow-fork-mode parent
    • 跟踪 fork 的字进程(fork() 返回值等于 0):set follow-fork-mode child
  • 使用 GDB 的 dprintf 命令可以使您在运行中将 printf 调用插入程序(本质是断点)

    • dprintf location,template,expression[,expression…]
    • 打印所有的 malloc 调用:dprintf malloc, "malloc(%p) \n", (void*)$rdi
  • 使用 GDB 的 pi 命令运行交互式 Python 控制台,可以在其中使用 Pwndbg API

    • pwndbg.gdblib.memory.read(addr, len)
    • pwndbg.gdblib.memory.write(addr, data)
    • pwndbg.vmmap.get()
  • 使用 GDB 的 set directory <path> 可以用于指定源码位置

  • hbreak:硬件断点

  • 添加一个自定义的结构体

Pwndbg

image-20240318175802965

  • 使用 attachp 附加指定名称的进程
  • 使用 p2p 搜索链式指针,例如 p2p libc stack 就是搜索在 libc 中的所有 stack 指针链
  • 使用 retaddr 查看栈上所有的返回地址的栈指针
  • 使用 set show-flags on 设置将在 寄存器上下文面板中显示 CPU 标志寄存器
  • 使用 vmmap 指令获得更好的彩色内存映射显示
  • 使用 telescope 命令查看指针
  • 使用 context(或 ctx)命令再次显示上下文
  • 使用 canary 命令查看堆栈上的 canary
  • 在执行 heap 命令后,可用 $heap_base 来引用堆的起始地址
  • 使用 errno 命令查看最后一个 libc 调用的错误内容
  • 使用 $reabase(<addr>) 函数来引用代码基址
  • 使用 heapbase 可以查看堆基址,使用 tls 可以查看 tls 基址
  • 堆信息查看 arenampbinheaptop_chunk
  • 使用 try_free <addr> 可以测试 free 某地址后可能会出现的 crash
  • 使用 find_fake_fast <addr> <size> 可以搜索从 mem[<addr>, <addr> + <size>] 中可用于伪造 fastbin 堆块的地址(size 位为 <size>
  • 使用 vis_heap_chunks <addr> <count> <native> 可以打印彩色的堆块信息
  • 使用 leakfind 命令可以看能泄露哪些空间的地址
    • leakfind 0x7f50fe111bb0 --page_name=house_of_fmyyass --max_offset=0x3000 --max_depth=3
    • address:0x7f50fe111bb0
    • page_name: 找哪里的地址,例如:libc,stack
    • max_offset:范围
    • max_depth: 链的层数

Pwngdb

  • 使用 libc 可以查看 libc 基址,使用 ld 可以查看 ld 基址,使用 codebase 可以查看代码基址
  • 使用 fmtarg 可以计算格式化字符串的索引(断点在 printf 函数中)
  • 使用 fsop 可以打印从 _IO_list_all 开始的 IO_FILE 链表
  • 使用 at <process_name> 可以快速附加指定进程名称的进程
  • 使用 free <addr> 可以测试 free 某地址后可能会出现的 crash
  • 使用 force <addr> 获取到 House of froce 攻击中申请到目标地址需要提供的 size

IDA

image-20240318181122340

0%