1、什么是 objdump
objdump
是 GNU Binutils 工具集中的一个命令行工具,用于分析和显示目标文件(如二进制文件、目标文件、静态库和可执行文件)的详细信息。它是开发调试、优化和逆向工程的利器。他可以做到:
- 反汇编功能:将机器代码转化为汇编代码,方便开发者理解程序逻辑。
- 文件结构解析:能够查看文件的段、头信息以及符号表。
- 重定位信息分析:显示链接过程中符号和地址的调整信息。
2、 objdump 的命令选项详解
选项 | 功能 |
---|---|
-d |
反汇编文件中的代码段 |
-D |
反汇编整个文件 |
-S |
同时显示反汇编代码和源代码(如果目标文件中包含调试信息) |
-h |
显示文件的节头表 |
-x |
显示文件的完整头信息 |
-t |
显示符号表 |
-r |
显示重定位条目 |
-s |
以十六进制形式显示文件的内容 |
-f |
显示文件格式信息 |
3、常用的功能
3.1 查看 ELF 文件的结构和基本信息
objdump -x program.elf
program.elf: file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0000000000401000
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000017 0000000000401000 0000000000401000 00001000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000008 0000000000402000 0000000000402000 00002000 2**3
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 0000000000403000 0000000000403000 00003000 2**2
ALLOC
3.2 查看 ELF 文件中的段信息
objdump -h program.elf
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000017 0000000000401000 0000000000401000 00001000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000008 0000000000402000 0000000000402000 00002000 2**3
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 0000000000403000 0000000000403000 00003000 2**2
ALLOC
3.3 反汇编 ELF 文件中的代码
objdump -d program.elf
Disassembly of section .text:
0000000000401000 <_start>:
401000: 48 31 c0 xor %rax,%rax
401003: 48 31 ff xor %rdi,%rdi
401006: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
40100d: b8 3c 00 00 00 mov $0x3c,%eax
401012: 0f 05 syscall
3.4 查看符号表
objdump -t program.elf
SYMBOL TABLE:
0000000000401000 g F .text 0000000000000017 _start
0000000000402000 g .data 0000000000000004 some_data
3.5 提取特定段的内容
提取 .text
段:
objcopy --only-section=.text -O binary program.elf text_section.bin
查看提取出的 .text
段内容:
hexdump -C text_section.bin
00000000 48 31 c0 48 31 ff 48 c7 c7 00 00 00 00 b8 3c 00 |H1.H1.H......<.|
00000010 00 00 0f 05 |....|
3.6 将 ELF 文件转换为纯二进制文件
objcopy -O binary program.elf program.bin
3.7 将纯二进制文件转换回 ELF 文件
objcopy -I binary -O elf64-x86-64 --binary-architecture i386:x86-64 program.bin program_rebuilt.elf
3.8 查看 ELF 文件的动态链接信息
objdump -p program.elf | grep NEEDED
NEEDED libc.so.6