堆栈金丝雀保护和ROP

信息安全 开发 缓冲区溢出 外壳代码
2021-08-29 02:35:51

据我所知,堆栈金丝雀是写入堆栈的值,如果被缓冲区溢出覆盖,则强制应用程序在返回时关闭。

我的问题是:如果我同时覆盖 EIP 和堆栈,因为我想 ROP 一些东西......而且我永远不会返回......堆栈金丝雀也会产生问题吗?

2个回答

堆栈金丝雀仍然是一个问题,因为您无法在基于堆栈的缓冲区溢出中控制 EIP 而不会覆盖返回地址(位于卡尼之上)。此外,包含基于堆栈的缓冲区溢出的函数必须在损坏的返回地址成为新的 EIP 之前返回。

这对于悬空指针来说不是问题。

您需要花更多时间在调试器上! 这没有任何借口。如果你已经通过了开发过程,你就会知道这一点!

在某些溢出情况下,您可以覆盖 EIP,但不会触及金丝雀值。这是 Enrico Perla 的《内核开发指南:攻击核心》一书中的引述:

堆栈金丝雀是一种很好的保护方案,但它存在一些问题: 特别受控的溢出(例如,保存在堆栈上的数组上的基于索引的溢出)可以在不触及金丝雀的情况下写入。