也许我误解了这是如何工作的,但据我所知,ELF 二进制文件可以为堆栈提供 NX 保护,也可以没有。我假设二进制文件中有一个地方可以说明这一点,但我不确定这些信息的确切存储位置。
您如何从反汇编中找出 ELF 二进制文件的页面权限?
也许我误解了这是如何工作的,但据我所知,ELF 二进制文件可以为堆栈提供 NX 保护,也可以没有。我假设二进制文件中有一个地方可以说明这一点,但我不确定这些信息的确切存储位置。
您如何从反汇编中找出 ELF 二进制文件的页面权限?
权限位于程序头的 p_flags 成员中。
typedef struct {
uint32_t p_type;
Elf32_Off p_offset;
Elf32_Addr p_vaddr;
Elf32_Addr p_paddr;
uint32_t p_filesz;
uint32_t p_memsz;
uint32_t p_flags;
uint32_t p_align;
} Elf32_Phdr;
p_flags This member holds a bit mask of flags relevant to the
segment:
PF_X An executable segment.
PF_W A writable segment.
PF_R A readable segment.
A text segment commonly has the flags PF_X and PF_R. A
data segment commonly has PF_X, PF_W and PF_R.
ELF 二进制文件中有名为“程序头”的头。当内核将二进制文件加载到内存中时,它只关心 3 种类型的标头。PT_LOAD
指示是否需要将头对应的内容加载到内存中,PT_GNU_STACK
指示是否需要使堆栈可执行以及PT_INTERP
用于确定用于执行二进制文件的解释器。
所以是的,内核根据 ELF 中是否存在程序头将堆栈设置为不可执行或可执行。ELF 进程稍后可以使用mmap/mmap2/mprotect
libc/system 调用为内存中的特定页面提供可执行权限。