【问题标题】:Write protect a stack page on AIX?在 AIX 上写保护堆栈页?
【发布时间】:2014-06-30 15:34:28
【问题描述】:

我有一个程序,其中 argv[0] 不时被覆盖。这(仅)发生在我无法访问且无法使用调试器的生产机器上。为了找到这个损坏的根源,我想写保护这个堆栈页,这样任何写访问都会出错,我可以获得罪魁祸首指令的地址。

系统是基于 AIX 5.3 64 位的。当我尝试在我的堆栈页面上调用 mprotect 时,我收到一个 ENOMEM 错误。我正在使用 gcc 来生成我的程序。

在 Linux 系统(基于 x86)上,我可以使用 mprotect 轻松设置类似的保护。

有什么方法可以在 AIX 上实现这一点。或者这是一次没有希望的尝试?

【问题讨论】:

标签: memory aix


【解决方案1】:

在 AIX 上,mprotect() 要求请求的页面仅为共享内​​存或内存映射文件。在AIX 6.1 and later 上,您可以使用MPROTECT_TXT 环境变量将其扩展到文本区域、共享库等。

但是,您可以在 XLC 11/AIX 6.1TL4 及更高版本上使用 -qstackprotect option。 “堆栈粉碎保护”旨在防止您所描述的情况发生。

在 AIX 5.3 上,我唯一的建议是考虑使用像 Parasoft's Insure++ 这样的工具集进行构建。它会在运行时定位到您的堆栈的错误写入。它几乎是 AIX 开发业务中最好的(也是目前唯一的)工具。我们在内部使用它,它在您需要时非常宝贵。

【讨论】:

    【解决方案2】:

    作为记录,解决此问题的方法是将处理转移到 pthread 线程。在 AIX 上,pthread 线程堆栈位于可以受到 mprotected 的数据段中(与不能受到 mprotected 的原始线程相反)。这是 AIX 上的 JVM (OpenJDK) 实现堆栈保护的方式。

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 2010-11-23
      • 2017-08-28
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 2016-06-30
      • 2020-08-17
      相关资源
      最近更新 更多