我想授予一個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