尝试从 c 执行任何二进制文件

Trying to execute any binary from c

本文关键字:任何 二进制文件 执行      更新时间:2023-10-16

我遵循这个线程是为了执行一些二进制代码。

tinky_winky的答案虽然在我尝试执行另一个二进制文件时有效,但没有奏效。

例如,我编写了这个程序:

#include <stdio.h>
int main ()
{
   printf("Prueban");
   return(0);
}

使用 gcc 编译(没有任何参数(,然后将生成的二进制文件放在代码变量上

char code[] = {0x7f,0x45,0x4c,0x46,0x02,0x01,0x01,0x00,0x00,...};

然后尝试编译新文件,但出现分段错误错误。

是否可以在 c(或 c++(中实际运行任何类型的任意代码,或者只能在裸 asm 代码中运行函数(如在原始线程中(?

它当然是特定于实现的,实际上取决于您的操作系统和处理器指令集(以及 ABI 和调用约定(。

(我猜并希望你在Linux上;但你的问题不清楚(

在 Linux/x86_64 上,虚拟地址空间中的大部分内存不可执行(出于安全原因(。尝试使用 strace(1( 运行程序, 以了解相关的系统调用。还要使用调试器gdb 。您可能需要使包含二进制代码的段可执行, 例如使用 mprotect(2(。如果进程是 1234,请尝试在其他某个终端中cat /proc/1234/maps(以查询其虚拟地址空间(。阅读更多关于 proc(5( 的详细信息。

也许你应该考虑JIT编译技术和库,如asmjit,GCCJIT等。

顺便说一句,ELF 可执行文件非常复杂,并且不以可执行机器代码开头。另请阅读精灵(5(。使用 objdump(1( 和 readelf(1( 来探索和理解 ELF 可执行文件。这也许可以解释为什么你的实验失败了(但我们不知道你是怎么来char code[] = {0x7f,0x45,0x4c,0x46的......这几个字节看起来像一些 ELF 标头(

如果你想

继续你的实验,你可能应该小心地从你的ELF可执行文件中提取一些函数(即它们的机器代码和数据(,并处理重定位(和名称重整,C++(。阅读Levine关于Linkers & Loaders的书会有所帮助。

您可以运行这样的十六进制代码,但如果不进行修改,则无法获得可执行文件。有用于操作系统的文件前缀,而不是程序集操作码。

我假设这是在您的电脑或笔记本电脑或您正在阅读此网页的任何计算机上。 每个程序都被阻止在内存中运行任意代码,甚至访问其空间之外的代码。 你有一个程序,你有一个数组中的数据,你可能知道这是指令,但操作系统和编译器等知道是数据。 因此,您必须与操作系统通信,以要求它允许您执行该代码。 在stackoverflow或网络上搜索自我修改的代码。 如果在 Linux 上运行,可能想使用 mmap((。