gpt4 book ai didi

c - 如何从 C/汇编中的内存地址执行函数?

转载 作者:行者123 更新时间:2023-12-03 09:46:26 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to get c code to execute hex machine code?

(7 个回答)


11 个月前关闭。




我有以下汇编函数(已用 objdump 显示)

0000000000000000 <add>:
0: b8 06 00 00 00 mov $0x6,%eax
5: c3 retq
现在在 C 中我做了以下代码:
#include <stdio.h>

typedef int (*funcp) (int x);

unsigned char foo[] = {0xb8,0x06,0x00,0x00,0x00,0xc3};

int main(void)
{
int i;
funcp f = (funcp)foo;
i = (*f);

printf("exit = %d\n", i);
return 0;
}
在全局变量 foo 中,我在汇编中输入了我的函数的内存地址并尝试执行它,但它没有按预期返回 6。
如何为它们的内存地址执行函数?此外,我可以在哪里研究更多关于该主题的信息?
obs:有时我会遇到 Segmentation fault (core dumped) 错误

最佳答案

NX 标志可能是您的“ friend ”。永远不会作为二进制机器代码执行的内存部分可以标记为 No-eXecute。见 https://en.wikipedia.org/wiki/NX_bit .因此,取决于架构、操作系统和设置,甚至 BIOS 设置。
因此,此功能可能处于开启或关闭状态。如果 NX 用于程序的数据部分,它将不会运行。您将需要 mmap() 一块设置了 PROT_EXEC 的内存,复制数据,然后运行它。
对于以下内容,我将二进制文件更改为 amd64 代码(+1 func)。使用 mmap() 副本时,它可以工作。直接调用 foo 时,它失败(在我的 NX 处于事件状态的机器上)
(没有错误检查的代码,释放内存等)

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

typedef int (*funcp) (int x);

unsigned char foo[] = {0x8d,0x47,0x01,0xc3};
//unsigned char foo[] = {0xc3,0xb8,0x06,0x00,0x00,0x00,0xc3};

int main(void)
{
int i;

void *mem2;

mem2 = mmap(0,4096,PROT_WRITE|PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_ANONYMOUS|MAP_EXECUTABLE,-1,0);

memcpy(mem2,foo,sizeof(foo));


funcp f = (funcp)mem2;
i = f(42);

printf("exit = %d\n", i);
return 0;
}

关于c - 如何从 C/汇编中的内存地址执行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64877055/

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