样本内容:静态分析信息-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
}
]
}
}