首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >论霍克斯绕过金丝雀的技术

论霍克斯绕过金丝雀的技术
EN

Security用户
提问于 2013-11-17 13:56:33
回答 2查看 4K关注 0票数 5

我找到了绕过金丝雀的参考:http://sota.gen.nz/hawkes_openbsd.pdf

它建议强行强制金丝雀逐字节.我不明白这是怎么回事:“技术是用暴力强迫金丝雀的每一个字节,并进行时间分析”。如何在字节对字节的基础上进行时间分析?整个金丝雀不是一次比较吗?我认为这四个字节与一个指令进行了比较。

此攻击也在http://www.phrack.org/issues.html?issue=67&id=13中引用。

EN

回答 2

Security用户

回答已采纳

发布于 2013-11-17 15:56:44

这样做的目的是控制攻击的长度,从而只覆盖金丝雀的第一个字节。然后,您可以强制这个字节的256个可能的值,并使用某种侧通道计算出哪一个是正确的。一旦你得到了这个,你可以用暴力强迫第二个字节,然后继续,直到你得到整个金丝雀。

票数 4
EN

Security用户

发布于 2015-02-03 21:36:16

这个话题同样让我感到困惑。相架问题中只有一两句话,甚至提到智能地控制缓冲区溢出的长度(可能是因为这是一种典型的技术)。Paj28似乎有正确的答案,但对于如何获得足够准确的侧通道,使其在实践中发挥作用,还有些模糊。如果需要大量尝试才能进行统计分析,这显然会降低攻击的有效性(特别是在远程情况下,每次尝试都会发生新的网络连接和fork() syscall )。

常用的SSP方法使用单个金丝雀,从存储在受保护部分的程序范围内的变量复制到堆栈中。此初始化在可执行加载过程中进行。这种初始化的三个已知变体是:(a)在exec*() syscall期间由内核执行;(b)由静态链接可执行文件的启动代码;或(c)由动态加载程序的代码片段插入动态链接可执行文件的运行时映像。

最重要的是,这种逐字节的伎俩是可以克服的。请考虑以下几点:

{01}不为一个64位字分配空间,我们可以在堆栈帧中保留两个字长空间。一个这样的可变槽放置在缓冲区之前,在缓冲区中溢出不太可能修改它。

{02}在执行函数序言时,我们没有将固定的金丝雀复制到这两个槽中,而是从两个值(它们本身可能在某种程度上是动态的)得到一个动态金丝雀。最有可能的是,我们的源值将从预初始化的随机保护内存块中提取,类似于旧金丝雀的建立方式。

{03}派生方法可以任意强,甚至加密,但它不需要为这项技术的工作。

{04}一个简单的策略可以使攻击者的生活非常困难。假设推导方法仅仅是A+B= C,其中A和B是伪随机64位值。C,也就是检查值,同样是64位.

{05}现在,当攻击者覆盖金丝雀时,他们只能到达B。A由于在较低的虚拟地址中存在,所以无法在堆栈上存活。

{06} A+B != C,所以很明显金丝雀检查失败了。

{07}然而,攻击从覆盖B的第一个字节中学到了什么?当然,只是A+B不等于C。由于攻击没有关于A和C实际上是什么的信息,这就为B创建了大量可能的值。

{08}在此方案下,天真地将单词值细分为字节并分别攻击它们是不可行的。由于模块化(包装)算法的性质,A0 + B0 = C0不能保证A+B= C来自较低字节的比特可以携带更高的字节,而来自较高字节的比特可以溢出到较低的字节。攻击者仍然有可能知道B的第一个字节应该是什么,但是每一个后续字节都会变得更加困难。

{09}假设在合理的时间内找到一种可行的方法来击败这三个64位的单词示例,这个概念可以任意扩展到更多的变量和函数的推导方法,比模算法更复杂。这似乎是不言自明的,有一个计划是足够快的现实世界使用和足够的安全,以阻止几乎所有看似合理的攻击。

{10}如果保留和保护一些存储金丝雀输入的内存区域,则可以进一步改进该技术。只有一个金丝雀计算值实际需要出现在堆栈中,以便检测缓冲区溢出。所有其他文件都可以存在于其他地方,因此即使攻击者设法在不同的函数执行上下文中溢出堆栈,也无法轻松读取它们。

我不太可能是第一个意识到有重大改进的人,可以做的堆叠粉碎保护方案,以抵御这一和类似的攻击。我只是把这作为概念的一个微不足道的证明,“以防万一”。

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/45593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档