gpt4 book ai didi

c - 使用金丝雀值的堆栈损坏检测

转载 作者:行者123 更新时间:2023-12-05 08:38:21 30 4
gpt4 key购买 nike

我正在阅读一本教科书,其中描述了能够检测堆栈何时损坏的防御措施。书上说:

最新版本的 gcc 在生成的代码中加入了一种称为堆栈保护器的机制,以检测缓冲区溢出。这个想法是在任何本地缓冲区和堆栈状态的其余部分之间的堆栈帧中存储一个特殊的金丝雀值,如下图所示: enter image description here

此 canary 值,也称为保护值,在每次程序运行时随机生成,因此攻击者无法轻松确定它是什么。在恢复寄存器状态并从函数返回之前,程序检查金丝雀是否已被此函数或它调用的某个操作更改。如果是这样,程序将因错误而中止。

我明白了,但我仍然认为这个设计存在缺陷。是的,攻击者可能无法确定 canary 的值是多少,但攻击者知道 canary 的大小(8 字节),因此攻击者可以操纵指针绕过 canary 所在的堆栈中的这 8 字节区域,然后覆盖返回地址,所以金丝雀实际上没有保护任何东西,我的理解是否正确?

最佳答案

如果攻击者有任意写入,那么是的,金丝雀就没用了。事实上,任意写入可以通过多种方式使 Canary 无效,包括覆盖 __stack_chk_fail 的 GOT 条目(覆盖 Canary 时调用的函数),或者只是不覆盖 Canary。然而,任意写入并不总是可获得的。它通常仅在存在格式字符串漏洞时才会发生。当只有缓冲区溢出时,要写入金丝雀之后的地址,您必须写入该地址之前的地址,其中包括金丝雀。这意味着用缓冲区溢出覆盖返回地址的唯一合理方法是猜测金丝雀或通过另一个漏洞泄漏它。

关于c - 使用金丝雀值的堆栈损坏检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63024660/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com