问题:
将存储在另一个 C 程序的堆或数据部分中的重要 C 程序作为 asm 指令运行。
我的进步:
运行一组简单的指令,将某些内容打印到标准输出。这些指令存储在堆上,我允许执行包含指令的页面,然后调用原始数据,就好像它是一个函数一样。这工作得很好。
接下来,我想要给定任何静态链接的 C 程序,只读取它的二进制文件,并能够在另一个 C 程序位于内存中时运行它的主函数。
我认为问题是: * 跳转到main函数代码所在的地方 * 更改链接时创建的二进制文件的地址,以便它们相对于代码现在在内存中的位置
请告诉我我的方法是否好,或者我是否错过了一些重要的事情,以及最好的方法是什么。
谢谢
最佳答案
现代操作系统尽量不让您在数据中执行代码,因为这是一场安全噩梦。 http://en.wikipedia.org/wiki/No-execute_bit
即使你克服了这一点,也会有更多的“陷阱”,因为两个程序都会认为它们“拥有”堆栈/堆/等。一旦新程序执行,旧程序中的各个 RAM 位将被占用。 (exec
正是出于这个原因而存在,以便干净地从一个程序转到另一个程序。)
如果您确实需要加载代码,则应该将第一个代码设为库,然后使用dlopen
来运行它。 (您可以使用 objcopy 来提取所需的子例程并将其转换为库。)
或者,您可以启动程序(在另一个进程中)并使用 strace
将一些代码注入(inject)到他们的进程中以控制它。
(如果你真的想进入 shell 代码,你应该这么说。这完全是“另一种蠕虫病毒。”
关于c - 运行内存中存储的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628323/