我正在尝试理解,如果使用金丝雀,是否/如何可能利用返回到libc和面向返回的编程漏洞。
一个金丝雀将被放在堆栈上,位于返回值和要溢出的缓冲区之间,并且需要被覆盖,以便将返回值更改为库函数或计算的位置。金丝雀出现于1997年(StackGuard),ROP是2007年首次引入的一种技术(Shacham)。
金丝雀会让这些类型的攻击变得不可能吗?
发布于 2012-04-26 22:03:35
金丝雀会让这些类型的攻击变得不可能吗?
不,它不是。它使执行return- to -libc或ROP变得更加困难,但它绝对不是抵御此类攻击的灵丹妙药。
首先,堆栈金丝雀只能通过缓冲区溢出来防止返回地址崩溃。但还有其他方法可以损坏内存:indirect pointer overwrite或format string vulnerabilities。
其次,可以通过使用原始值覆盖堆栈金丝雀来绕过它们。我并不是说这在现代实现中很容易,但这当然不是不可能的。
第三,尽管这些攻击被称为return- to -libc和Return - Oriented Programming,但是谁说我们需要返回指令来执行这些攻击呢?这些攻击可以通过破坏处理器将从其加载和寻址到的任何存储器位置来发起。最常见的例子是函数指针。但我们也可以覆盖GOT或longjmp缓冲区。(顺便说一句,已经表明ROP可以在without using return instructions!)
第四个原因不是se中堆栈金丝雀的弱点,而是大多数实现之一。堆栈金丝雀通常只放在基于堆栈的字符缓冲区大小至少为8的函数中。因此,这些实现不会检测其他缓冲区中的溢出。This exploit在整数数组中使用了溢出,因此堆栈金丝雀无法检测到它。
发布于 2011-04-13 16:52:15
这是一个网站,解释了与gcc创作的金丝雀。http://xorl.wordpress.com/2010/10/14/linux-glibc-stack-canary-values/。由于金丝雀是在ret指令执行之前检查的,因此如果覆盖金丝雀(在大多数情况下,您必须这样做才能覆盖堆栈上的返回地址),您的利用将会失败。由于ROP和Return to Lib c也会覆盖返回地址,因此这两种方法都不起作用。
https://stackoverflow.com/questions/5568538
复制相似问题