为什么返回libc比返回用户早得多?

时间:2015-11-17 09:34:45

标签: security linux-kernel kernel exploit

我对这个主题很陌生,只知道一些基本概念。然而,有一个问题让我很困惑。

Solar Designer在1997年提出了返回libc的想法(http://seclists.org/bugtraq/1997/Aug/63)。根据我的理解,返回用户直到2007年才开始受欢迎(http://seclists.org/dailydave/2007/q1/224)。 但是,返回用户似乎比返回libc容易得多。所以我的问题是,为什么黑客通过使用libc花费了大量精力来构建小工具链,而不是在利用内核漏洞时在用户空间中使用自己的代码呢?

我不相信他们没有意识到内核中存在NULL指针解除引用漏洞。

3 个答案:

答案 0 :(得分:0)

Ret2libc或ROP是由于内存保护(DEP / NX)而无法返回shellcode(jmp esp / whatever)时部署的技术。

答案 1 :(得分:0)

很好的问题,感谢你花了一些时间研究这个话题,然后发表一篇文章,使其读者对人类的未来失去希望(你可能会告诉我已经读过一篇文章)今晚很少有[exploit]个标签)

无论如何,有两个原因

  1. return-to-libc是通用的,前提是您有偏移量。无需以编程方式或手动构建返回链或刮除现有用户功能。

  2. 部分由于启用了链接器的重定位,部分原因是由于历史记录,Linux系统上执行的大多数程序的可执行运行时基本上都需要libc运行时,或者至少需要能够正确处理_start的运行时和cons。这个公式仍然在Windows上,只是在返回到kernel32 / oleaut / etc的稍微不同的范例下,但实际上可以更加立即强大,特别是对于具有长度要求的shellcode,原因与内核32-SSDT函数间接调用系统调用的方式

  3. 作为旁注,如果你正在讨论内核中的NULL指针解引用,你可能会混淆返回到vDSO空间,这实际上受制于标准" mprotect和roll&#34的一组不同约束。 ; userland没有。

答案 2 :(得分:0)

他们执行不同的目标,您可以与两者合作。

返回libc

这是一个缓冲区溢出漏洞,你可以控制某些输入,并且你知道存在一个编写得很糟糕的程序,它会将你的输入复制到堆栈并通过它返回。这允许您开始在您没有登录的计算机上执行代码,或者限制访问。

返回libc使您能够控制执行的代码,并且通常会导致您在空间内运行,这是一段更自然的代码。

从内核返回

这是一种特权升级攻击。它需要在机器上运行的代码,并利用内核中的错误,从而将内核权限应用于用户进程。

因此,您可以使用return-to-libc在Web浏览器中运行代码,然后返回用户以执行受限任务。

早期的shellcode

在返回libc之前,有直接shellcode,其中缓冲区溢出包括漏洞利用代码,知道堆栈的位置,这可以直接运行。这在Windows中的NX位有点过时了。 (x86硬件能够在段上执行,但不能在页面上执行。)

  

为什么return-to-libc比返回用户早得多?

这些攻击的目标是拥有这台机器,通常很容易在用户模式进程中找到一个漏洞,让您可以访问所需的内容,只有通过减少系统的强化才能实现边界的特权,并修复重要程序中的错误,新的内核返回是必要的。