如果源可用,本文描述了一种看起来非常酷的技术来防止 ROP 攻击。他们使用 gcc 之间的汇编预处理器和汇编器来删除或保护所有可能的自由分支(返回和间接跳转)。他们声称对速度/性能的影响小于 3%(平均 1%)。
他们修改指令或添加无操作以更改对齐方式,从而消除意外/未对齐的分支指令。为了保护合法的返回和跳转,他们在函数序言中使用随机运行时密钥加密返回地址,并在返回之前通过 XOR 对其进行解密。这应该防止返回语句成功执行,除非入口点位于函数本身的开头。
我的问题是返回地址加密将如何防止使用 ROP 小工具?密钥/cookie 存储在返回地址正上方的堆栈中,那么如何防止攻击者修改堆栈上的小工具链,使其在每个返回地址之后也包含一个密钥 0x00000000?
这篇论文似乎被引用了 73 次,据我所知,没有人提到过这样的事情,所以我一定遗漏了一些东西。有人可以解释一下合法跳转和返回的保护代码是如何工作的吗?
(我知道这是一个很长的问题,需要阅读一篇长篇论文,但我希望至少阅读这篇文章的人会发现这篇论文和我一样酷)
更新
这显然与 StackGuard 和 ProPolice 中使用的技术相同(或非常相似)。谁能告诉我他们如何应对内存泄露漏洞?我似乎无法确定。我所发现的要么是顺便提及他们,要么只是夸大他们的美德。