我想授予 ELF 二进制文件中所有内存页的完全权限(读取、写入和执行)。
请注意,某些安全策略(例如W^X
selinux 中的安全策略)会阻止您的二进制文件运行。
理想情况下,我希望能够将其作为二进制文件或目标文件的转换
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
你想要做的就是改变Flags
段LOAD
有PF_X|PF_W|PF_R
。标志是表的一部分,Elf{32,64}_Phdr
表的偏移量存储在e_phoff
其中Elf{32,64}_Ehdr
(存储在每个 ELF 文件的开头)。
进去看看/usr/include/elf.h
。解析这里涉及的固定大小的 ELF 结构并不复杂。
您不太可能找到可以为您执行此操作的任何标准工具(鉴于这是一件不寻常且不安全的事情),但是更改标志的程序很容易写入C
,Python
或Perl
.
PS您可能还需要“删除”该RELRO
段,这可以通过将其更改p_type
为PT_NULL
.
我还没有找到一个很好的方法来知道哪些页面被映射,因此哪些页面需要被映射 mprotected
。
在 Linux 上,您可以解析/proc/self/maps
以获取该信息。其他操作系统可能会提供不同的方式来实现相同的目标。