Executing machine code in memory

后端 未结 9 1461
盖世英雄少女心
盖世英雄少女心 2020-12-04 12:47

I\'m trying to figure out how to execute machine code stored in memory.

I have the following code:

#include 
#include          


        
9条回答
  •  無奈伤痛
    2020-12-04 13:07

    You need a page with write execute permissions. See mmap(2) and mprotect(2) if you are under unix. You shouldn't do it using malloc.

    Also, read what the others said, you can only run raw machine code using your loader. If you try to run an ELF header it will probably segfault all the same.

    Regarding the content of replies and downmods:

    1- OP said he was trying to run machine code, so I replied on that rather than executing an executable file.

    2- See why you don't mix malloc and mman functions:

    #include 
    #include 
    #include 
    #include 
    
    int main()
    {
        char *a=malloc(10);
        char *b=malloc(10);
        char *c=malloc(10);
        memset (a,'a',4095);
        memset (b,'b',4095);
        memset (c,'c',4095);
        puts (a);
        memset (c,0xc3,10); /* return */
    
        /* c is not alligned to page boundary so this is NOOP.
         Many implementations include a header to malloc'ed data so it's always NOOP. */
        mprotect(c,10,PROT_READ|PROT_EXEC);
        b[0]='H'; /* oops it is still writeable. If you provided an alligned
        address it would segfault */
        char *d=mmap(0,4096,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_ANON,-1,0);
        memset (d,0xc3,4096);
        ((void(*)(void))d)();
        ((void(*)(void))c)(); /* oops it isn't executable */
        return 0;
    }
    

    It displays exactly this behavior on Linux x86_64 other ugly behavior sure to arise on other implementations.

提交回复
热议问题