为什么 ELF 的段不连续?

时间:2021-06-25 14:58:34

标签: c gcc elf

我已阅读此 infect.c 源代码,其中演示了如何使用恶意入口点感染 ELF 文件。

它是这样进行的:

  1. 将可执行文件加载到内存中
  2. 找到一个合适的段来扩展负载
  3. 更新payload跳转到原来的入口点位置
  4. 更新入口点以跳转有效载荷位置
  5. 使用恶意负载扩展段

以下是它如何发现合适的博士:

static int findinfectionphdr(Elf64_Phdr const *phdr, int count)
{
    Elf64_Off pos, endpos;
    int i, j;

    for (i = 0 ; i < count ; ++i) {
    if (phdr[i].p_filesz > 0 && phdr[i].p_filesz == phdr[i].p_memsz
                 && (phdr[i].p_flags & PF_X)) {
        pos = phdr[i].p_offset + phdr[i].p_filesz;
        endpos = pos + sizeof infection;
        for (j = 0 ; j < count ; ++j) {
        if (phdr[j].p_offset >= pos && phdr[j].p_offset < endpos
                        && phdr[j].p_filesz > 0)
            break;
        }
        if (j == count)
        return i;
    }
    }
    return -1;
}

第一个循环查找要感染的可执行段,第二个循环测试是否有任何其他段容易与受感染的段重叠。

如果所有段都是连续的,则无法执行此感染。

所以这是我的问题:为什么编译器不在 ELF 文件中生成连续的段? 或者:是什么证明了它们之间的差距?

1 个答案:

答案 0 :(得分:0)

<块引用>

是什么证明了他们之间的差距?

这些段被mmap放入内存中。 mmap 只能在整个页面方面执行映射。因此,不能有一个在页面中间结束的可执行段和一个跟在它后面没有间隙的不可执行段。

另见this answer

相关问题