Linux readelf 命令详解|ELF 文件逆向分析、二进制查看一站式教程

Linux readelf 命令详解|ELF 文件逆向分析、二进制查看一站式教程
1. 命令简介readelf 是一个用于显示 ELFExecutable and Linkable Format格式文件详细信息的命令行工具。它可以显示 ELF 文件的各种头部信息、节section信息、段segment信息、符号表、重定位条目等。与 objdump 类似但 readelf 不依赖于 BFDBinary File Descriptor库因此能提供更底层、更精确的 ELF 信息且不受 BFD 库潜在错误的影响。主要用途分析可执行文件、共享库、目标文件和静态库的 ELF 结构。调试和验证编译、链接过程。检查文件的架构、字节序、入口点、节 / 段布局等。支持的文件类型可重定位文件Relocatable files如 .o 文件可执行文件Executable files如 a.out共享目标文件Shared object files如 .so 文件包含 ELF 文件的静态库如 .a 文件2. 语法格式基本语法如下bash运行readelf [选项] elf-file(s)参数说明elf-file (s)一个或多个 ELF 格式的目标文件。可以是可执行文件、共享库、目标文件或静态库。除了 -v版本和 -H帮助选项外必须至少指定一个其他选项来指定要显示的信息类型。3. 常用选项及说明表格选项长选项说明-a--all显示所有信息等价于 -h -l -S -s -r -d -V -A -I。-h--file-header显示 ELF 文件头ELF header信息。-l--program-headers 或 --segments显示程序头表段头信息。-S--section-headers 或 --sections显示节头表信息。-s--syms 或 --symbols显示符号表信息。-e--headers显示所有头部信息等价于 -h -l -S。-r--relocs显示重定位条目信息。-d--dynamic显示动态段Dynamic segment信息。-n--notes显示 NOTE 段信息如内核注释。-V--version-info显示版本段信息。-A--arch-specific显示 CPU 架构特定信息。-g--section-groups显示节组信息。-t--section-details显示节的详细信息比 -S 更详细。-u--unwind显示 unwind 段信息当前主要支持 IA64 架构。-D--use-dynamic使用动态段中的符号表显示符号而不是默认的符号段。-x number 或 name--hex-dumpnumber 或 name以十六进制转储指定节的内容。可通过节索引或节名指定。-w[liaprmfFsoR]--debug-dump[line,info,...]显示调试段中的指定内容如行号、宏、帧信息等。-I--histogram显示符号时同时显示哈希桶长度的柱状图。-W--wide宽行输出避免因行长而截断。-v--version显示 readelf 的版本信息。-H--help显示帮助信息列出所有支持的选项。file从指定文件 file 中读取命令行选项每行一个选项。4. 示例用法示例 1显示 ELF 文件头信息查看可执行文件的基本信息如文件类型、架构、入口点等。bash运行readelf -h main输出示例plaintextELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2s complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Entry point address: 0x8048580 ...示例 2显示程序头段信息查看可执行文件的段布局了解加载到内存后的结构。bash运行readelf -l main输出示例plaintextElf file type is EXEC (Executable file) Entry point 0x8048580 There are 8 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4 INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] LOAD 0x000000 0x08048000 0x08048000 0x00970 0x00970 R E 0x1000 ...示例 3显示节头信息查看文件的节section详细信息包括代码、数据、调试节等。bash运行readelf -S main输出示例plaintextThere are 29 section headers, starting at offset 0xca0: Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 08048154 000154 000013 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 08048168 000168 000020 00 A 0 0 4 [ 3] .note.gnu.build-id NOTE 08048188 000188 000024 00 A 0 0 4 ... (更多节信息)示例 4显示符号表信息查看文件中的符号如函数名、变量名等。bash运行readelf -s main输出示例plaintextSymbol table .dynsym contains 5 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FUNC GLOBAL DEFAULT UND printfGLIBC_2.0 (2) 2: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_mainGLIBC_2.0 (2) 3: 0804849c 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used 4: 080484a0 0 FUNC GLOBAL DEFAULT 14 _init ...5. 注意事项readelf 命令必须针对有效的 ELF 格式文件运行否则会报错。请确保输入文件是 ELF 文件如可执行文件、共享库等。除了 -v 和 -H 选项外必须至少指定一个其他选项如 -h、-l 等来指定要显示的信息类型否则命令可能无输出或报错。对于大型或复杂的 ELF 文件如包含大量符号或调试信息某些选项如 -a 或 -s可能会产生非常长的输出建议重定向到文件或使用分页工具如 less查看。某些选项如 -u 用于 unwind 信息可能只在特定架构如 IA64上有效在其他架构上输出可能有限或无输出。使用 -x 选项转储节内容时需指定节的索引或名称确保节存在以避免错误。如果需要分析静态库.a 文件readelf 会显示库中包含的每个 ELF 对象文件的信息通常结合其他工具如 ar使用。