gpt4 book ai didi

c++ mprotect 用于读取、写入和执行

转载 作者:行者123 更新时间:2023-12-02 10:22:55 31 4
gpt4 key购买 nike

作为我正在进行的项目的一部分,我想分配一些内存,将操作码写入该内存,然后 call它。到那时,代码将跳转到我分配的内存中,运行操作码并使用操作码 ret 返回到之前的位置。 .

我的代码在 Linux 上运行,不需要支持 Windows。

我尝试使用 mprotect带有标志PROT_READ | PROT_WRITE | PROT_EXEC但我收到“权限被拒绝”错误。
我需要对该内存的写入和执行权限。

我怎样才能实现我正在尝试的目标?为什么我会收到“权限被拒绝”?

分配的内存使用 aligned_alloc 分配。所以它将对齐到 4KB(页面大小)。

最佳答案

我找到了一个解决方案,很高兴了解发生了什么。希望你会喜欢。

当你测试它时,你可以看到如果你分配一个“大”的内存块,比如 1MB然后 mprotect管理添加执行权限。使用二分搜索,您可以发现最佳位置是 128KB . Glibc 的 malloc 以一种有趣的方式工作,您应该阅读一下,但很快,它会提前分配内存并在您需要时给您一些。如果它用完了内存,它会分配更多等等。但是在某些大小下,它不会从它自己的池中为您提供内存。你要求一个足够大的缓冲区,让他专门为你分配一个。此阈值为 128KB,由 DEFAULT_MMAP_THRESHOLD 定义。在源代码中。

默认内存由 glibc.o 分配,它位于不同的内存段中,并在运行时加载。因此,您的库无权更改该内存保护并添加 PERM_EXEC .但是当您要求大内存并 malloc 为您分配新内存时,您的图书馆拥有此内存,因此您可以根据需要更改它的权限。

更多详细信息以及如何解决小内存量的问题:

那么 GCC 是如何为你分配内存的呢?使用 mmap - http://man7.org/linux/man-pages/man2/mmap.2.html

   #include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t length);
mmap在新的内存段中分配内存。 If addr is NULL, then the kernel chooses the (page-aligned) address at which to create the mapping .因此,我们可以使用此函数分配内存。 length必须是页面大小 ( 4096) 的乘积,这对于小内存量来说是非常浪费的。如果 fd-1然后内存被零填充。

使用这种方法,我们可以根据需要分配具有保护的内存,在这种情况下,具有执行权限。

关于c++ mprotect 用于读取、写入和执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59303617/

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