当攻击者获得对x86-64上的Windows中的指令指针的控制权,并使用NX位和ASLR保护时,如何关闭NX位保护?我假设系统调用禁用此功能只是在非ASLRed地址,可以直接调用?
似乎堆喷涂经常用于利用现代Windows机器(例如,在Javascript实现中有bug),显然这需要一个可执行堆,那么堆如何在堆喷涂之前可执行?在Windows上是否有一些文件清楚地显示了这是如何完成的?
通常利用涉及ROP attack。 ROP攻击可能直接调用某些系统调用(例如,生成shell),或者可能调用VirtualProtect()
来禁用NX位。
ROP攻击中的一个步骤通常是在可预测的位置(例如,a DLL that didn't opt into ASLR)找到至少一些代码,或找到一个信息泄露漏洞,让攻击者预测某些代码的位置,这样攻击者就可以找到可预测的小工具地址。一旦攻击者能够执行任意小工具,通常就是游戏结束:例如,漏洞利用代码可以对所有其他函数(如VirtualProtect()
)的地址进行随机化,然后调用它。
您询问堆是如何可执行的。答案是:堆不是可执行的,因为在使用ROP攻击时不需要使其可执行。实际上,这是ROP攻击常用的原因之一。