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

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

评论

事实证明它在标题中,但我可能会将问题留给像我一样在谷歌搜索方面遇到麻烦的其他人。为我服务,因为不知道ELF标头格式。

好吧,您可以随时回答自己的问题。

只要有资格,我就会答应,除非有人花哨地回答:)

#1 楼

权限在程序标头的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.


#2 楼

ELF二进制文件中包含名为“程序标头”的标头。当内核将二进制文件加载到内存中时,它只关心3种类型的头文件。


因此,是的,内核根据ELF中是否存在程序标头将堆栈设置为不可执行或可执行。 ELF进程以后可以使用PT_LOAD libc / system调用来赋予内存中特定页面的可执行特权。