在 CentOS(Linux) 下进行反汇编并查看寄存器,通常有两套常见场景:
常用工具:objdump
objdump -d ./a.out
或反汇编指定函数:
objdump -d -M intel ./a.out | less
(-M intel 使用 Intel 语法,比 AT&T 好读)
示例:
mov eax, 0x1
mov edx, [esp+0x4]
call 0x80484b6
常见寄存器:
eax, ebx, ecx, edx, esi, edi, ebp, esp(32位)rax, rbx, rcx, rdx, rsi, rdi, rbp, rspeip / ripeflags / rflags⚠️ 静态反汇编只能“看到代码里用了哪些寄存器”,看不到运行时的值
常用工具:gdb
gdb ./a.out
disassemble main
或 Intel 语法:
set disassembly-flavor intel
disassemble main
info registers
或简写:
i r
只看某一个:
i r eax
i r rip
break main
run
stepi # 单步一条汇编
i r # 看寄存器
x/4xw $esp # 看栈顶 4 个 32 位值
x/2xg $rsp # 64 位
| 寄存器 | 含义 |
|---|---|
| eax / rax | 返回值、运算 |
| ebx / rbx | 基址 |
| ecx / rcx | 计数器 |
| edx / rdx | 数据 |
| esp / rsp | 栈指针 |
| ebp / rbp | 栈帧基址 |
| eip / rip | 当前指令地址 |
| eflags | 状态标志(ZF、CF 等) |
gdb ./a.out
(gdb) set disassembly-flavor intel
(gdb) break main
(gdb) run
(gdb) disassemble
(gdb) stepi
(gdb) info registers
如果你愿意,可以告诉我:
我可以直接给你对应的实战示例。