我已阅读此 infect.c 源代码,其中演示了如何使用恶意入口点感染 ELF 文件。
它是这样进行的:
以下是它如何发现合适的博士:
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 文件中生成连续的段? 或者:是什么证明了它们之间的差距?
答案 0 :(得分:0)
是什么证明了他们之间的差距?
这些段被mmap
放入内存中。 mmap
只能在整个页面方面执行映射。因此,不能有一个在页面中间结束的可执行段和一个跟在它后面没有间隙的不可执行段。
另见this answer。