ELF文件格式相关的学习


参考资料

  上边的资料对ELF文件格式的分析非常详细,这边主要记录一下自己感觉比较重要和掌握的不是很清楚的部分,增加一些自己的理解,也方便后续查阅。

ELF文件整体组成

  在《Android软件安全权威指南》中提到一个ELF文件可以按内容划分为三部分,将Sections归到了Program Header TableSection Header Table中,这边我更倾向于将Sections独立出来,于是ELF被分为如下四部分:

  • ELF Header:文件头
  • Program Header Table:程序头表,包含多个Program Header
  • Sections:程序节区,ELF文件的主要内容存放与此
  • Section Header Table:节区头表,包含多个Section Header

ELF文件

  如图展示了ELF文件四个部分的空间上的组成,同时展示了ELF的两个视图:链接视图和执行视图。链接视图只在链接中起作用,而执行视图只在加载并执行时起作用。

  为什么需要区分两种不同视图?(即为什么要区分段和节?)内存分配和权限管理以页为单位,一节太小浪费空间,所以把相同权限的节放到一起管理。可以减少页面内部的碎片,节省了空间,显著提高内存利用率。

ELF Header

略,比较好理解,拖入010Editor即可看到相应模板解析内容

Program Header Table

略,比较好理解,拖入010Editor即可看到相应模板解析内容

Section Header Table

略,比较好理解,拖入010Editor即可看到相应模板解析内容

.dynamic节区

  由于.dynamic节区在010Editor中不会和其他Header Table一样有模板来解析各个组成部分的含义,而是只能看到如下图中的内容,因此需要人工的理解一下各个部分的意义。参考elf文件类型六 Dynamic Section(动态section),文中介绍了.dynamic节区的数据结构和特定值的含义,本文不再赘述。

dynamic section

  如图是32位ELF的.dynamic节区,所以一个条目是d_tag(四字节) + d_un(四字节)共八字节。若在64位下则是一共十六字节。

  其中d_un的值的含义取决于d_tag的值,不同情况下含义不同,可能是代表size,也可能是offset等等,offset也分不同情况,可能是基于ELF文件基址的offset,也可能是基于字符串表地址的offset

字符串表

  一个ELF文件中包含三张字符串表

  • .dynstr
  • .shstrtab
  • .strtab

.dynstr

  .dynstr存放的是.dynamic节区使用的字符串,例如DT_NEEDED类型的依赖库的名称字符串与DT_SONAME类型的动态库名称字符串。

如何定位.dynstr

  通过Section Header Table定位,直接查看Section Header Table中的.dynstr段的偏移即可,如图

.dynstr

  通过Program Header Table定位,首先找到dynamic段,然后读取遍历dynamic段的条目,找到DT_STRTAB,后边的值即为.dynstr的偏移。如图

dynamic_segment

  最后两种方法得到的.dynstr的偏移相同。

.shstrtab

  .shstrtab表存放在.shstrtab节区中(shstrtabSection Header String Table的缩写),他是节区头信息字符串表,里面存放的是Section Header Table结构体使用的字符串信息,典型的有Section的名称索引字段sh_name,所有Section的节区名称字符串都存放在.shstrtab表中。

.strtab

  .strtab表存放在.strtab节区中(strtabString Table的缩写),它是字符串表,里面存放的是ELF中引用的字符串信息,例如ELF中导出的函数名、编译器添加的调试符号名称与源代码文件名等。

符号表

TODO

got表和plt表

TODO

地址重定位表

TODO

TODO


文章作者: 大A
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 大A !
评论
  目录