- 🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)
- 🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd
- 🌐系列专栏:Linux技术
- 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家三连支持一下呀!!! 👉关注✨、点赞👍、收藏📂、评论。
- 如需转载请参考转载须知!!
引言
- 在日常的Linux软件的开发过程中,经常需要对二进制文件进行分析,并对其中的关键信息进行提取。本文对Linux下二进制可执行文件分析的工具做了一个小结,供各位参考。
- 具体的分析方式,根据使用场景,可分为静态和动态两种。
静态分析
file
- 日常处理的文件不一定都是可执行文件,通过该命令,可以帮助我们确定二进制文件的具体类型(如ELF、ASCII等);
- 示例:
[qxhgd@localhost]$$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=94943a89d17e9d373b2794dcb1f7e38c95b66c86, stripped
[qxhgd@localhost]$$ file /etc/passwd
/etc/passwd: ASCII text
ldd
- 用于显示二进制文件所需的动态库,通常用于解决程序因缺少某个库文件而不能运行的一些问题。
- 示例如下:
[qxhgd@localhost]$ ldd /bin/ls
linux-vdso.so.1 => (0x00007ffef5ba1000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fea9f854000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fea9f64f000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fea9f446000)
libc.so.6 => /lib64/libc.so.6 (0x00007fea9f079000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fea9ee17000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fea9ec13000)
/lib64/ld-linux-x86-64.so.2 (0x00007fea9fa7b000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fea9ea0e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fea9e7f2000)
strings
- print the strings of printable characters in files.
- 用于查找二进制文件中包含的字符串。它将提取文件中的可打印字符并显示它们。实际中,可结合grep进行搜索。
- 示例(打印so中,某个函数所在文件,可变相确认到底该文件编入了哪个so库中):
[qxhgd@localhost]$strings -f "*.so" | grep "xxxxxx"
Hexdump
- Display file contents in ASCII, decimal, hexadecimal, or octal.
- Hexdump 是 Linux 系统中的一个强大工具,主要由开发人员和应用程序调试人员使用。它可以将输入文件和数据转换为令人愉快且可读的格式。例如,如果您使用二进制数据,这将很难理解。为了方便起见,您可以快速将二进制数据转换为十六进制或十进制。
- 示例(以ASCII格式显示文件):
[qxhgd@localhost]$hexdump -C /bin/ls | head
[qxhgd@localhost]$hexdump -C system.log
size
- GNU 的 size 程序列出参数列表中各目标文件或存档库文件的段大小 — 以及总大小。默认情况下,对每个目标文件或存档库中的每个模块都会产生一行输出。
- 示例:
[qxhgd@localhost ~]$ size /bin/ls
text data bss dec hex filename
103119 4768 3360 111247 1b28f /bin/ls
readelf
- Display information about ELF files.
- 用来显示一个或者多个 elf 格式的目标文件的信息,可以通过它的选项来控制显示哪些信息
- 示例:
– 查看头部信息:
[qxhgd@localhost ~]$ readelf -h /bin/ls
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x4042d4
Start of program headers: 64 (bytes into file)
Start of section headers: 115696 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 30
– 查看全部信息(如符号表)
[qxhgd@localhost ~]$ readelf -a /bin/ls
nm
- nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。
- nm命令的输出包含三个部分:
– 符号值。默认显示十六进制,也可以指定;
– 符号类型。小写表示是本地符号,大写表示全局符号(external);
– 符号名称。 - nm命令的部分功能和readelf是重叠的,但是就符号信息而言,二者是有区别的,整体看,readefl的功能更为强大。
- 示例:
[qxhgd@localhost ~]$ nm hello | tail
0000000000600e20 d __JCR_END__
0000000000600e20 d __JCR_LIST__
00000000004005b0 T __libc_csu_fini
0000000000400540 T __libc_csu_init
U __libc_start_main@@GLIBC_2.2.5
000000000040051d T main
U printf@@GLIBC_2.2.5
0000000000400490 t register_tm_clones
0000000000400430 T _start
0000000000601030 D __TMC_END__
objdump
- Display information from an object file;
- objdump命令是Linux下的反汇编工具,可对目标文件或者可执行文件进行操作,它以一种可阅读的格式,让人们更多地了解二进制文件中的附加信息。
- 常用选项:
-d, --disassemble Display assembler contents of executable sections
-D, --disassemble-all Display assembler contents of all sections
-S, --source Intermix source code with disassembly
- 示例:
[qxhgd@localhost]$objdump -D -S main.o > main.o.txt
动态分析
ltrace
- A library call tracer;
- 系统调用的过程:
– 用户调用syscall->glibc库->内核执行,返回值->glibc库->syscall->用户。 - ltrace通过动态链接库的方式来实现跟踪,它在进程执行时插入自己的代码,对库函数的调用进行拦截和记录。
- ltrace的功能是能够跟踪进程的库函数调用,它会显现出哪个库函数被调用。
- 示例:
[qxhgd@localhost]$ ltrace ls
strace
- strace 是 Linux 系统下的一个强大的工具,用于跟踪进程的系统调用和信号。它可以帮助你了解一个程序在运行时与操作系统进行了哪些交互,例如打开文件、读取或写入数据、网络通信等
- Strace常用来跟踪进程在用户态执行的系统调用流程,但不会跟踪到内核里面发生的事情(内核里面用ftrace)。
- ltrace与strace使用的技术大体相同,但ltrace在对支持fork和clone方面,不如strace。strace在收到frok和clone等系统调用后,做了相应的处理,而ltrace没有。
- 示例:
[qxhgd@localhost]$ strace -f /bin/ls
gdb
- GNU 调试器,用于调试二进制程序。它允许你设置断点、单步执行代码、查看变量值等。
- 无需多言,懂的都懂。
小结
- 一旦您熟悉了这些原生 Linux 二进制分析工具并了解了它们提供的输出,您就可以转向更高级、更专业的开源二进制分析工具,例如 radare2等。
如本文对你有些许帮助,欢迎大佬支持我一下,您的支持是我持续创作的不竭动力
支持我的方式