• ELF文件扩大text节区/TEXT段的大小


    实际没必要单单扩大text节区的大小,因为一般text节区所在的segment段一般是可读可写可执行的,所以认为此段为text段,可以直接增加ELF文件中此段的大小。

    ELF文件扩大text节区

    不移动其他PT_LOAD段

    首先定位到text节区所在的PT_LOAD段,然后找到text节区的结束位置。如果需要将text节区扩展0x200大小就需要把text节区后的此PT_LOAD段的其他节区数据向后移动0x200+的位置,但是注意移动的数据不能够覆盖下一个PT_LOAD段的数据。下图中text节区的结束位置为0x91C,所以需要将0x91C后的其他节区数据移动到0xB1C地址处。

    修改此PT_LOAD段的p_filesz和p_memsz的大小(增加0x200

    然后需要修改program handle table中所有属于text节区所在段的 其他段(文件偏移大于text节区原结束地址的)的文件偏移。对于此例,因为PT_GNU_RELRO段在此text节区所在的PT_LOAD段中且其文件偏移大于text节区的原结束地址,所以需要修正其对应的新的文件偏移, 虚拟地址和物理地址。

    这样就达到了增加text节区的效果,如果想使其他分析工具能够识别还需要修正section handle table中的text节区,还有被移动的节区的信息。这里为了方便直接将section handle table清空(将ELF文件头中的相关数据设置为0。

    为了验证是否成功,在原text节区被扩展的区域的第一个字节修改为0x12345678, ida调试程序发现成功。

    总结:这里相当于是在text节区所在的PT_LOAD段中和下一个PT_LOAD段的中间寻找空白区域,利用此空白区域来增加text节区的大小。

    移动下一个PT_LOAD段

    因为第一种方法是在寻找两个PT_LOAD段中间的空白区域来扩展text节区,如果空白区域不够大就需要移动下一个PT_LOAD段来增加空白区域。

    将text节区所在PT_LOAD段的下一个PT_LOAD段移动到PAGE_SIZE+ p_offset处

    修正program handle table中所有在下一个PT_LOAD段中的其他段的文件偏移,

    这样就可以有更多的空白区域来扩展text节区。
    这里有几个地方需要注意:

    • text节区所在的PT_LOAD段中的数据在文件和内存中都不能与下一个PT_LOAD段重合,避免数据被覆盖

    • 下一个PT_LOAD段在文件中的起始地址的页偏移要和在内存中的页偏移相等,不相等此elf文件就会无法加载(原因暂时不知道
      下图中PT_LOAD段在文件中的页偏移与在内存中的页偏移不相等,所以运行时会出现Segmentation fault错误。

    • 下一个PT_LOAD段的p_vaddr内存虚拟地址不能更改,因为一般在text节区所在的段中会访问全局变量会通过got表进行,而got表在下一个PT_LOAD段中。text节区中通过在内存中got表项的偏移获取到对应的got表项,而如果got表所在的PT_LOAD段的虚拟地址修改,那么text节区索引到的将不再是正确的got表项目。
      (其实也可以修改,但是需要做很多处理,将got表拷贝一份放在原位置,但是这样会覆盖原位置的其他数据)

    ELF文件扩大TEXT段的大小

    在TEXT段的文件末尾插入PAGESIZE(0x1000)大小的数据

    遍历program handle table将所有大于TEXT段的其他段的p_offset都增加PAGESIZE.

    修改TEXT段的p_filsz和p_memsz,注意这里最大变为p_filsz & (~PAGESIZE)和p_memsz & (~PAGESIZE)大小,也就是大小按照PAGESIZE大小对齐后的大小。 如果超过这个大小,超过的数据是无效的(会被后面一个PT_LOAD段映射覆盖)。

    这样就可以在增加的区域中添加代码,进一步感染ELF文件。

  • 相关阅读:
    Windows NT 的历史
    Windows 下 Mysql8.0.12 的安装方法
    [知乎] 机械硬盘和固态硬盘的简单对比
    syncthing 多主机同步文件工具
    delphi 2007 远程调试
    关于delphi PAServer 远程调试DLL文件
    关于 datasnap Stream的英文博客能容
    DataSnap 用TStream 传递大数据 返回流大小为-1的情况
    c++ builder xe2 (Embarcadero rad studio) 远程调试 同样适用于 delphi 远程调试 教程
    Delphi10 安装Graphics32
  • 原文地址:https://www.cnblogs.com/revercc/p/16642384.html
Copyright © 2020-2023  润新知