ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ELF注入之增加依赖库

2022-06-10 17:38:17  阅读:413  来源: 互联网

标签:文件 依赖 dynstr dynamic ELF header program table 注入


在linux内核把ELF文件加载到内存中时,如果此ELF含有动态链接信息就会去解析并加载相应的依赖库。ELF动态链接信息保存在.dynamic节区中,类型为DT_NEEDED的项描述了对应的依赖库信息。

注入思路

  • 先将文件末尾进行填充对齐,然后将.dynamic节区移动到文件末尾并增加一个DT_NEEDED类型的项
  • 将Program header table移动到文件末尾,并增加一个类型为PT_LOAD类型的项,指向文件末尾新填充的区域
  • 将.dynstr字符串表移动到文件末尾,增加需要注入的动态库的字符串信息
  • 修复ELF文件中的各个字段

手动增加依赖库

  • 将文件末尾填充对齐,然后将.dynamic节区移动到末尾并在开头增加类型为DT_NEEDED的项,此项第二个字段为新的.dynstr字符串表中对应新增加依赖库的字符串偏移
  • 新的program header table中尾部新增加PT_LOAD类型的项,此项指向文件尾部新增加的数据,因为此部分需要加载到内存中。

然后先修正ELF文件头中的e_phoff为新的program header table在文件中的偏移,因为新的program header table增加了一个LOAD段所以e_phnum增加1

新的program header table的第一项为PT_PHDR类型,其指向自身所以需要修正指向新的program header table

新的program header table中在最后新增加了PT_LOAD类型的项,此项是为了将文件尾部新增加的数据加载到内存,所以其修正为指向文件尾部新增加的区域

新的.dynamic节区中还保存了各个.dynstr字符串表的偏移个大小信息,因为.dynstr字符串表已经移动到文件尾部并修改,所以需要进行修正。
(这里需要特别注意的是,.dynamic 的STRTAB 05类型的项中保存的是.dynstr字符串表的虚拟地址偏移,不是文件偏移)

实际到这里就可以结束了,但是为了让readelf 可以解析出文件的信息,需要把section中的.dynamic和.dynstr对应的节区头信息修正一下。

  • 修正.dynamic的section header

  • 修正.dynstr的section header

效果

利用readelf查看增加了依赖库的ELF文件的program header table信息。发现新增加了一个PT_LOAD类型的段,并且此段中包含了.dynamic和.dynstr节区

查看.dynamic中的动态链接信息,发现libhello.so被加入了依赖库列表

运行程序发现我们在文件末尾新增加的PT_LOAD段被map到内存中

查看进程map表发现libhello.so已经map到了内存空间中

标签:文件,依赖,dynstr,dynamic,ELF,header,program,table,注入
来源: https://www.cnblogs.com/revercc/p/16363983.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有