gpt4 book ai didi

c - 如何动态生成 X86_64 以返回相对于 RIP/RBP 的值

转载 作者:行者123 更新时间:2023-12-02 00:36:06 24 4
gpt4 key购买 nike

我正在尝试读取内存中相对于 X86_64 上的 %rip 的值。在我的第一个例子中,我只想阅读

如果我用 C 语言编写以下代码,我可以调用它并获得正确的结果 (\x....C3C9):

void * test() {
__asm("mov 0(%rip), %rax");
}

生成的代码如下所示:

0000000000400624 <test>:
400624: 55 push %rbp
400625: 48 89 e5 mov %rsp,%rbp
400628: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 40062f <test+0xb>
40062f: c9 leaveq
400630: c3 retq

如果我现在将此代码直接放入内存中并执行它,则会出现段错误,而我希望读取 \x0000C3C9:

int main()
{
int codesize = 9;
unsigned char * code = (unsigned char*)malloc(1024);
memcpy(code, "\x48\x8B\x5\x0\x0\x0\x0\xC9\xC3\x00\x00", codesize + 2);
mprotect(code, codesize, PROT_EXEC | PROT_READ);
goto *code;
}

我做错了什么?

编辑答案是我不应该使用 malloc 而应该使用 mmap 来分配页面对齐的内存区域:

(unsigned char*)mmap(NULL, 1024, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_SHARED, -1, 0);

当然,我应该检查 mprotect 调用的返回值。它返回 -1 标记它失败了。

最佳答案

您很可能在 mprotect() 调用期间收到 SIGSEGV。如果操作系统不允许 malloc() 返回的内存的代码执行(很可能是如果您没有使用某些古老的内核),则 mprotect() 只是出现段错误。这不是一个错误,而是一个功能。

关于c - 如何动态生成 X86_64 以返回相对于 RIP/RBP 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5905483/

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