関数ポインタとmprotectを使って関数の領域を上書き


#include
#include

void hoge(){
printf("hoge\n");
}

void main(){
void (*foo)();
int *p1;
int *p2;
unsigned int p_i;

/* 試しに呼んでみる */
foo = hoge;
foo();

p1 = hoge;

/* mprotectに渡すアドレスはページ境界に合わせないといけないため */
p_i = p1;
p2 = p_i & 0xFFFFF000;

if(mprotect(p2,0x1000,PROT_WRITE) < 0){
perror("mprotect");
}

*p1 = 10;

/* ここでSegmentation Faultで落ちる */
foo();
}