GDB + pwndbg(Pwn 视角)
2026/5/29工具工具GDBpwndbg大约 2 分钟
GDB + pwndbg(Pwn 视角)
这个工具解决什么问题
Pwn 中 GDB 观察什么
- 程序在哪里崩溃
- 返回地址是否被覆盖
- 栈、堆、寄存器状态
- libc、栈、堆、程序基址
- ROP 链是否按预期执行
安装方式
本文聚焦 Pwn 题中的实战技巧。
什么时候优先用它
- 拿到 ELF、libc 或远程服务,需要调试、检查保护、构造 payload 或验证利用链。
- 手工试探已经出现崩溃、泄漏或 gadget 线索,需要把步骤固化成脚本。
- 本地环境和远程环境存在差异,需要反复确认地址、约束、交互和保护状态。
常用入口
堆分析技巧
看堆状态
heap
bins
vis_heap_chunks堆题先记录每次 malloc、free 后的 chunk 状态,不要只看最后崩溃点。
记录 malloc/free
在 malloc 和 free 处下断点:
b malloc
b free
commands
silent
printf "malloc(%#lx) = %p\n", $rdi, $rax
continue
end追踪 chunk 状态
# 分配后查看
heap --chunk <addr>
# 释放后查看
bins
# 查看 tcache
bins tcache堆题调试流程
1. 下断点在 malloc/free
2. 记录每次操作的参数和返回值
3. 查看 chunk 状态
4. 分析 use-after-free 或 double free
5. 构造利用链attach 远程服务
本地 Docker 或 socat 起服务后,可以找到进程再 attach:
ps aux | grep vuln
gdb -p <pid>典型 CTF 场景
找溢出偏移
cyclic 200
run
cyclic -l 0x6161616cpwntools 中也可以生成:
from pwn import *
print(cyclic(200))
print(cyclic_find(0x6161616c))看保护和 PIE 基址
checksec
vmmap
piebase调试 ROP 链
b *main
run
x/40gx $rsp
ni如果程序在 system 或 movaps 附近崩溃,优先怀疑栈对齐。
常见坑
本地能打,远程失败
检查 libc 版本、栈对齐、输入输出同步、换行、环境变量差异。
堆题看不到 chunk
1. 确认程序已经执行了 malloc
2. 检查 libc 版本
3. 尝试不同版本的 pwndbg
4. 使用 gdb-peda 或 gef 作为备选替代方案
- GDB + pwndbg / gef
- ROPgadget / ropper / one_gadget
- pwntools / 手写 socket 脚本