在 CentOS(本质是基于 Linux 的内核 + GNU 工具链)中,所谓“反汇编指令”通常指用来把可执行文件、目标文件或内存中的机器码转换成汇编代码的命令和工具。下面按常用工具和对应指令来总结。
objdump(最常用)GNU binutils 自带,适合反汇编 ELF 文件。
objdump -d test
反汇编所有可执行代码段。
objdump -D test
反汇编所有段(包括数据段)。
objdump -d -M intel test
使用 Intel 语法(默认是 AT&T)。
objdump -S test
混合显示源码 + 汇编(需要 -g 编译)。
objdump -d -m i386:x86-64 test
指定架构(如 x86-64)。
gdb(调试时反汇编)适合运行时反汇编。
gdb ./test
进入后:
disassemble main
反汇编函数 main。
disassemble /m main
带源码的反汇编。
disassemble 0x400520, 0x400540
反汇编指定地址范围。
x/10i $pc
查看当前指令指针处的 10 条汇编。
ndisasm(简单裸机/Shellcode 反汇编)来自 nasm 包。
ndisasm -b 32 shellcode.bin
ndisasm -b 64 shellcode.bin
readelf(辅助分析,不算严格反汇编)用于查看 ELF 结构。
readelf -h test
readelf -S test
readelf -s test
objdump -dgdb disassembleobjdump -d file.ondisasmobjdump -b binary -m i386 -D shellcode.binobjdump -d vmlinuxcrash + dis| AT&T(默认) | Intel |
|---|---|
mov %rax, %rbx |
mov rbx, rax |
add $1, %eax |
add eax, 1 |
切换方式:
objdump -M intel
# 编译
gcc -g -o test test.c
# 反汇编
objdump -d -M intel test
# 调试反汇编
gdb ./test
(gdb) disassemble main
如果你愿意,我可以:
你更关心哪一类?