• ELF文件格式分析


    一般的 ELF 文件包括三个索引表:ELF  header,Program  header  table,Section header table。

    1)ELF  header:在文件的开始,保存了路线图,描述了该文件的组织情况。

    2)Program  header  table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。

    3)Section  header  table :包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。

    一、分析ELF文件头

    vi /usr/include/elf.h查看elf头数据结构

    用readelf –h 1(可执行文件名)读取一个简单可执行文件的elf头

    可见elf头大小为52字节,用dump命令16进制读取前52个字节进行分析

    命令:hexdump –x 1 –n 52

     

    解析:

    第一行,对应e_ident[EI_NIDENT]。小端法实际表示内容为7f454c46010101000000000000000000,前四个字节为elf固定开头7f454c46(0x45,0x4c,0x46是'e','l','f'对应的ascii编码),表示这是一个ELF对象。接下来的一个字节01表示是一个32位对象,接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.

    第二行,e_type值为0x0002,表示是一个可执行文件。e_machine值为0x0003,表示是intel80386处理器体系结构。e_version值为0x00000001,表示是当前版本。e_entry值为0x08048320,表示入口点。e_phoff值为0x00000034,表示程序头表的偏移量为0x34即52个字节刚好是elf头大小。

    第三行,e_shoff值为0x0000114c,表示节头表的偏移地址。e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0034,表示elf文件头大小52个字节。e_phentsize表示一个程序头表中的入口(程序头)的长度,值为0x0020即32字节。e_phnum的值为0x0009,给出程序头表中的入口数目。e_shentsize值为0x0028表示节头表入口(节头)大小为40字节。

    第四行,e_shnum值为0x001e,表示节头表入口有30个。e_shstrndx值为0x001b,表示节名串表的在节表中的索引号。

    二、通过文件头找到section header table,理解其内容

    vi /usr/include/elf.h查看节头数据结构

    使用readelf -S 1读取节头表

    使用命令hexdump 1查看16进制值

    由前面分析elf头可知节头表的偏移地址为0x0000114c即图示位置开始为节头表

    可见全为0,如节头表所示为空节

    接着看第一个节

    三个红框分别是节的起始地址、偏移地址和大小,可以看出与readelf的显示结果一致

    随后的40字节是第二个段,以此类推不再赘述

    第十三个节.text节为可执行指令的集合

    下面用 hexdump 的方法去读取.text这个 section 中的内容,通过看section header中.text中offset和size分别是0x00000320和0x00000192,通过16进制向10进制转换得到offset:800和size:402。

    输入 hexdump –s 800 –n 402 –C 1 

    然后使用readelf -x 13 1

    两者也是一致的

    使用objdump -d 1查看.text节反汇编代码

    结果也是一致的

    可以用同样的方法分析其他节

    三、理解常见.text .strtab .symtab .rodata等section

    • .text section是可执行指令的集合,.data和.text都是属于PROGBITS类型的section,这是将来要运行的程序与代码。查询段表可知.text section的位偏移为0x0000440,size为0x0000192。  
    • .strtab section是属于STRTAB类型的section,可以在文件中看到,它存着字符串,储存着符号的名字。位偏移为0x0001f08,size为0x0000238。
    • .symtab section存放所有section中定义的符号名字,比如“data_items”,“start_loop”。 .symtab section是属于SYMTAB类型的section,它描述了.strtab中的符号在“内存”中对应的“内存地址”。 位偏移为0x00018f0,size为0x0000618。
    • .rodata section,ro代表read only,即只读数据(const)。位偏移为0x00005e0,size为0x000000c。

     

  • 相关阅读:
    CSS3实战之新增的选择器
    前端攻城狮学习笔记八:自己实现string的substring方法,人民币小写转大写,数字反转,正则优化
    负值之美:负margin在页面布局中的应用
    关于vs2015无法启动iis服务
    ado.net中的 sqlconnection sqlcommand datareader dataset SqlDataAdapter之间的关系
    C# Lambda表达式详细总结
    Response.cookies和Request.cookies
    Quartz CronTrigger最完整配置说明 陀螺
    浅析如何去除Strings中的C#空格 陀螺
    C#Winform中WebBrowser控件的特性和详细调用方法 陀螺
  • 原文地址:https://www.cnblogs.com/huyufeng/p/5550887.html
Copyright © 2020-2023  润新知