Linux下二进制文件分析工具

Linux 系统提供了很多工具用于分析二进制文件信息,这篇文章将介绍其中一些最流行的 Linux 工具和命令,其中大部分都是 Linux 发行版的一部分。

file

作用:帮助确定文件类型

$ file ./main
./main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=eb202b6ac03af3a38ce6924d829c1b2d29e09618, for GNU/Linux 3.2.0, not stripped

size

作用: 显示可显示二进制文件中节的大小

$ size ./main
   text    data     bss     dec     hex filename
   1452     584       8    2044     7fc ./main

ldd

作用:确定可执行程序依赖的共享对象文件

$ ldd ./main
        linux-vdso.so.1 (0x00007ffd49e8f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f635a65b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f635a85a000)

hexdump

作用:以 ASCII、十进制、十六进制或八进制显示文件内容

$ hexdump -C ./main | head -n 5
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  03 00 3e 00 01 00 00 00  50 10 00 00 00 00 00 00  |..>.....P.......|
00000020  40 00 00 00 00 00 00 00  b0 36 00 00 00 00 00 00  |@........6......|
00000030  00 00 00 00 40 00 38 00  0d 00 40 00 1f 00 1e 00  |....@.8...@.....|
00000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  |........@.......|

nm

作用:列出可执行程序中的符号

$ nm ./main
000000000000037c r __abi_tag
0000000000001139 T add
0000000000004018 B __bss_start
......

ltrace

作用:跟踪库的调用

ltrace 会显示运行时从库中调用的所有函数。包括 函数名称,传递给该函数的参数,函数返回的内容

ltrace ./main 
printf("%d + %d = %d , c = %d\n", 3, 4, 7, 53 + 4 = 7 , c = 5
)                                                                                                     = 18
+++ exited (status 0) +++

注意:这里printf函数调用的输出内容也显示在这里里

strace

作用:跟踪系统调用和信号

$ strace ./main 
execve("./main", ["./main"], 0x7ffff987bcc0 /* 74 vars */) = 0
......

strings

作用:打印文件中的可打印字符的字符串

$ strings ./main
/lib64/ld-linux-x86-64.so.2
__libc_start_main
......

readelf

作用:显示有关 ELF 文件的信息

$ readelf -h ./main
ELF 头:  Magic:  7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  类别:                              ELF64
  数据:                              2 补码,小端序 (little endian)
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI 版本:                          0
  类型:                              DYN (Position-Independent Executable file)
  系统架构:                          Advanced Micro Devices X86-64
  版本:                              0x1
  入口点地址:              0x1050
  程序头起点:              64 (bytes into file)
  Start of section headers:          14000 (bytes into file)
  标志:             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         13
  Size of section headers:           64 (bytes)
  Number of section headers:         31
  Section header string table index: 30

objdump

作用:还原汇编指令,读取二进制中特定段的信息,还原源代码信息

$ objdump -d ./main | head -n 10

./main:     文件格式 elf64-x86-64


Disassembly of section .init:

0000000000001000 <_init>:
    1000:       48 83 ec 08             sub    $0x8,%rsp
    1004:       48 8b 05 c5 2f 00 00    mov    0x2fc5(%rip),%rax        # 3fd0 <__gmon_start__@Base>
    100b:       48 85 c0                test   %rax,%rax