二进制文件信息收集工具
目录
二进制文件信息收集工具
概述
工欲善其事,必先利其器。在二进制代码分析的过程中,需要借助一些工具来收集二进制代码的信息。
本文章用于记录一些查看二进制文件信息的工具,均为命令行使用。会收录的有: nm , ldd , strings , ps , strace , ltrace , ROPgadget , objdump , readelf 等,主要记录一些可能用到的参数还有回显信息的说明。
工具列表
nm
nm 用于查看二进制文件中的符号表(包括函数、全局变量、未定义符号等)。在漏洞利用、逆向分析中,可用于查找函数地址、判断符号是否被 strip、分析链接情况等。
常用参数
nm <file>
查看文件的符号表(默认只看 符号名称 + 类型 + 地址)。nm -D <file>
查看 动态符号表(.dynsym),适用于 ELF 动态库和动态链接执行文件。nm -g <file>只显示 全局符号(global symbols)。nm -a <file>
显示所有符号,包括调试符号(debug)。nm -S <file>
显示符号大小(Size 字段)。nm -u <file>
只显示 未定义符号(undefined symbols),通常是动态链接依赖项。nm --no-sort <file>
按符号原始顺序输出(不根据地址排序)。
常见符号类型说明
nm 输出的第二列是符号类型(section type),常见含义如下:

| 字母 | 含义 |
|---|---|
| T / t | Text 段(代码段)中的符号(T = global,t = local) |
| D / d | Data 段中的符号 |
| B / b | BSS 段(未初始化数据)符号 |
| R / r | 只读数据段符号 |
| U | Undefined symbol(未定义符号,需要外部库解析) |
| W / w | Weak symbol(弱符号) |
| A | Absolute symbol(绝对符号,地址不随链接变化) |
| V / v | Weak object(弱对象) |
在 PWN 中,最常用的是:
T/t:找函数位置
U:判断链接依赖
B/D:分析全局变量与 GOT/数据结构位置
ldd
ldd 用于查看一个 ELF 可执行文件在运行时会加载哪些 共享库(shared libraries),以及每个库被解析到的实际路径与基址(加载地址)。在漏洞利用中,用于确定 libc 版本、检查是否使用自定义 loader、判断是否存在可控的库劫持场景。
常用参数
ldd <file>
查看 ELF 运行时的动态库依赖列表,是最常用的形式。LD_TRACE_LOADED_OBJECTS=1 <file>
与ldd等效,但不会真正运行目标程序,更安全。
⚠️ 注意: 在某些情况下,
ldd <file>会实际“执行” ELF 文件的初始化逻辑,因此对恶意样本使用时需谨慎。
推荐使用: `LD_TRACE_LOADED_OBJECTS=1 ./可执行文件
回显样例与说明
$ ldd ./pwnlinux-vdso.so.1 (0x00007fffffffe000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a0d000)/lib64/ld-linux-x86-64.so.2 (0x00007ffff7dd0000)字段含义:
linux-vdso.so.1:虚拟动态共享对象,由内核提供,非真实文件libc.so.6 => /lib/.../libc.so.6
动态库的实际解析路径(0x00007ffff7a0d000)
运行时加载基址(ASLR 影响下每次启动随机)
在 PWN 中常见用途
-
确认 libc 版本
漏洞利用中必须知道 libc 的版本以匹配正确偏移。 -
确认程序是否使用自带 libc
如
libc.so.6 => ./libc-2.31.so表明程序目录中放了专用 libc(题目常见)。 -
检查程序的 loader/动态链接器
[Requesting program interpreter: ./ld-2.31.so]→ 搭配readelf -l(后面会提到)进一步确认。 -
调试路径问题
当出现 “not found” 时可用于分析如LD_LIBRARY_PATH配置错误。 -
库劫持(Library Hijacking)分析
可判断是否有机会利用 RPATH、RUNPATH、LD_PRELOAD 做利用。
常见异常提示
-
not found
libmylib.so => not found表示系统无法解析该库,通常是路径问题。 -
statically linked
not a dynamic executable表示 ELF 使用静态链接(如 musl 编译),无法通过 ldd 查看依赖。
strings
strings 用于从二进制文件中提取可打印字符串(ASCII/UTF-8),包括程序文本字面量、日志、命令、路径、格式化字符串等。在漏洞利用中常用于快速定位关键函数名、调试信息、敏感路径与 flag 线索。
常用参数
strings <file>
从整个文件中扫描可打印字符串,最常用形式。strings -n <num>
设置最短字符串长度(默认 4)。
如:strings -n 3 a.outstrings -d <file>
仅从 数据段(data section) 提取字符串。strings -e <enc>
指定编码(如 s=7bit, S=8bit, b=big-endian, l=little-endian)。strings -t x <file>
在输出前显示字符串在文件中的偏移(十六进制)。
常用于配合逆向定位字符串位置。
常见输出类型说明
strings 能提取的信息包含但不限于:
| 字符串类型 | 示例 | 用途 |
|---|---|---|
| 调试信息 | "Enter password:" | 快速定位逻辑点 |
| 路径 | "/bin/sh" | RCE / system 利用线索 |
| 格式化字符串 | "%p %s %n" | 格式化字符串漏洞判断 |
| 错误/日志 | "invalid length" | 对照逆向流程 |
| 链接库名称 | "GLIBC_2.31" | 识别 libc 版本 |
| 编译器信息 | "GCC: (Ubuntu 9.4.0-1)" | 判断比赛环境 |
示例输出说明
$ strings ./pwn/bin/shEnter your input:Correct!GLIBC_2.31putssystem解析:
/bin/sh→ 若程序中出现此字符串,可能存在 system(“/bin/sh”) 相关调用Enter your input:→ 程序 I/O 流,与行为对应GLIBC_2.31→ libc 版本特征(极重要)puts、system→ 动态链接符号名,可配合泄露构造 ROP
PWN 中常见用途
- 寻找 “/bin/sh” 字符串
在 ROP 漏洞里用于查找 libc 或二进制中自带的/bin/sh偏移。 - 判断可能的危险 API 调用
如:system,sprintf,strcpy,gets等 → 暗示潜在漏洞点。 - 查找格式化字符串漏洞证据
如输出"%x"、"%p"、"%n"则可进一步分析。 - 快速定位逻辑流程
通过"Wrong password"、"Try again"等字符串判断程序行为。 - 确认 libc 版本特征
若输出出现大量GLIBC_2.xx字符串,可用于锁定 libc 版本。 - 辅助逆向
对应字符串 → 用 IDA/objdump 反查引用处,定位关键函数。
readelf
readelf 是读取 ELF 格式信息最全面、最专业的工具之一,直接解析 ELF 结构,不依赖系统环境。相比 objdump,readelf 更偏向数据显示,输出更精确、更适合二进制分析。
常用于查看:段表、节表、动态信息、符号表、重定位表、程序头、解释器(loader)等。
常用参数
-
readelf -h <file>
查看 ELF 文件头(ELF 类型、架构、入口地址等)。 -
readelf -l <file>
查看 Program Headers(程序头),包括加载地址、动态段、interpreter 信息。 -
readelf -S <file>
查看 节表(Section Headers),可用于定位 .text/.data/.got/.plt 等。 -
readelf -s <file>
查看符号表(动态符号 + 静态符号)。 -
readelf -r <file>
查看重定位表(ROP 学习必备),如.rela.plt。 -
readelf -d <file>
查看动态段(DT_NEEDED、RPATH、RUNPATH、SONAME 等)。 -
readelf -a <file>
输出全部信息。
回显内容说明(重点字段)
1. ELF header (-h)
Entry point address: 0x401080Type: EXEC (Executable file)Machine: Advanced Micro Devices X86-64- 入口地址(可能用于 ret2text)
- ELF 类型(EXEC / DYN → PIE 判断)
- 架构(64bit/32bit) 判断是否开启 PIE:
Type: DYN → PIE 开启Type: EXEC → PIE 关闭2. Program Headers (-l)
LOAD 0x000000 0x400000 0x400000 0x2000 ...INTERP /lib64/ld-linux-x86-64.so.2DYNAMIC 0x401dd0 ...GNU_RELRO 0x401000 ...重点字段:
- INTERP:显示 loader(ld.so)
→ 配合 ldd 确认是否自带加载器 - LOAD:加载段地址,反应内存布局
→ ret2text 需关注可执行段起始地址 - GNU_RELRO / GNU_STACK:
→ 判断保护:RELRO、NX、STACK 开启情况
3. Section Headers (-S)
主要用于定位关键节:
.text 可执行代码区域.data 可写数据.bss 未初始化变量.plt Procedure Linkage Table.got Global Offset Table.got.plt 延迟绑定 GOT.init_array 程序启动时调用(构造函数).fini_array 程序退出时调用(析构函数)在 PWN 中:
.plt用于 ROP 调用 puts/printf 等函数.got用于泄露地址(GOT overwrite).fini_array用于控制程序执行流—> [[[CISCN 2019西南]PWN1]]
4. 符号表 (-s)
示例:
0000000000401030 system@plt0000000000401040 puts@plt0000000000404020 __libc_start_main用途:
- 找函数真实/plt 位置
- 确定是否导出某些函数(如没有 system@plt → ret2libc 必须泄露 libc)
- 逆向查找函数名
静态编译文件会在这里看到大量符号。
5. 动态段 (-d)
示例:
(NEEDED) Shared library: [libc.so.6](RPATH) Library rpath: [/home/pwn/lib](INTERP) Program interpreter: ./ld-2.31.soPWN 用途:
- 判断程序依赖的库(与 ldd 对照)
- 能否利用 RPATH/RUNPATH 劫持库
- 是否使用自定义 loader(某些题目会用
./ld-2.xx.so)
6. 重定位表 (-r)
000000404018 R_X86_64_JUMP_SLOT puts@GLIBC_2.2.5PWN 用途:
.rela.plt/.plt.got→ 延迟绑定机制分析- 了解 GOT 结构用于泄露 libc 地址
在 PWN 中的常见用途(总结版)
-
判断 PIE / NX / RELRO 等保护
(ELF header + Program headers) -
定位 GOT / PLT
用于 ret2plt / 泄露地址 -
查看 loader(interpreter)
判断是否需要自带 ld 调试 -
确认动态库依赖、RPATH/RUNPATH
用于库劫持利用 -
查看符号表
判断可直接 ROP 的函数(如 system@plt 是否存在) -
定位入口点、段偏移、代码布局
用于构造攻击 payload