1

对于我的大学项目,我需要 WRITE 保护进程的整个地址空间。我正在阅读/proc/self/maps文件并解析映射。

因此,对于格式的每个条目08048000-0804c000 r-xp 00000000 08:03 7971106 /bin/cat,我正在阅读前两个条目(此处08048000 & 0804c000),将它们转换为十进制。让我们假设十进制等价物分别是AB。然后我做mprotect((int*)A, B-A, PROT_READ)。但是这种方法给了我分段错误。我无法找出我在这里做错了什么。可能是我在这里有一些知识差距导致了问题。有人可以给我一些建议吗?

4

1 回答 1

1

假设您的实现是正确的,我仍然希望看到分段错误。

毕竟,您是在告诉内核您不想被允许写入内存的任何部分。之后,您将继续运行您的进程,并且下次您尝试编写任何内容时,您将遇到分段错误,因为不再允许这样做。

这很可能是当您在“保护”堆栈之后从 mprotect() 返回时。

再想一想,在您“保护”它之后,您甚至可能在执行内存(即共享库或您的可执行代码)时遇到分段错误。

事实上,所有可以安全应用只读/不执行标志的内存位都已经设置了这些标志。

我怀疑这就是这个大学项目旨在给你的洞察力。

于 2013-11-28T09:43:31.527 回答