在ELF文件中寻找可执行空间的办法很多,例如:patch无用的代码段、利用.eh_frame、修改PHDR增加一个新的Segment等等。本文介绍一种简单又通用思路:扩展原有的Segment。(注:本方法对与32位程序不适用)

关键词:ELF、可执行空间扩展。

查看Segment

以一个linux上的amd64程序——heapcreator为例,文件大小13480byte(hex为0x34a8),部分映射信息如下。

此时,该文件的前8192byte(0-0x2000)全被映射到了r-xp这个Segment中。0x2000出自于该文件的ELF的PHDR。计算方法: p_filesz p_memsz (4870 hex为0x12ac对齐0x1000,向上取整。

扩展Segment

如果将p_filesz和p_memsz增大,则ELF在被OS加载时,会一直映射后面的内容。验证方法:

  1. 将memsz和filesz修改为heapcreator文件的大小:0x34a8。
  2. 在文件的末尾增加验证的字符"BBBBBBBBBBBBBBBB"。

修改完成后,被映射到OS中的内容为:0x4000(0x34a8对齐0x1000,向上取整)。

此时,可在IDA或gdb中查看文件末尾处增加的数据,已被映射到r-xp中的内存中。