温馨提示×

如何用linux反汇编指令

小樊
38
2026-07-21 12:57:37
栏目: 智能运维

在 Linux 下做反汇编(disassembly),常见场景是分析 ELF 可执行文件 / 共享库 / 二进制程序。下面按工具 → 用法 → 示例给你一个实用速查表。


一、常用反汇编工具

工具 说明
objdump GNU binutils,最常用、稳定
gdb 调试器,可反汇编函数
ndisasm NASM 自带,适用于裸二进制
radare2 / r2 逆向工程利器
IDA / Ghidra 图形化(非纯命令行)

二、使用 objdump 反汇编(最常用)

1️⃣ 反汇编整个可执行文件

objdump -d a.out

2️⃣ 反汇编指定函数

objdump -d a.out | grep -A 20 "<main>:"

3️⃣ 显示源码 + 汇编(需要 -g)

objdump -S a.out

4️⃣ 显示 Intel 语法(默认是 AT&T)

objdump -M intel -d a.out

5️⃣ 反汇编 64 位程序

objdump -M intel -d a.out

6️⃣ 反汇编共享库

objdump -d libfoo.so

三、使用 gdb 反汇编(调试时非常常用)

1️⃣ 启动程序

gdb ./a.out

2️⃣ 反汇编当前函数

disassemble

3️⃣ 反汇编指定函数

disassemble main

4️⃣ 使用 Intel 语法

set disassembly-flavor intel
disassemble main

5️⃣ 反汇编指定地址

disassemble 0x4005f6

四、反汇编裸二进制(无 ELF 头)

使用 ndisasm

ndisasm -b 32 file.bin

或 64 位:

ndisasm -b 64 file.bin

五、使用 radare2(进阶)

r2 ./a.out

常用命令:

aaa        # 分析
pdf @ main # 反汇编 main 函数

六、查看符号表(先找函数名)

nm a.out

或:

readelf -s a.out

七、典型示例(完整流程)

gcc -g -o test test.c
objdump -M intel -d test | less

或:

gdb ./test
(gdb) set disassembly-flavor intel
(gdb) disassemble main

八、AT&T vs Intel 语法对照

AT&T Intel
mov %eax, %ebx mov ebx, eax
sub $4, %esp sub esp, 4

⚠️ Linux 默认是 AT&T 语法,逆向常用 Intel


九、常见错误

❌ 对 strip 后的程序:

objdump -d a.out

→ 函数名可能消失,但汇编仍在

✅ 解决:

objdump -d a.out | less

如果你愿意,我可以:

  • ✅ 结合 具体程序 教你一步步反汇编
  • ✅ 对比 C 代码 ↔ 汇编
  • ✅ 讲 栈帧 / 函数调用 / 系统调用 的汇编含义

你可以直接贴一个二进制或代码片段。

0