温馨提示×

linux反汇编如何看地址

小樊
40
2026-10-20 23:37:02
栏目: 智能运维

在 Linux 下做**反汇编(disassembly)**时,“看地址”通常涉及几类地址概念:虚拟地址(VA)、文件偏移(File Offset)、相对偏移、符号地址等。下面用通俗方式讲清楚怎么看、用什么工具看。


一、常见“地址”类型

1️⃣ 虚拟地址(Virtual Address, VA)

  • 程序运行时的地址
  • 反汇编工具(如 objdump、gdb)默认显示的就是 VA
  • 示例:
400526:   55                      push   %rbp

这里 400526 就是虚拟地址


2️⃣ 文件偏移(File Offset)

  • 在 ELF 文件里的位置
  • 用于静态分析、patch 文件
  • 和 VA 不一样(需要换算)

3️⃣ 相对偏移 / 指令偏移

  • 函数内偏移
  • 比如 main+0x14

4️⃣ 符号地址

  • 函数名、变量名
  • 如 main, printf

二、常用工具 & 怎么看地址


三、objdump(最常用)

反汇编整个程序

objdump -d a.out

示例输出:

0000000000400526 <main>:
  400526:   55                      push   %rbp
  400527:   48 89 e5                mov    %rsp,%rbp
  • 400526 → 虚拟地址
  • <main> → 符号

显示文件偏移(重要)

objdump -d -h a.out

或:

readelf -S a.out

看 section(如 .text)的:

  • Addr → 虚拟地址
  • Off → 文件偏移

VA ↔ 文件偏移换算

公式:

文件偏移 = VA - Section_VA + Section_Offset

四、GDB(动态调试看地址)

反汇编

disassemble main

或:

disas /r main

示例:

0x0000000000400526 <main+0>: push   %rbp
  • 0x... → 当前 VA
  • main+0 → 相对偏移

查看地址内容

x/10i 0x400526
x/20xw 0x400526

查看符号地址

info address main

五、readelf(看 ELF 地址结构)

readelf -h a.out      # ELF 头
readelf -S a.out      # 段/节区地址
readelf -s a.out      # 符号表

六、如何“定位代码对应哪个地址”

1️⃣ 从源码到地址

gcc -g test.c
objdump -S a.out

混合源码 + 汇编


2️⃣ 从崩溃地址反查

addr2line -e a.out 0x400526

七、常见误区 ⚠️

❌ 文件偏移 ≠ 虚拟地址
❌ PIE 程序每次运行地址不同
❌ 静态分析和运行时地址可能不同


八、总结一句话

反汇编看地址,默认看的是虚拟地址;
要改文件看文件偏移;
调试用 GDB;
分析结构用 readelf / objdump。

如果你愿意,可以告诉我:

  • 你是 静态分析 / 调试 / CTF / 内核 / 用户态?
  • 用的是 x86 / ARM / 64位?

我可以直接给你对应示例。

0 踩