Ciao Sto cercando di caricare il codice macchina raw in memoria ed eseguirlo da un programma C, in questo momento quando il programma viene eseguito si interrompe quando si cerca di eseguire mprotect sulla memoria per renderlo eseguibile. Inoltre, non sono del tutto sicuro che se la memoria viene impostata correttamente verrà eseguita. Attualmente sto facendo funzionare questo su x86 Ubuntu Linux (Forse il problema è eccessiva protezione di Ubuntu?)Caricamento MachineCode da file in memoria ed esecuzione in C - mprotect Failing
Quello che ho attualmente è la seguente:
#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;
}
io capisco l'avviso del compilatore:
/tmp/ccVnhHak.s: Assembler messages:
/tmp/ccVnhHak.s:107: Warning: indirect call without `*'
Non ho ancora ottenuto il programma per raggiungere questo codice, quindi non sono in grado di vedere se il mio codice assembler sta facendo ciò che dovrebbe.
Quale sistema operativo? –
Siamo spiacenti, questo è per Linux x86 in particolare per Ubuntu. (Suppongo che l'eccessiva protezione di Ubuntu possa avere qualcosa a che fare con esso) – ChartreuseKitsune
Che tipo di errore è? Hai provato a eseguirlo semplicemente sotto gdb e guardando, cosa succede dopo? –