尝试从 c 执行任何二进制文件
Trying to execute any binary from c
我遵循这个线程是为了执行一些二进制代码。
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((。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- 读取C 中的二进制文件的任何文件
- 在运行时动态更新二进制文件(可执行文件)而不停止的任何类型的方法
- C/C++:-msse 和 -msse2 标志对二进制文件没有任何影响
- 如何仅将 16 位分配给二进制文件中的任何整数,而不是C++中的正常 32 位
- 尝试从 c 执行任何二进制文件
- 是否有任何方法可以知道二进制文件的特定部分是否在内存中