以下是Linux反汇编指令实践教程,涵盖工具使用、基础操作及示例分析:
安装基础工具
objdump、gdb:属于binutils包,安装命令:sudo apt-get install binutils # Debian/Ubuntu
sudo yum install binutils # CentOS/RHEL
IDA Pro(商业级逆向工具)、radare2(开源框架)。准备测试程序
hello.c),编译时添加-g选项保留调试信息:gcc -g -o hello hello.c
作用:直接分析二进制文件的汇编代码,无需运行程序。
| 场景 | 命令 | 说明 |
|---|---|---|
| 反汇编整个文件 | objdump -d -M intel hello |
-d:反汇编可执行段;-M intel:使用Intel语法(默认AT&T) |
| 查看特定函数 | `objdump -d -M intel hello | grep -A 20 “ |
| 显示符号表 | objdump -t hello |
查看函数、变量地址及类型 |
| 反汇编特定段 | objdump -d -j .text hello |
仅反汇编.text段(代码段) |
示例输出分析:
080484b4 <main>:
80484b4: 55 push ebp # 保存基指针
80484b5: 89 e5 mov ebp,esp # 设置栈帧
80484b7: 83 ec 18 sub esp,0x18 # 分配局部变量空间
80484ba: c7 45 fc 0a 00 00 00 mov DWORD PTR [ebp-0x4],0xa # int a=10
作用:在程序运行时动态查看汇编指令,支持单步执行和寄存器查看。
gdb ./hello
(gdb) break main # 在main函数入口设断点
(gdb) run # 运行程序,停在断点处
(gdb) disassemble # 反汇编当前函数
(gdb) stepi # 单步执行1条机器指令
(gdb) info registers # 查看寄存器实时状态
(gdb) x/10xw $sp # 查看栈顶10个字(十六进制)
hello程序,观察printf调用时的栈变化。main函数内printf调用前设断点。disassemble查看printf的汇编代码。stepi逐步执行,观察参数如何通过寄存器传递至printf。混合源码与汇编
编译时添加-g,用objdump -S显示源码与汇编对照:
objdump -S -M intel hello
跨架构反汇编
binutils-arm-none-eabi,使用arm-none-eabi-objdump。objdump --architecture=arm -d binary。批量反汇编脚本
结合bash批量处理多个二进制文件:
for file in *.bin; do
arm-none-eabi-objdump -d $file > ${file}.asm
done
man objdump、man gdb通过以上步骤,可快速掌握Linux下反汇编的基础实践,结合工具特性满足不同分析需求。