我想授予一个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
你想要做的又是什么改变Flags
上LOAD
段有PF_X|PF_W|PF_R
。这些标志是Elf{32,64}_Phdr
表的一部分,表的偏移量存储在Elf{32,64}_Ehdr
(存储在每个ELF文件的开始处)的e_phoff
中。
查看/usr/include/elf.h
。解析这里涉及的固定大小的ELF结构并不复杂。
你是不可能找到任何标准的工具,它会为你做这个(因为这是这样做的一个不寻常的和不安全的事情),但一个程序更改标志是琐碎C
,Python
或Perl
写。
P.S.您可能还需要“删除”RELRO
细分受众群,您可以将其p_type
更改为PT_NULL
。
我还没有发现知道哪些页面被映射,因此该页面必须mprotected
的好方法。
在Linux上,您可以解析/proc/self/maps
以获取该信息。其他操作系统可能会提供不同的方式来实现相同的目标。
既然'ELF'文件格式与语言无关,为什么C++标签呢? –
因为如果我最终不得不在每一页上调用'mprotect',我都会用C++来完成。 – IanPudney