【问题标题】:Stack location in Linux with ASLR使用 ASLR 在 Linux 中的堆栈位置
【发布时间】:2018-05-05 11:29:48
【问题描述】:

在启用 ASLR 的 Linux 中,用户堆栈地址所在的地址范围是否存在?堆,指令地址(文本部分)呢? 一般来说,是否可以查看地址并判断它是用于数据还是用于代码?

编辑: 我正在尝试编写一个 Pintool,它在返回后查看 EIP 并检查 EIP 是否指向数据区域。假设此系统上未启用 NX。

由于某种原因,这被否决了。幸运的是,可以在这里找到答案: https://security.stackexchange.com/questions/185315/stack-location-range-on-linux-for-user-process/185330#185330

【问题讨论】:

  • 您想用这些信息解决什么问题?为什么程序会关心使用了哪些地址范围?您是否正在尝试编写绕过 ASLR 的漏洞利用程序?
  • 不,实际上恰恰相反:-)。我正在尝试编写一个 Pintool,它在返回后查看 EIP 并检查 EIP 是否指向数据区域。假设此系统上未启用 NX。
  • 为什么投反对票?请解释一下。
  • 我没有投反对票,但您应该阅读 [how-to-ask] 以了解如何写出好问题。您需要编写一些无法正常工作的代码,因此我们可以帮助您修复它。关于Linux设计的问题Unix & Linux比较合适。
  • @Barmar,实际上,我相信在这种情况下,无需查看代码就可以提供建议。请参阅“security.stackexchange.com/questions/185315/…”。我在那里问过同样的问题,并收到了有用的答复。我将在此处对答案链接进行编辑。

标签: linux stack-overflow


【解决方案1】:

cat /proc/self/maps 将显示主线程堆栈的初始位置。由于(至少)以下原因,这可能不准确:

  • 你不在主线程中
  • 程序的任何部分都是使用-fsplit-stack 选项构建的,或者您调用一个执行类似操作的库
  • 您位于一个请求sigaltstack 堆栈的信号处理程序中
  • 您使用奇怪的 alloca 技巧,例如 CHICKEN Scheme 将堆栈用作堆
  • ...

另请注意,一般区域并非完全随机。请参阅 AddressSanitizer 项目以了解利用这一点的东西。

【讨论】:

  • 嗨,我有 2 个后续问题:1. 我可以代替对文本部分进行清理,而不是清理堆栈位置,即检查 ret 之后 EIP 中的 addr 是否确实是来自的有效指令指令区。我想知道在这种情况下是否有像上面这样的极端情况。
  • 2.这种情况怎么样:假设 NX 位已启用,我需要防止 ROP。那么上述方法将失败,因为 EIP 将始终有效。在这种情况下,我会尝试阻止下一步,即堆栈旋转。所以现在,一个合理的(不是万无一失的)策略是检查(损坏的)SP值中的位置是否是堆栈中的合理值。(而不是来自堆或任何其他部分)。关于如何解决这个问题的任何线索?
  • 我已经在这里回答了文本部分的问题:stackoverflow.com/a/37984639/1405588 ...其余的是一个复杂的问题,应该单独提出,除了通常当金丝雀是被杀死,整个过程也是如此。
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多