【发布时间】:2020-07-21 23:42:54
【问题描述】:
我正在阅读一本教科书,该教科书描述了能够检测堆栈何时损坏的防御。书上说:
最新版本的 gcc 将一种称为堆栈保护器的机制合并到生成的代码中以检测缓冲区溢出。这个想法是在任何本地缓冲区和堆栈状态的其余部分之间的堆栈帧中存储一个特殊的金丝雀值,如下图所示:
这个金丝雀值,也称为警戒值,是在每次程序运行时随机生成的,因此攻击者没有简单的方法来确定它是什么。在恢复寄存器状态并从函数返回之前,程序会检查金丝雀是否已被此函数的某些操作或它调用的操作更改。如果是这样,程序会因错误而中止。
我明白了,但我仍然认为这个设计存在缺陷。是的,攻击者可能无法确定 canary 的值是什么,但攻击者知道 canary 的大小(8 字节),因此攻击者可以操纵指针绕过栈中金丝雀所在的这 8 字节区域,然后覆盖返回地址,所以金丝雀实际上什么都不保护,我的理解是否正确?
【问题讨论】:
-
你能告诉我这本书的书名是什么吗?会很感激的。
-
@LostSoul 你能找到的最好的书,叫做 CSAPP
标签: c stack x86-64 buffer-overflow callstack