段由若干个节(Section)构成,节头表对每一个节的信息有相关描述。对可执 行程序而言,节头表是可选的。参考资料 1中作者谈到把节头表的所有数据全部 设置为0,程序也能正确运行!ELF头部是一个关于本文件的路线图(road map) ,从总体上描述文件的结构。下面是ELF头部的数据结构:
typedef struct
{
unsigned char e_ident[EI_NIDENT]; /* 魔数和相关信息 */
Elf32_Half e_type; /* 目标文件类型 */
Elf32_Half e_machine; /* 硬件体系 */
Elf32_Word e_version; /* 目标文件版本 */
Elf32_Addr e_entry; /* 程序进入点 */
Elf32_Off e_phoff; /* 程序头部偏移量 */
Elf32_Off e_shoff; /* 节头部偏移量 */
Elf32_Word e_flags; /* 处理器特定标志 */
Elf32_Half e_ehsize; /* ELF头部长度 */
Elf32_Half e_phentsize; /* 程序头部中一个条目的长 度 */
Elf32_Half e_phnum; /* 程序头部条目个数 */
Elf32_Half e_shentsize; /* 节头部中一个条目的长度 */
Elf32_Half e_shnum; /* 节头部条目个数 */
Elf32_Half e_shstrndx; /* 节头部字符表索引 */
}
Elf32_Ehdr;
下面我们对ELF头表中一些重要的字段作出相关说明,完整的ELF定义请参阅 参考资料 6和参考资料7。
e_ident[0]-e_ident[3]包含了ELF文件的魔数,依次是0x7f、'E'、'L'、'F' 。注意,任何一个ELF文件必须包含此魔数。参考资料 3中讨论了利用程序、工 具、/Proc文件系统等多种查看ELF魔数的方法。e_ident[4]表示硬件系统的位数 ,1代表32位,2代表64位。 e_ident[5]表示数据编码方式,1代表小印第安排序 (最大有意义的字节占有最低的地址),2代表大印第安排序(最大有意义的字 节占有最高的地址)。e_ident[6]指定ELF头部的版本,当前必须为1。e_ident [7]到e_ident[14]是填充符,通常是0。ELF格式规范中定义这几个字节是被忽略 的,但实际上是这几个字节完全可以可被利用。如病毒Lin/Glaurung.676/666( 参考资料 1)设置e_ident[7]为0x21,表示本文件已被感染;或者存放可执行代 码(参考资料 2)。ELF头部中大多数字段都是对子头部数据的描述,其意义相 对比较简单。值得注意的是某些病毒可能修改字段e_entry(程序进入点)的值 ,以指向病毒代码,例如上面提到的病毒Lin/Glaurung.676/666。
一个实际可执行文件的文件头部形式如下:(利用命令readelf)
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x80483cc
Start of program headers: 52 (bytes into file)
Start of section headers: 14936 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 34
Section header string table index: 31 (编辑:云计算网_泰州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|