0

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

何か案は?

4

1 に答える 1

2

正常にコンパイルされ、クラッシュしないこのプログラムはどうですか。

#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.
于 2014-12-20T16:59:00.343 に答える