Я пытаюсь немного изменить правила и malloc
буфер,
затем скопируйте функцию в буфер.
Вызов буферизованной функции работает, но функция вызывает ошибку сегментации, когда я пытаюсь вызвать другую функцию внутри.
Любые мысли, почему?
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
int foo(int x)
{
printf("%d\n", x);
}
int bar(int x)
{
}
int main()
{
int foo_size = bar - foo;
void* buf_ptr;
buf_ptr = malloc(1024);
memcpy(buf_ptr, foo, foo_size);
mprotect((void*)(((int)buf_ptr) & ~(sysconf(_SC_PAGE_SIZE) - 1)),
sysconf(_SC_PAGE_SIZE),
PROT_READ|PROT_WRITE|PROT_EXEC);
int (*ptr)(int) = buf_ptr;
printf("%d\n", ptr(3));
return 0;
}
Этот код выдает segfault, если я не изменю функцию foo
, чтобы:
int foo(int x)
{
//Anything but calling another function.
x = 4;
return x;
}
Примечание:
Код успешно копирует foo
в буфер, я знаю, что сделал некоторые предположения, но на моей платформе они в порядке.