我想授予对 ELF 二进制文件中所有内存页面的完全权限(读取、写入和执行)。
请注意,某些安全策略,例如 selinux 中的W^X 会阻止您的二进制文件运行。
理想情况下,我希望能够将其作为二进制文件或目标文件的转换来完成
在您的二进制文件上运行 readelf -Wl。您会看到类似以下内容:
$ readelf -Wl /bin/date
Elf file type is EXEC (Executable file)
Entry point 0x4021cf
There are 9 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x0001f8 0x0001f8 R E 0x8
INTERP 0x000238 0x0000000000400238 0x0000000000400238 0x00001c 0x00001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x00dde4 0x00dde4 R E 0x200000
LOAD 0x00de10 0x000000000060de10 0x000000000060de10 0x0004e4 0x0006b0 RW 0x200000
DYNAMIC 0x00de28 0x000000000060de28 0x000000000060de28 0x0001d0 0x0001d0 RW 0x8
NOTE 0x000254 0x0000000000400254 0x0000000000400254 0x000044 0x000044 R 0x4
GNU_EH_FRAME 0x00cb8c 0x000000000040cb8c 0x000000000040cb8c 0x0002f4 0x0002f4 R 0x4
GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10
GNU_RELRO 0x00de10 0x000000000060de10 0x000000000060de10 0x0001f0 0x0001f0 R 0x1
然后您要做的是将LOAD 段上的Flags 更改为PF_X|PF_W|PF_R。标志是Elf{32,64}_Phdr 表的一部分,表的偏移量存储在Elf{32,64}_Ehdr 的e_phoff 中(存储在每个ELF 文件的开头)。
查看/usr/include/elf.h。解析这里涉及的固定大小的 ELF 结构并不复杂。
您不太可能找到任何标准工具可以为您执行此操作(考虑到这是一件非常不寻常且不安全的事情),但是在C、Python 中编写更改标志的程序是微不足道的或Perl。
附:您可能还需要“删除”RELRO 段,这可以通过将其 p_type 更改为 PT_NULL 来完成。
我还没有找到一个很好的方法来知道哪些页面被映射,因此哪些页面需要mprotected。
在 Linux 上,您可以解析 /proc/self/maps 以获取该信息。其他操作系统可能会提供不同的方法来实现相同的目标。