gpt4 book ai didi

c - 在内存中执行机器代码

转载 作者:太空狗 更新时间:2023-10-29 16:23:18 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何执行存储在内存中的机器代码。

我有以下代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
FILE* f = fopen(argv[1], "rb");

fseek(f, 0, SEEK_END);
unsigned int len = ftell(f);
fseek(f, 0, SEEK_SET);

char* bin = (char*)malloc(len);
fread(bin, 1, len, f);

fclose(f);

return ((int (*)(int, char *)) bin)(argc-1, argv[1]);
}

上面的代码在 GCC 中编译得很好,但是当我尝试从命令行执行程序时,如下所示:

./my_prog /bin/echo hello

程序段错误。我发现问题出在最后一行,因为将其注释掉会停止段错误。

我认为我做的不太对,因为我还在思考函数指针。

问题是转换错误还是其他原因?

最佳答案

您需要一个具有写执行权限的页面。如果您在 unix 下,请参阅 mmap(2) 和 mprotect(2)。你不应该使用 malloc 来做到这一点。

此外,请阅读其他人所说的内容,您只能使用加载程序运行原始机器代码。如果您尝试运行 ELF header ,它可能仍然会出现段错误。

关于回复和downmods的内容:

1- OP 说他正在尝试运行机器代码,所以我就此回答而不是执行可执行文件。

2- 了解为什么不混合使用 malloc 和 mman 函数:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>

int main()
{
char *a=malloc(10);
char *b=malloc(10);
char *c=malloc(10);
memset (a,'a',4095);
memset (b,'b',4095);
memset (c,'c',4095);
puts (a);
memset (c,0xc3,10); /* return */

/* c is not alligned to page boundary so this is NOOP.
Many implementations include a header to malloc'ed data so it's always NOOP. */
mprotect(c,10,PROT_READ|PROT_EXEC);
b[0]='H'; /* oops it is still writeable. If you provided an alligned
address it would segfault */
char *d=mmap(0,4096,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_ANON,-1,0);
memset (d,0xc3,4096);
((void(*)(void))d)();
((void(*)(void))c)(); /* oops it isn't executable */
return 0;
}

它在 Linux x86_64 上准确地显示了这种行为,其他丑陋的行为肯定会出现在其他实现上。

关于c - 在内存中执行机器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2019923/

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