我需要静态计算包含精灵文本段的第一页的地址,以便使用mprotect()
并使文本段可写。
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
..
[14] .text PROGBITS 08048380 000380 0002e0 00 AX 0 0 128
有什么想法吗?
答案 0 :(得分:1)
这个程序如何正常编译并且不会崩溃。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/mman.h>
extern char __executable_start;
extern char __etext;
int
main (int argc, char **argv)
{
int pagesize = sysconf (_SC_PAGE_SIZE);
char *start =
(char *) (((uintptr_t) & __executable_start) & ~(pagesize - 1));
char *end =
(char *) (((uintptr_t) & __etext + pagesize - 1) & ~(pagesize - 1));
mprotect (start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC);
printf ("Hello world\n");
void *m = main;
*((char *) m) = 0;
exit (0);
}
我使用过__executable_start
和__etext
,但您可能会更好地了解是否可以使用这些工具,至少在手册页中有说明:
命名强>
`etext`, `edata`, `end` - end of program segments
<强>概要强>
extern etext; extern edata; extern end;
<强>描述强>
The addresses of these symbols indicate the end of various program segments: `etext` This is the first address past the end of the text segment (the program code). `edata` This is the first address past the end of the initialized data segment. `end` This is the first address past the end of the uninitialized data segment (also known as the BSS segment).
遵守
Although these symbols have long been provided on most UNIX systems, they are not standardized; use with caution.