我正在尝试了解如果使用金丝雀,是否/如何可以返回libc和面向返回的编程漏洞。
将金丝雀放在返回值和要溢出的缓冲区之间的堆栈上,并且需要重写以将返回值更改为库函数或计算的位置。金丝雀(Canaries)自1997年以来(StackGuard)就已经存在,而ROP是2007年首次引入的技术(Shacham)。

金丝雀会使这些类型的攻击变得不可能吗?

最佳答案

金丝雀会使这些类型的攻击变得不可能吗?


不,不是。这使得执行返回libc或ROP更加困难,但绝对不是解决此类攻击的灵丹妙药。

首先,堆栈金丝雀只防止通过缓冲区溢出来破坏返回地址。但是还有其他破坏内存的方法:indirect pointer overwriteformat string vulnerabilities命名为两种。

其次,可以通过用原始值覆盖堆栈金丝雀来绕开它们。我并不是说在现代实现中这很容易,但并非不可能。

第三,尽管这些攻击被称为return-to-libc和Return Oriented Programming,但谁说我们需要返回指令来进行那些攻击?这些攻击可以通过破坏处理器将要加载并寻址到的任何内存位置来启动。最常见的示例是函数指针。但是我们也可以覆盖GOTlongjmp缓冲区。 (作为旁注,已证明可以without using any return instructions执行ROP!)

第四个原因不是堆栈金丝雀本身的弱点,而是大多数实现之一。堆栈金丝雀通常仅放置在具有基于堆栈的字符缓冲区且其大小至少为8的函数中。因此,这些实现将无法检测其他缓冲区中的溢出。 This exploit在整数数组中使用了溢出,因此堆栈金丝雀无法检测到它。

关于security - 金丝雀是否可以防止返回libc和面向返回的编程攻击?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5568538/

10-10 11:31