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 APIpwndbg.gdblib.memory.read(addr, len)pwndbg.gdblib.memory.write(addr, data)pwndbg.vmmap.get()
使用 GDB 的
set directory <path>可以用于指定源码位置hbreak:硬件断点
Pwndbg
- 使用
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 基址 - 堆信息查看
arena、mp、bin、heap、top_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

