1

我最近一直在自学编写漏洞利用程序和shellcode,许多指南/书籍声称我们可以猜测堆栈的开始位置,从而通过一些工作来猜测我们的 shellcode 从堆栈上的哪个地址开始。

  • 为什么栈的起始地址是可预测的?堆栈不应该从内存中的某个随机地址开始吗?
  • 如果堆栈的地址开始只是虚拟地址空间中的某个固定偏移量,那么为什么它会因机器而异?
  • 不同平台和栈起始地址的误差范围是多少?

相关:“每个程序的堆栈都从相同的地址开始”来自黑客的地址困境:利用的艺术为什么堆栈地址会朝着减少内存地址的方向增长?

编辑对于我的测试,地址空间布局随机化(ASLR)已关闭。

4

1 回答 1

1

在我看来,确定堆栈的起始地址是可预测的并不像能够修改堆栈的顶部那么重要。调用方法时,堆栈中会存储各种寄存器,包括程序计数器,该计数器指向方法返回时代码将恢复执行的位置。此外,还保留了堆栈空间来存储方法的局部变量。(毕竟,它们需要存储在某个地方!)在某些情况下,这些变量可用于覆盖堆栈顶部以更改代码恢复执行的位置(例如)。使用调试器进行一些反汇编和检查内存通常足以确定变量在堆栈中相对于程序计数器的最终位置。然后,它是一个“简单”

这并不能回答你的后两点,我认为只能回答你的第一点,但这是一个开始。

于 2012-03-20T18:53:18.010 回答