菜鸟科技网

Linux反汇编命令有哪些?

核心命令

objdump

objdump 是 GNU Binutils 工具集的一部分,几乎所有 Linux 发行版都默认安装,它是查看目标文件(可执行文件、库、对象文件)信息的“瑞士军刀”。

Linux反汇编命令有哪些?-图1
(图片来源网络,侵删)

基本用法:

objdump -d <filename>
  • -d (--disassemble):反汇编所有可执行节中的代码。
  • -D (--disassemble-all):反汇编所有,包括数据部分,这会产生大量无意义的汇编代码,通常不推荐。
  • -S (--source):在反汇编代码旁边混合显示源代码(如果可用,例如编译时带 -g 选项)。
  • -s (--full-contents):显示所有节中的原始十六进制内容。
  • -j <section> (--section=<section>):只反汇编指定的节,-j .text 只反汇编代码段。
  • -C (--demangle):对 C++ 的符号名进行反修饰(例如将 _ZN3foo3barEv 还原为 foo::bar())。
  • -M <instruction>:指定汇编语法风格,如 intel(Intel 语法)或 att(AT&T 语法,默认)。

示例:

假设我们有一个名为 my_program 的可执行文件。

基本反汇编 (AT&T 语法,默认)

Linux反汇编命令有哪些?-图2
(图片来源网络,侵删)
objdump -d my_program

输出会类似这样:

my_program:     file format elf64-x86-64
Disassembly of section .text:
0000000000401126 <main>:
  401126:   push   %rbp
  401127:   mov    %rsp,%rbp
  40112a:   sub    $0x10,%rsp
  40112e:   mov    %edi,-0x4(%rbp)
  401131:   mov    %rsi,-0x10(%rbp)
  ...

使用 Intel 语法 (更易读)

objdump -d -M intel my_program

输出会变为:

my_program:     file format elf64-x86-64
Disassembly of section .text:
0000000000401126 <main>:
  401126:   push   rbp
  401127:   mov    rbp,rsp
  40112a:   sub    rsp,0x10
  40112e:   mov    dword ptr [rbp-0x4],edi
  401131:   mov    qword ptr [rbp-0x10],rsi
  ...

混合显示源代码

Linux反汇编命令有哪些?-图3
(图片来源网络,侵删)

编译时需要带 -g 选项:gcc -g my_program.c -o my_program

objdump -d -S my_program

这会在汇编指令旁边显示对应的 C 源代码,非常有助于理解。


gdb

gdb (GNU Debugger) 是一个强大的源码级调试器,但它也内置了非常出色的反汇编功能,特别适合在调试过程中动态地查看函数或代码块的反汇编结果。

基本用法:

首先启动 GDB:

gdb ./my_program

进入 GDB 后,使用以下命令:

  1. disassemble / disas:反汇编函数或内存地址。

    • disassemble function_name: 反汇编指定函数。
      (gdb) disassemble main
    • disassemble address1, address2: 反汇编一个地址范围。
      (gdb) disassemble 0x401120, 0x401140
    • disassemble $pc, +20: 从当前程序计数器($pc)开始反汇编接下来的 20 条指令。
  2. set disassembly-flavor:切换汇编语法。

    (gdb) set disassembly-flavor intel
    (gdb) disassemble main
  3. x / examine:检查内存内容,可以用来反汇编。

    • x/10i $pc: 从 $pc 开始,以指令格式(i)显示 10 条。
      (gdb) x/10i $pc
    • x/20i 0x401120: 从地址 0x401120 开始,以指令格式显示 20 条。

GDB 的优势:可以结合断点、单步执行等调试功能,实时观察代码的执行流程和寄存器/内存的变化,是逆向分析和漏洞挖掘的利器。


objdump + strings + grep (组合使用)

在实际分析中,我们经常需要结合多个工具来获取完整信息。

  • strings:从二进制文件中可打印的字符串。
  • grep:搜索文本。

典型场景:你想找到某个包含特定字符串(如 "password")的函数,并反汇编它。

# 1. 用 strings 和 grep 找到包含 "password" 的地址
strings my_program | grep -n "password"
# 假设输出是:12345: Enter your password:
# 2. 用 objdump 查看字符串所在的节,找到其地址
objdump -s -j .rodata my_program | grep "Enter your password"
# 假设输出显示该字符串在 .rodata 节的某个地址,0x404000
# 3. 在 GDB 中,使用 x/10i 在该地址附近查找函数调用或跳转
# 或者,如果你知道函数名,直接反汇编该函数
# (gdb) disassemble check_password

进阶与专业工具

对于更复杂的任务,如恶意软件分析、混淆代码分析,你可能需要更专业的工具。

radare2 / rizin

radare2 (现在常被称为 rizin) 是一个开源的逆向工程框架,功能极其强大,命令行驱动,拥有丰富的脚本和分析功能,它被设计为可扩展的逆向平台。

基本用法:

# 分析文件
rizin -A ./my_program
# 进入交互式 shell
rizin>
# 在 shell 中
[0x00401126]> pdf             # 打印反汇编的函数 (print disas function)
[0x00401126]> afl             # 列出所有函数 (analyze functions)
[0x00401126]> s sym.main      # 跳转到 main 函数符号
[0x00401126]> VV              # 进入可视化视图

优势:速度快,分析自动化程度高,拥有图形化界面(VV 命令),非常适合大型二进制文件的分析。

Ghidra

Ghidra 是美国国家安全局发布的一款开源逆向工程套件,它是一个图形化工具,功能非常强大,集成了反汇编、反编译、脚本编写和分析套件。

基本用法:

  1. 启动ghidraRun
  2. 创建新项目,导入你的目标文件。
  3. 自动分析:Ghidra 会自动执行分析,包括函数识别、数据类型推测等。
  4. 查看:在左侧的 "Listing" 视图中查看反汇编代码,在 "Decompiler" 视图中查看 C 语言风格的伪代码。

优势:图形化界面直观易用,反编译器质量非常高,对于理解复杂的控制流和算法非常有帮助。


总结与对比

工具 类型 优点 缺点 适用场景
objdump 命令行 简单、快速、系统自带 功能相对单一,交互性差 快速查看二进制基本信息,快速反汇编检查
gdb 命令行 强大的调试功能,可动态分析 需要调试环境,分析静态文件时稍显笨重 动态调试,分析程序运行时行为,漏洞分析
radare2/rizin 命令行/框架 极其强大、快速、可扩展、有图形界面 学习曲线陡峭,命令繁多 大型/复杂二进制分析,自动化脚本,恶意软件分析
Ghidra 图形化 功能全面,反编译器优秀,界面友好 资源消耗较大,启动慢 深度静态分析,理解算法逻辑,恶意软件分析

学习建议

  1. objdump 开始:掌握 -d, -S, -M intel 等基本选项,这是最基础也是最重要的技能。
  2. 学习 gdb:学会用 disassemblex/i 来查看代码,并尝试结合断点进行调试,这是从静态分析走向动态分析的关键一步。
  3. 探索 Ghidra:当你需要进行复杂的静态分析时,Ghidra 的图形界面和反编译器会让你事半功倍。
  4. 挑战 radare2:当你成为高级用户,需要处理大量自动化任务或性能要求极高的分析时,radare2 会是你强大的武器。

对于初学者和日常使用,objdump + gdb 的组合已经足够应对绝大多数情况。

分享:
扫描分享到社交APP
上一篇
下一篇