Load MachineCode from file to memory and execute in C - mprotect Failed

Hey. I am trying to load the source machine code into memory and run it from C program, right now when the program executes it, it breaks when I try to run mprotect in memory to make it executable. I am also not quite sure that if the memory is installed correctly, it will be executed. I am currently running this on Ubuntu Linux x86 (maybe the problem is overloading Ubuntu?)

I currently have the following:

#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;
}

I get a compiler warning:

/tmp/ccVnhHak.s: Assembler messages:
/tmp/ccVnhHak.s:107: Warning: indirect call without `*'

I have not yet received a program to achieve this code, so I can’t check if my assembler code is working, what it should do.

+5
3

, , :)

. posix_memalign() - :)

+5

0xc3 ( ) 0x90 (noop). , NOOP , , , . , , , .

BTW strace . , mprotect.

+1

perms PROT_EXEC | PROT_READ | PROT_WRIT . PROT_WRITE, exec read.

PROT_EXEC | PROT_WRIT.

+1
source

All Articles