跳到正文

样本内容:静态分析信息-ELF文件格式

ELF文件是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。1999年,被86open项目选为x86架构上的类Unix操作系统的二进制文件标准格式,用来取代COFF。因其可扩展性与灵活性,也可应用在其它处理器、计算机系统架构的操作系统上。

一、基本信息

项目内容
中文名称可执行与可连接格式
英文名称Executable and Linkable Format
开发者Unix系统实验室
常用扩展名o,so,elf,prx

二、文件结构

ELF文件的内容概要,具体详情可参考LinuxBase的标准化文档: 《ELF格式》

1、文件头

(1)文件类型标识

文件编译的位数,是32位格式还是64位格式。

(2)数据存放规则

标识文件数据存储采用的是小尾模式还是大尾模式。

(3)文件头版本

原生和当前ELF版本时候设置为1。

(4)应用二进制接口(ABI)类型

标识目标操作系统的应用二进制接口类型。当标识"System V"则表示平台无关性。

常见的值为:System V、HP-UX、NetBSD、Linux、GNU Hurd、Solaris、AIX、IRIX、FreeBSD、Tru64、Novell Modesto、OpenBSD、OpenVMS、NonStop Kernel、AROS、Fenix OS、CloudABI、Stratus Technologies OpenVOS。

(5)文件版本

此属性进一步规定了ABI的版本,对它的详细解释依赖于具体的ABI类型。在Linux内核中(至少在2.6版本之后)已不再定义此属性,它已经被可执行的静态链接文件忽略。在此场景下,EI_PAD的偏移量和大小均为8。

在glibc 2.12+中,ABI类型为Linux时候,此属性用来标记动态链接器的ABI版本。

(6)目标系统架构

特殊要求的系统架构类型(ISA)。

常见的值为:No specific instruction set、AT&T WE 32100、SPARC、x86、Motorola 68000 (M68k)、Motorola 88000 (M88k)、Intel MCU、Intel 80860、MIPS、IBM_System/370、MIPS RS3000 Little-endian、Reserved for future use、Hewlett-Packard PA-RISC、Reserved for future use、Intel 80960、PowerPC、PowerPC (64-bit)、S390, including S390x、IBM SPU/SPC、Reserved for future use、NEC V800、Fujitsu FR20、TRW RH-32、Motorola RCE、ARM (up to ARMv7/Aarch32)、Digital Alpha、SuperH、SPARC Version 9、Siemens TriCore embedded processor、Argonaut RISC Core、Hitachi H8/300、Hitachi H8/300H、Hitachi H8S、Hitachi H8/500、IA-64 Stanford MIPS-X、Motorola ColdFire、Motorola M68HC12、Fujitsu MMA Multimedia Accelerator、Siemens PCP、Sony nCPU embedded RISC processor、Denso NDR1 microprocessor、Motorola Star*Core processor、Toyota ME16 processor、STMicroelectronics ST100 processor、Advanced Logic Corp. TinyJ embedded processor family、AMD x86-64、TMS320C6000 Family、MCST Elbrus e2k、ARM 64-bits (ARMv8/Aarch64)、RISC-V、Berkeley Packet Filter、WDC 65C816。

(7)目标文件类型

标识客体文件类型,常见值为:NONE、REL、EXEC、DYN、CORE、LOOS、HIOS、LOPROC、HIPROC。

(8)头表入口数量

标记头表入口数量。

(9)程序入口点

这是进程开始执行的入口点的内存地址。该字段的长度为 32 位或 64 位,具体取决于之前定义的格式。

2、其他内容

同PE文件一样,这里包括节列表、共享库、段列表、导入和导出函数列表、加壳情况、解释器等属性内容,用来说明ELF文件的静态详细信息。

三、完整样例结构

{
  "elf_info": {
    "shared_libraries": [
      "libdl.so",
      "liblog.so",
      "libz.so",
      "libc.so",
      "libm.so",
      "libstdc++.so"
    ],
    "section_list": [
      {
        "name": "",
        "virtual_address": 0,
        "section_type": "NULL",
        "flags": "",
        "phisical_offset": 4808,
        "size": 0
      },
      {
        "name": ".note.android.ident",
        "virtual_address": 308,
        "section_type": "NOTE",
        "flags": "A",
        "phisical_offset": 308,
        "size": 152
      },
      {
        "name": ".note.gnu.build-id",
        "virtual_address": 460,
        "section_type": "NOTE",
        "flags": "A",
        "phisical_offset": 460,
        "size": 36
      },
      {
        "name": ".dynsym",
        "virtual_address": 496,
        "section_type": "DYNSYM",
        "flags": "A",
        "phisical_offset": 496,
        "size": 1360
      },
      {
        "name": ".dynstr",
        "virtual_address": 1856,
        "section_type": "STRTAB",
        "flags": "A",
        "phisical_offset": 1856,
        "size": 2852
      }
    ]
  }
}