使用 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 项目以了解利用此功能的内容。
在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 项目以了解利用此功能的内容。