使用 ASLR 在 Linux 中的堆栈位置

Stack location in Linux with ASLR

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

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

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

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

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

另请注意,一般区域并非完全随机。请参阅 AddressSanitizer 项目以了解利用此功能的内容。