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