我有一个堆溢出的程序。它包含一些非随机的代码(不使用 ASLR)。我想做一个面向回报的编程漏洞。由于这是堆溢出,我需要做的第一件事是找到一个堆栈轴,这样我就可以让 RSP 指向我的 ROP 程序所在的已知内存地址。
找到堆栈枢轴的最先进方法是什么?我应该寻找哪些指令序列?是否有可用作堆栈枢轴的指令序列列表/数据库?
此外,是否有任何我需要注意的防御/缓解措施,或者有助于了解的情况?
例如,我想我记得longjmp()
调用是查找堆栈枢轴(例如,POP RSP ... RET 序列)的好地方,假设我控制堆栈上的某些值。然而,有人告诉我,一些平台现在加入了一种缓解措施,使利用longjmp()
调用更加困难:它们以加密形式存储 setjmp 缓冲区。对吗,有什么方法可以解决这种缓解,还是我应该放弃longjmp()
s?
另一个缓解措施是,Windows 8 的VirtualProtect
函数检查它是否在 RSP 设置为合理的情况下被调用。但是,其他人已经记录了如何绕过该缓解措施,因此这不是障碍 - 无论如何,这并不是专注于防止初始堆栈枢轴。我对这个问题的关注/兴趣在于最初的堆栈支点,而不是你之后所做的事情。