[OK]を試してみましょう。
#include <stdio.h>
int (*functionPtr)(int,int);
int addInt(int n, int m) {
return n+m;
}
int main()
{
functionPtr = &addInt;
printf("%p\n", functionPtr);
while(1){};
*(int *) functionPtr = 0x0;
return 0;
}
コンパイル
$ gcc -o ./main.c main
起動最初のコンソールで、このアプリ: ここコードです。
$ ./main
0x40052d
第2コンソールで
$ cat /proc/`pidof main`/maps
00400000-00401000 r-xp 00000000 08:01 6345711 /tmp/main
00600000-00601000 r--p 00000000 08:01 6345711 /tmp/main
00601000-00602000 rw-p 00001000 08:01 6345711 /tmp/main
...
このR-XPは、カーネルがこのバイナリをロードしたとき、それは読み取りとプライベート仮想マッピングにテキストセクションをマッピングされたことを意味し、許可を実行しますが、書き込み権限はありません。セキュリティ上の理由からこれが行われていると思います。
カーネルの適切なvma_areaが書き込み不可能とマークされているため、未処理のユーザースペースページフォルト、つまりsegfaultが発生します。
今let'usあなたはこれがあなたの実行時のパッチ適用のアイデアであなたを助けることに気づくでしょう適切な場所に
17 if (mprotect((void *)0x00400000, 4096, PROT_READ | PROT_WRITE | PROT_EXEC)) {
18 printf("error\n");
19 return -1;
20 }
をMPROTECT呼び出しを追加します。
00400000-00401000 rwxp 00000000 08:01 6345711 /tmp/main
00600000-00601000 r--p 00000000 08:01 6345711 /tmp/main
00601000-00602000 rw-p 00001000 08:01 6345711 /tmp/main
ありがとう、アレックス。知っておくべきこと/ proc/pid/mapsとmprotect。 – xiaokaoy