gpt4 book ai didi

c - 在 C 中将数据作为代码执行

转载 作者:行者123 更新时间:2023-12-01 12:38:04 25 4
gpt4 key购买 nike

使用 this answer (和 this follow-up) 作为灵感,我一直在寻找用 C 语言进行一些函数式编程的方法(对此网站上已经有很多有趣的讨论)。我想知道的是如何以及何时可以使用链接代码中采用的方法,将字符串转换为函数指针并执行它。例如在我的机器上(OSX 10.10、Darwin 14.0.0、GCC 4.8.3)我可以编译和运行

int eax = ((int(*)())("\xc3 <- This returns the value of the EAX register"))();

(总是返回 0,如果程序什么都不做,这是我所期望的)但是

#include <stdio.h>

int main() {
const char* lol = "\x8b\x5c\x24\x4\x3d\xe8\x3\x0\x0\x7e\x2\x31\xc0\x83\xf8\x64\x7d\x6\x40\x53\xff\xd3\x5b\xc3\xc3 <- Recursively calls the function at address lol.";
int i = ((int(*)())(lol))(lol);
printf("i: %d\n",i);
return 0;
}

段错误。另一方面,codepad 成功运行了第二个示例 giving the correct answer i: 100 .

什么时候可以从字符串执行?有没有办法让它(相对)一致?

(我可以合理地猜测这是未定义的行为,我知道我将通过使用它来增加全局失业率。)

最佳答案

当然(合法)undefined behavior ,实际上它是特定于实现的。

要成功执行此操作,您需要做几件事。

  • 首先,您需要文字字符串中的机器代码是正确的。这显然是处理器和 ABI具体的。但我相信你。
  • 然后,您依赖于用于调用函数指针的协议(protocol),即依赖于 ABI 规范。
  • 最后,在多个处理器(尤其是 x86-64)上,您需要将机器代码放在某个可执行 段中。我想通常情况并非如此(但这可能是特定于操作系统的)。阅读更多关于 NX bit 的信息和 ASLR (还有 PIC )。有时这可以被规避,例如通过适本地 mmap-ing 一些具有执行权限的段并在那里复制机器代码。

顺便说一句,您可能会对 JIT compilation 感兴趣技术和库(libjitlightningasmjitLLVM ...)

作为DCoder评论,阅读更多关于 shellcode更一般地说 code injection

一种更便携的方法可能是(就像我在 MELT 中所做的那样)动态生成一些 C(或 C++)代码,将该代码的编译分支到一个共享对象中,然后 dlopen-ing 共享对象(& dlsym-ing 适当)。

关于c - 在 C 中将数据作为代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27757709/

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