C++ c++;M读、写和执行保护

C++ c++;M读、写和执行保护,c++,permissions,mprotect,C++,Permissions,Mprotect,作为我正在进行的项目的一部分,我想分配一些内存,将操作码写入该内存,然后调用它。然后,代码将跳转到我分配的内存中,运行操作码并使用操作码ret返回到上一个位置 我的代码在Linux上运行,不需要支持Windows 我试图使用带有标记的PROT_READ | PROT_WRITE | PROT_EXEC的mprotect,但出现“权限被拒绝”错误。 我需要这个内存的写入和执行权限 我怎样才能实现我正在努力的目标?为什么我会被“拒绝许可” 分配的内存是使用aligned\u alloc分配的,因此它

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

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

我试图使用带有标记的
PROT_READ | PROT_WRITE | PROT_EXEC
mprotect
,但出现“权限被拒绝”错误。 我需要这个内存的写入和执行权限

我怎样才能实现我正在努力的目标?为什么我会被“拒绝许可”

分配的内存是使用
aligned\u alloc
分配的,因此它将对齐到4KB(页面大小)。

在我看来像/gr安全工作:

PaX项目的目标是研究各种防御机制 防止攻击者利用软件漏洞进行任意攻击 对受攻击任务地址空间的读/写访问。这类错误 包含各种形式的缓冲区溢出错误(可能是堆栈) 或基于堆),用户提供的格式字符串错误等

将代码引入任务的地址空间可以通过以下两种方式实现: 创建可执行映射或修改已存在的 可写/可执行映射。第二种方法可以通过不允许 创建所有可写/可执行映射


尝试使用
paxctl
实用程序禁用程序二进制文件的内存保护机制。

我找到了一个解决方案,很好地理解了发生的情况。希望你喜欢

在测试时,您可以看到,如果分配一个“大”内存块,比如
1MB
,那么
mprotect
管理添加执行权限。使用二进制搜索,您可以找到最合适的位置是
128KB
。Glibc的malloc工作方式很有趣,您应该了解一下,但很快,它会提前分配内存,并在您请求时提供一些内存。如果内存不足,它会分配更多的内存,以此类推。但在某种程度上,它并不能从自己的内存池中提供内存。你要求一个足够大的缓冲区,让他专门为你分配一个。此阈值为128KB,由源代码中的
DEFAULT\u MMAP\u threshold
定义

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

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

那么GCC如何为您分配内存呢?使用
mmap
-

#包括
void*mmap(void*addr,size\u t length,int prot,int flags,
int fd,off_t offset);
int munmap(空*地址、大小和长度);
mmap
在新内存段中分配内存
如果addr为NULL,那么内核将选择创建映射的(页面对齐的)地址
。因此,我们可以使用此函数分配内存
length
必须是页面大小的乘积(
4096
),这对于较小的内存量来说是非常浪费的。如果
fd
-1
,则内存中充满零

使用此方法,我们可以根据需要分配具有保护功能的内存,在本例中,还可以分配具有执行权限的内存

   #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);