Привет я пытаюсь загрузить необработанный машинный код в память и выполнить его из программы C, прямо сейчас когда программа выполняется, это повреждается при попытке выполнить mprotect на памяти для создания этого исполняемым файлом. Я также не совсем уверен, что, если память действительно получает установленное право, это выполнится. Я в настоящее время выполняю это на Ubuntu Linux x86 (Возможно, проблемой является сверхзащита Ubuntu?)
То, что я в настоящее время имею, следующее:
#include <memory.h>
#include <sys/mman.h>
#include <stdio.h>
int main ( int argc, char **argv )
{
FILE *fp;
int sz = 0;
char *membuf;
int output = 0;
fp = fopen(argv[1],"rb");
if(fp == NULL)
{
printf("Failed to open file, aborting!\n");
exit(1);
}
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
fseek(fp, 0L, SEEK_SET);
membuf = (char *)malloc(sz*sizeof(char));
if(membuf == NULL)
{
printf("Failed to allocate memory, aborting!\n");
exit(1);
}
memset(membuf, 0x90, sz*sizeof(char));
if( mprotect(membuf, sz*sizeof(char), PROT_EXEC | PROT_READ | PROT_WRITE) == -1)
{
perror("mprotect");
printf("mprotect failed!!! aborting!\n");
exit(1);
}
if(!(fread(membuf, sz*sizeof(char), 1, fp)))
{
perror("fread");
printf("Read failed, aborting!\n");
exit(1);
}
__asm__
(
"call %%eax;"
: "=a" (output)
: "a" (membuf)
);
printf("Output = %x\n", output);
return 0;
}
Я действительно получаю предупреждение компилятора:
/tmp/ccVnhHak.s: Assembler messages:
/tmp/ccVnhHak.s:107: Warning: indirect call without `*'
Я не заставил программу достигать этого кода все же, таким образом, я не могу видеть, делает ли мой ассемблерный код то, что это должно.
Хорошо, вот ответ, согласно нашему обсуждению в комментариях :)
Область памяти должна быть выровнена по размеру системной страницы. Вызов posix_memalign () - правильный способ выделить память в таком случае :)
Добавьте 0xc3 (инструкцию возврата) после байтов 0x90 (noop). Возможно, ваша программа аварийно завершается, потому что она убегает за пределы NOOP-ов и либо в неинициализированную память, кто знает, что там скрывается, либо в конец исполняемой страницы. Я не могу точно сказать, не посмотрев, что находится в загружаемом вами файле.
BTW strace очень полезен для такого рода программ. Он мог бы сказать вам, в чем заключалась ошибка в mprotect.