答案1
缓冲区溢出的可利用性根据周围的代码而变化很大。例如,是否有其他缓解技术,例如堆栈金丝雀。但是,如果您只考虑 DEP/W^X,那么是的,通常仍然可以利用它们。
如何利用它很大程度上取决于缓冲区溢出的类型。从您提到使用 NOP 幻灯片来看,我认为您正在谈论一个简单的基于堆栈的缓冲区溢出。在这种情况下,您可以使用诸如面向返回编程(ROP)或者面向跳跃的编程(JOP)。这些技术重用存在于已标记为可执行的内存部分中的代码。因此,您不需要标记为可执行和可写的内存。
减轻这些代码重用攻击的一种技术是控制流完整性 (CFI)检查。此缓解措施尝试仅允许代码流经已知的“良好”路径。近年来,这已开始获得更多主流支持,例如来自以下公司的编译器支持铿锵/llvm。