加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux:执行手动加载到内存的代码

发布时间:2020-12-14 01:12:46 所属栏目:Linux 来源:网络整理
导读:我正在使用 Linux上的函数指针并尝试执行此C程序: #include stdio.h#include string.hint myfun() { return 42;}int main(){ char data[500]; memcpy(data,myfun,sizeof(data)); int (*fun_pointer)() = (void*)data; printf("%dn",fun_pointer()); return
我正在使用 Linux上的函数指针并尝试执行此C程序:

#include <stdio.h>
#include <string.h>

int myfun() 
{
    return 42;
}

int main()
{
    char data[500];
    memcpy(data,myfun,sizeof(data));
    int (*fun_pointer)() = (void*)data;
    printf("%dn",fun_pointer());

    return 0;
}

不幸的是,它在fun_pointer()调用上发生了段错误.我怀疑它与一些内存标志有关,但我没有找到有关它的信息.

你能解释为什么这段代码会出现错误吗?没有看到固定的数据数组大小,没有调用函数成功就可以了.

UPD:最后我发现应该使用调用PROT_EXEC标志的mprotect系统调用将内存段标记为可执行文件.此外,应按照POSIX规范中的规定,通过mmap函数返回内存段.
使用PROT_EXEC标志的mmap内存分配的代码相同(并且有效):

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>

int myfun() 
{
    return 42;
}

int main()
{
    size_t size = (char*)main - (char*)myfun;
    char *data = mmap(NULL,size,PROT_EXEC | PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,0);
    memcpy(data,size);

    int (*fun_pointer)() = (void*)data;
    printf("%dn",fun_pointer());

    munmap(data,size);
    return 0;
}

此示例应符合-fPIC gcc选项,以确保函数中的代码与位置无关.

解决方法

那里有几个问题:

>您的数据阵列保持在data segment,而不是code segment.
> address relocation未处理.>代码大小未知,只是猜测.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读