ELF 资料记录

ELF 资料记录


英文详细链接: https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/

ELF 文件头

// 32 位程序
#define EI_NIDENT 16 
typedef struct { 
+0  unsigned char e_ident[EI_NIDENT]; 
+16 Elf32_Half e_type; 	     // 文件所属类型 1重定位 2可执行 3动态链接库
+18 Elf32_Half e_machine;    // 处理器体系结构  IA 是 03
+22 Elf32_Word e_version;    // 版本号 正常是 01
+24 Elf32_Addr e_entry; 	 // OEP
+28 Elf32_Off e_phoff; 	     // 程序头表开头处在文件中的偏移量
+32 Elf32_Off e_shoff; 	     // 节头表开头处在文件中的偏移量
+36 Elf32_Word e_flags; 	 // 处理器标志 IA处理器是0
+40 Elf32_Half e_ehsize;     // ELF 文件头的大小 0x34
+42 Elf32_Half e_phentsize;  // 在程序头表中每一个表项的大小 0x20
+44 Elf32_Half e_phnum;      // 程序头表项数目
+46 Elf32_Half e_shentsize;  // 节头表中每一个表项的大小
+48 Elf32_Half e_shnum;      // 节头表中总共有多少个表项
+50 Elf32_Half e_shstrndx;   // 节头表中与节名字表相对应的表项的索引
} Elf32_Ehdr;

节头

typedef struct {
	Elf32_Word	sh_name;	/* section name */
	Elf32_Word	sh_type;	/* SHT_... */ 0x6 是动态链接信息
	Elf32_Word	sh_flags;	/* SHF_... */ 节属性,写、执行、占用内存属性
	Elf32_Addr	sh_addr;	/* virtual address */
	Elf32_Off	sh_offset;	/* file offset */该值是节的第一个字节在文件中的位置
	Elf32_Word	sh_size;	/* section size */
	Elf32_Word	sh_link;	/* misc info */
	Elf32_Word	sh_info;	/* misc info */
	Elf32_Word	sh_addralign;	/* memory alignment */对其粒度
	Elf32_Word	sh_entsize;	/* entry size if table */
} Elf32_Shdr;
# 读取一个elf文件
readelf -h megabeets_0x2
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)
 ……

符号表

typedef struct {
	Elf32_Word	    st_name;
	Elf32_Addr	    st_value;
	Elf32_Word	    st_size;
	unsigned char	st_info;	/* bind, type: ELF_32_ST_... */
	unsigned char	st_other;
	Elf32_Half	    st_shndx;	/* SHN_... */
} Elf32_Sym;

重定位

# 重定位结构

typedef struct { 
 Elf32_Addr r_offset; 
 Elf32_Word r_info; 
} Elf32_Rel; 

typedef struct { 
 Elf32_Addr r_offset; 
 Elf32_Word r_info; 
 Elf32_Sword r_addend; 
} Elf32_Rela;

程序头

typedef struct {
	Elf32_Word	p_type;		/* entry type */
	Elf32_Off	p_offset;	/* file offset */
	Elf32_Addr	p_vaddr;	/* virtual address */
	Elf32_Addr	p_paddr;	/* physical address */
	Elf32_Word	p_filesz;	/* file size */
	Elf32_Word	p_memsz;	/* memory size */
	Elf32_Word	p_flags;	/* entry flags */
	Elf32_Word	p_align;	/* memory/file alignment */
} Elf32_Phdr;

节头字符串表

名称:.shstrtab

保存节名称的字符串

字符串表

名称:.strtab
保存的是全局变量函数名的字符串
而常量字符串是保存在 .rodata 节里面的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值