Linux 学习笔记之(十四)二进制分析工具
一、背景
存在一个编译好的二进制可执行文件(Linux),此时需要分析它的结构或依赖库或是否含有某个函数等,此时可以通过二进制分析工具对其进行分析。
二、工具
1、objdump
1.1 作用
objdump 是一个功能强大的二进制文件分析工具,主要用于显示目标文件、可执行文件和共享库的详细信息. 需要安装 binutils 包
1.2 常用选项
| 选项 | 说明 |
|---|---|
-d / --disassemble |
反汇编代码段(.text) |
-D / --disassemble-all |
反汇编所有段 |
-S / --source |
交叉显示源代码和汇编(需-g编译) |
-h / --section-headers |
显示节区头表 |
-x / --all-headers |
显示所有头信息 |
-t / --syms |
显示符号表 |
-T / --dynamic-syms |
显示动态符号表 |
-r / --reloc |
显示重定位表 |
-R / --dynamic-reloc |
显示动态重定位表 |
-p / --private-headers |
显示程序头/段信息 |
-C / --demangle |
解码C++符号名称 |
-l / --line-numbers |
显示行号信息 |
1.3 实战
1) 反汇编先显示
objdump -d /bin/ls # 反汇编代码段 objdump -D /bin/ls # 反汇编所有段 objdump -S /bin/ls # 混合显示源代码和汇编(需要调试信息)
2)节区信息/查看可执行文件结构(输出节区信息(大小、虚拟地址、文件偏移等)。)
objdump -h /bin/ls # 显示节区头信息
objdump -x /bin/ls # 显示所有头信息
3)符号表分析
objdump -t /bin/ls # 显示符号表
objdump -T /bin/ls # 显示动态符号表
4)动态段信息
objdump -p /bin/ls # 显示程序头/段信息
objdump -R /bin/ls # 显示动态重定位项

5)查找依赖库

6)分析函数实现
objdump -d -C /usr/bin/g++ | grep -A 20 "main("
7)调试符号查找
objdump -t libtest.so | grep function_name
2、readelf
2.1 作用
readelf 是一个用于显示 ELF(Executable and Linkable Format)文件信息的命令行工具,常用于分析 Linux/Unix 系统中的可执行文件、目标文件(.o)、共享库(.so)等。
2.2 常用选项
| 选项 | 说明 |
|---|---|
-h / --file-header |
显示 ELF 文件头信息(魔数、架构、入口地址等) |
-l / --program-headers |
显示程序头表(段信息,如加载地址、权限) |
-S / --section-headers |
显示节区头表(代码、数据等节的详细信息) |
-s / --syms |
显示符号表(函数、全局变量等符号地址) |
-d / --dynamic |
显示动态段信息(依赖的共享库、动态符号表等) |
-r / --relocs |
显示重定位表(链接时需要修正的地址) |
-n / --notes |
显示 NOTE 段信息(如内核版本、ABI 标签) |
-V / --version-info |
显示版本控制信息(如符号版本) |
2.3 实战
1)查看可执行文件基本信息
readelf -h /bin/ls
输出内容
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Entry point address: 0x404890 ...(其他信息如架构、节区数量等)
2)分析依赖的共享库
readelf -d /usr/bin/python3 | grep NEEDED
输出示例
0x0000000000000001 (NEEDED) 共享库:[libc.so.6]

3)排查链接问题
查看符号表确认函数是否存在:
readelf -s libfoo.so | grep function_name


浙公网安备 33010602011771号