3

问题:

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

我的进步:

运行一组简单的指令,将某些内容打印到标准输出。指令存储在堆上,我允许执行包含指令的页面,然后像调用函数一样调用原始数据。这工作得很好。

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

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

请让我知道我的方法是否很好,或者我是否错过了一些重要的事情,以及最好的解决方法是什么。

谢谢

4

1 回答 1

2

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

即使你克服了这一点,也会有更多的“陷阱”,因为两个程序都会认为他们“拥有”堆栈/堆/等。新程序执行后,旧程序中的各种 RAM 位将被踩踏。(exec正是因为这个原因而存在,干净地从一个程序转到另一个程序。)

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

或者,您可以启动程序(在另一个进程中)并使用strace将一点代码注入到他们的进程中来控制它。

(如果你真的想进入 shell 代码,你应该这么说。那完全是“另一罐蠕虫”。)

于 2013-05-18T20:16:45.807 回答