在 CentOS 上调试和反汇编程序,通常组合使用 GCC + GDB + objdump/readelf 等工具。下面按“从零开始”的思路给你一个完整流程。
sudo yum install -y gcc gdb binutils
如果你需要 32 位支持(可选):
sudo yum install -y glibc-devel.i686 libgcc.i686
// test.c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int x = 3, y = 4;
printf("sum=%d\n", add(x, y));
return 0;
}
gcc -g -O0 test.c -o test
参数说明:
-g:生成调试符号-O0:关闭优化(反汇编更直观)objdump -d test
objdump -d -M intel test | grep -A 20 '<add>'
参数说明:
-M intel:使用 Intel 语法(默认是 AT&T)-d:反汇编可执行段objdump -t test
# 或
readelf -s test
gdb ./test
| 功能 | 命令 |
|---|---|
| 设置断点 | break main |
| 运行 | run |
| 单步(源码) | step / next |
| 单步(汇编) | stepi |
| 查看汇编 | disassemble |
| 查看当前汇编 | disassemble $pc |
| 查看寄存器 | info registers |
| 查看内存 | x/10xw $rsp |
| 切换 Intel 语法 | set disassembly-flavor intel |
(gdb) set disassembly-flavor intel
(gdb) break main
(gdb) run
(gdb) disassemble
(gdb) stepi
(gdb) info registers
gdb ./binary
(gdb) info functions
(gdb) disassemble <function_name>
如果是 strip 过的程序:
file binary
# 无符号,只能靠地址调试
gdb -p <pid>
或
gdb ./test
(gdb) run
# 运行中 Ctrl+C
(gdb) disassemble $pc
-g 已加strip 过的-O0)dnf 替代 yum| 工具 | 用途 |
|---|---|
| gcc | 编译 |
| gdb | 调试 |
| objdump | 静态反汇编 |
| readelf | ELF 结构分析 |
| nm | 符号查看 |
如果你愿意,我可以:
你现在是想学 逆向分析、漏洞调试 还是 理解程序运行机制?