运行存储在内存中的代码

时间:2013-05-18 19:45:50

标签: c memory assembly heap

问题:

以asm指令运行存储在另一个c程序的堆或数据部分上的非平凡c程序。

我的进步:

将一些简单的指令打印到stdout。指令存储在堆上,我允许包含要执行的指令的页面,然后调用原始数据,就像它是一个函数一样。这很好。

接下来,我想给出任何静态链接的c程序,只需读取它的二进制文件,并且能够运行它的主函数,而它在另一个c程序的内存中。

我认为问题是:   *跳转到主要功能代码的位置   *更改链接时创建的二进制文件的地址,因此它们相对于代码现在位于内存中的位置

如果我的方法很好或者我是否遗漏了重要的事情以及最好的方法,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:1)

现代操作系统尽量不让您在数据中执行代码,因为这是一个安全噩梦。 http://en.wikipedia.org/wiki/No-execute_bit

即使你过去了,也会有更多的“陷阱”,因为两个程序都会认为他们'拥有'堆栈/堆/等等。一旦新程序执行,旧程序的各种RAM将被踩踏。 (exec只是出于这个原因,干净地从一个程序转到另一个程序。)

如果您确实需要加载代码,则应将第一个作为库,然后使用dlopen运行它。 (您可以使用objcopy仅提取所需的子例程并将其转换为库。)

或者,您可以启动程序(在另一个过程中)并使用strace将一些代码注入其进程以控制它。

(如果你真的想进入shell代码,你应该这样说。这是一个整体'其他蠕虫病毒。)