gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:24:41 24 4
gpt4 key购买 nike

我关注了这个thread为了执行一些二进制代码。

tinky_winky 的答案虽然有效,但当我尝试执行另一个二进制文件时却不起作用。

例如我写了这个程序:

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

使用gcc编译(不带任何参数),然后将生成的二进制文件放在code变量中

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

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

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

最佳答案

这当然是特定于实现的,实际上取决于您的 operating system和处理器instruction set (以及 ABIcalling conventions )。

(我猜并希望您使用的是 Linux;但您的问题不清楚)

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

也许你应该考虑JIT compilation技术和库,如 asmjit , GCCJIT等等...

顺便说一句,一个ELF可执行文件相当复杂,并且不以可执行文件 machine code 开头。另请阅读elf(5) 。使用objdump(1) & readelf(1)探索和理解 ELF 可执行文件。这可能可以解释为什么你的实验失败(但我们不知道你是如何得到 char code[] = {0x7f,0x45,0x4c,0x46 ....这几个字节看起来像一些 ELF标题)

您可能应该仔细从 ELF 可执行文件中提取一些函数(即它们的机器代码和数据)并处理 relocations (以及 name mangling,对于 C++),如果您想继续实验。阅读 Levine 的书 Linkers & Loaders会有帮助的。

关于c++ - 尝试从 c 执行任何二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com