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