本文将带你系统掌握 GDB 的核心使用方法,特别聚焦在没有源码的程序调试场景。适用于漏洞分析、CTF 二进制题、逆向工程和崩溃分析等工作。
一、前置知识:什么是 GDB?
GDB(GNU Debugger)是 GNU 项目提供的强大调试工具,主要用于调试 C/C++ 编译生成的可执行程序。即便在没有源码的情况下,我们依然可以利用 GDB:
- 查看汇编指令与调用过程
- 分析寄存器与内存状态
- 利用断点控制程序执行流程
- 读取栈帧和堆栈信息
- 分析崩溃 core dump 文件
二、GDB 启动与基本操作
1. 启动方式
gdb ./vuln
gdb ./vuln core
2. 调试环境建议
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
三、无源码调试常用命令详解
以下命令在无源码的 ELF 文件中依然适用,重点在于地址与指令层面。
1. 程序控制命令
命令 | 说明 |
---|
run 或 r | 启动程序执行 |
start | 从入口执行到 main 前暂停(若无符号信息无效) |
continue 或 c | 继续执行到下一个断点或崩溃 |
si (stepi ) | 单步执行汇编指令(进入子函数) |
ni (nexti ) | 单步执行汇编(跳过子函数) |
finish | 运行直到当前函数返回 |
2. 断点设置命令
命令 | 含义 |
---|
break *0x80484a7 | 在指定地址设置断点 |
delete | 删除所有断点 |
disable 1 | 禁用编号为 1 的断点 |
enable 1 | 启用编号为 1 的断点 |
info breakpoints | 查看当前断点列表 |
3. 寄存器与内存查看命令
命令 | 含义 |
---|
info registers | 查看所有寄存器值 |
x/nfu addr | 查看内存(常用于堆栈/数据分析) |
-
说明:
n
:查看数量(如 4)f
:格式(x
=十六进制, d
=十进制, s
=字符串, i
=反汇编)u
:单位(b
=1字节, h
=2字节, w
=4字节, g
=8字节)
示例:
x/16x $esp
x/s $eax
x/10i $eip
4. 栈帧与函数分析命令
命令 | 含义 |
---|
bt (backtrace ) | 显示函数调用栈 |
frame n | 切换至第 n 层栈帧 |
info frame | 查看当前帧详细信息 |
info args | 查看当前函数的参数 |
info locals | 查看当前局部变量(需符号信息) |
5. 内存与变量操作
命令 | 含义 |
---|
set $eax = 0xdeadbeef | 修改寄存器的值 |
set {int}0x804a010 = 0 | 修改指定内存值 |
x/s 0x804a010 | 将内存地址当字符串读取 |
四、实战分析技巧(以栈溢出为例)
情境:程序崩溃,怀疑存在栈溢出
gdb ./vuln core
1. 查看栈回溯信息
bt
2. 查看崩溃位置汇编指令
info reg
x/i $eip
3. 查看栈上的数据,定位 payload
x/32x $esp
x/s $esp
五、常见分析任务与命令配套表
分析目标 | 推荐命令 |
---|
找崩溃位置 | bt + x/i $eip |
查看堆栈数据 | x/32x $esp |
反汇编函数区域 | disas 0x地址 |
查找调用链 | bt + frame n |
修改执行流程 | set $eip = 0x地址 |
模拟函数返回值 | set $eax = 0x值 |
六、小结
- 即使没有源码,GDB 依然是一把强大“放大镜”
- 配合静态分析工具(IDA/Ghidra)效率更高
- 插件如 pwndbg 能大大增强调试体验
- 掌握关键命令,能让你在漏洞调试中快速定位问题