当攻击者在 x86-64 上获得对 Windows 指令指针的控制权时,如何关闭 NX 位保护,同时受到 NX 位和 ASLR 的保护?我假设禁用此功能的系统调用只是在非ASLRed地址,可以直接调用吗?
似乎堆喷射经常用于利用现代 Windows 机器(例如,在 Javascript 实现中存在错误),显然这需要一个可执行堆,那么在堆喷射之前如何使堆可执行?是否有一些论文清楚地表明了这是如何在 Windows 上完成的?
当攻击者在 x86-64 上获得对 Windows 指令指针的控制权时,如何关闭 NX 位保护,同时受到 NX 位和 ASLR 的保护?我假设禁用此功能的系统调用只是在非ASLRed地址,可以直接调用吗?
似乎堆喷射经常用于利用现代 Windows 机器(例如,在 Javascript 实现中存在错误),显然这需要一个可执行堆,那么在堆喷射之前如何使堆可执行?是否有一些论文清楚地表明了这是如何在 Windows 上完成的?
通常漏洞利用涉及ROP 攻击。ROP 攻击可能直接调用一些系统调用(例如,产生一个外壳),或者可能调用VirtualProtect()
以禁用 NX 位。
通常,ROP 攻击的一个步骤是在可预测的位置找到至少一些代码(例如,一个没有选择加入 ASLR 的 DLL),或者找到一个信息泄露漏洞,让攻击者可以预测一些代码的位置,所以攻击者可以在可预测的地址找到小工具。一旦攻击者有能力执行任意小工具,通常游戏就结束了:例如,利用代码可以将所有其他函数的地址去随机化,例如VirtualProtect()
,然后调用它。
你问堆是如何变成可执行的。答案是:堆不是可执行的,因为在使用 ROP 攻击时不需要使其可执行。事实上,这也是ROP攻击被广泛使用的原因之一。