如何从malloc的区域执行一段代码

时间:2015-08-30 01:21:40

标签: c linux ubuntu x86 x86-64

我正在尝试malloc一些堆空间(文件字节的大小)并将二进制文件的内容复制到分配的内存中。 复制二进制文件后,我想执行那段代码。

因此,作为其中的一部分,我尝试编写一些汇编代码来跳转到该位置(从malloc返回的virt地址)。 我面临一个段错误,我不确定这是正确的方法吗?

在这种情况下,有人可以帮助我吗?

任何帮助/指针表示赞赏! P.S:我不想做exec调用来运行这些二进制文件。

2 个答案:

答案 0 :(得分:2)

在这个答案中描述了我能想到做这样的事情的唯一方法:https://stackoverflow.com/a/5602143/3598119

我认为你不能简单地将二进制文件加载到内存中,然后希望运行它。首先它有一些标题可以在其中找到动态库(在linux中这是ELF,在其他平台上它是不同的),你需要自己处理(很难,你需要复制DLL查找)你的申请!)或期望它崩溃。

如果要运行外部二进制文件,请使用exec或某些相关的OS函数,或者使它们成为DLL并动态链接它们,加载它们的符号并调用它们。 (或者手动将它们编译成程序集并将它们硬编码为可执行文件并将它们作为函数指针进行转换并调用它们,然后被解雇:p)

答案 1 :(得分:1)

如果您正在尝试JIT编译某些内容,请直接搜索/询问。这是一个很常见的事情,你不需要自己实现mmap /内存保护。

即使您加载的文件确实以机器代码而不是ELF标头开头,您仍然会发生段错误,因为malloc()内存未被标记为可执行文件,因此可以防止错误转向进入安全漏洞。正如Nominal Animal在评论中所说,你必须mprotect记忆。

如果这不是JIT编译,而是模块/库的运行时加载,则可以使用dlopen / dlsym加载库并获取指向a的函数指针它包含的功能。这应该比自己实施它容易得多。