【发布时间】:2013-09-20 15:52:49
【问题描述】:
我一直在尝试使用mprotect 反对先阅读,然后再写作。
这是我的代码
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pagesize = sysconf(_SC_PAGE_SIZE);
int *a;
if (posix_memalign((void**)&a, pagesize, sizeof(int)) != 0)
perror("memalign");
*a = 42;
if (mprotect(a, pagesize, PROT_WRITE) == -1) /* Resp. PROT_READ */
perror("mprotect");
printf("a = %d\n", *a);
*a = 24;
printf("a = %d\n", *a);
free (a);
return 0;
}
在 Linux 下是结果:
这是PROT_WRITE 的输出:
$ ./main
a = 42
a = 24
对于PROT_READ
$ ./main
a = 42
Segmentation fault
在 Mac OS X 10.7 下:
这是PROT_WRITE 的输出:
$ ./main
a = 42
a = 24
对于PROT_READ
$ ./main
[1] 2878 bus error ./main
到目前为止,我了解 OSX / Linux 的行为可能会有所不同,但我不明白为什么 PROT_WRITE 在使用 printf 读取值时不会使程序崩溃。
有人能解释一下这部分吗?
【问题讨论】:
-
您为什么希望
PROT_WRITE崩溃? -
因为只有
PROT_WRITE标志,内存应该是不可读的AFAIK。如果你想要 rw 访问,你需要PROT_WRITE | PROT_READflag -
@Mali 是的,如果他期望在读取第一个 printf 的参数时崩溃,而不是用
*a = 24覆盖值时,这将是一个问题。无论如何,我试图在我的回答中涵盖所有这些。