我试图了解如果使用金丝雀是否/如何返回到libc和面向返回的编程漏洞。
金丝雀将被放置在返回值和要溢出的缓冲区之间的堆栈上,并且需要被覆盖以便将返回值更改为库函数或计算的位置。金丝雀自1997年以来一直存在(StackGuard),而ROP是2007年首次推出的技术(Shacham)。
金丝雀是否无法进行这类攻击?
答案 0 :(得分:17)
金丝雀是否无法进行这类攻击?
不,它没有。这使得执行返回libc或ROP变得更加困难,但它肯定不是针对此类攻击的银弹。
首先,堆栈canaries只能防止返回地址因缓冲区溢出而崩溃。但还有其他方法可以破坏记忆:indirect pointer overwrite或format string vulnerabilities来命名两个。
其次,可以通过用原始值覆盖堆栈金丝雀来绕过堆栈金丝雀。我并不是说在现代实现中这很容易,但它肯定不是不可能。
第三,虽然这些攻击被称为 return -to-libc和 Return Oriented Programming,但是谁说我们需要返回指令才能执行这些攻击?这些攻击可以通过破坏处理器将加载和寻址的任何内存位置来启动。最常见的例子是函数指针。但我们也可以覆盖GOT或longjmp
个缓冲区。 (作为旁注,已经证明可以执行ROP without using any return instructions!)
第四个原因不是堆栈金丝雀的弱点,而是大多数实现中的一个。堆栈canaries通常只放置在具有基于堆栈的字符缓冲区的函数中,其大小至少为8.这些实现因此不会检测其他缓冲区中的溢出。 This exploit在整数数组中使用溢出,因此堆栈canaries无法检测到它。
答案 1 :(得分:3)
这是一个解释使用gcc创建的canaries的网站。 http://xorl.wordpress.com/2010/10/14/linux-glibc-stack-canary-values/。 由于在执行ret指令之前检查了canary,如果覆盖canary(在大多数情况下你必须这样做才能覆盖堆栈上的返回地址),你的漏洞就会失败。由于ROP和Return to Lib c也会覆盖返回地址,因此两种方法都不起作用。