ELF 二进制文件中的页面权限存储在哪里?

逆向工程 拆卸
2021-07-10 07:07:49

也许我误解了这是如何工作的,但据我所知,ELF 二进制文件可以为堆栈提供 NX 保护,也可以没有。我假设二进制文件中有一个地方可以说明这一点,但我不确定这些信息的确切存储位置。

您如何从反汇编中找出 ELF 二进制文件的页面权限?

2个回答

权限位于程序头的 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/mprotectlibc/system 调用为内存中的特定页面提供可执行权限。