【问题标题】:Protect the whole address space using mprotect使用 mprotect 保护整个地址空间
【发布时间】:2013-12-14 05:46:05
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c linux gcc mprotect


    【解决方案1】:

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

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

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

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

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

    我怀疑这就是这个大学项目旨在为您提供的洞察力。

    【讨论】:

    • 感谢您的回复。是的,你的观点是正确的。但实际上在 mprotect() 处理程序内部,我正在从正在寻址的内存位置移除保护,重新执行内存访问指令,然后再次应用保护。实际上,该项目的目标是跟踪地址空间的变化,以便我可以回溯到以前的应用程序状态。因此,该技术应该可以在没有任何分段错误的情况下工作。你不这么认为吗?
    • 如果我理解正确并且您尝试处理 SIGSEGV 信号处理程序中的内存访问错误(mprotect() 没有回调),那么您仍然遇到同样的问题。只是尝试为信号处理程序设置堆栈,或者至少在第二次调用 mprotect() 时,您会遇到第二次分段错误。如果不保持至少一些可写的内存,我认为没有任何方法可以做到这一点。
    • 有没有其他简单的方法来解决我们遇到的问题?
    • 我会看看 ptrace()。这就是 gdb 使用的。您也可以尝试看看 Valgrind,因为它正在解决类似的问题。
    • 这是否意味着我们不能用 mprotect 保护整个地址?如果是这样,我们可以毫无问题地保护哪一部分?
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2014-07-17
    • 2014-02-20
    • 1970-01-01
    • 2011-02-23
    相关资源
    最近更新 更多