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          # 显示动态重定位项

6

7

5)查找依赖库

8

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]

9

3)排查链接问题

查看符号表确认函数是否存在:

readelf -s libfoo.so | grep function_name

 

posted @ 2026-04-11 14:00  夏之夜  阅读(56)  评论(0)    收藏  举报