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 header 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 header 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表的相对偏移也被改变了,那么text节区索引到的将不再是正确的got表项目。

ELF文件扩大TEXT段的大小

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

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

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

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

posted @ 2022-08-31 12:26  怎么可以吃突突  阅读(695)  评论(0编辑  收藏  举报