【问题标题】:Return Oriented Programming Compiler面向返回的编程编译器
【发布时间】:2011-04-13 08:06:18
【问题描述】:

我正在尝试更好地了解我的计算机在较低级别上,除了编写堆栈缓冲区溢出漏洞之外还有什么更好的方法?我最近遇到了ROP。我阅读了http://cseweb.ucsd.edu/~hovav/talks/blackhat08.html 的论文,它提到有一个用于 ROB 代码的编译器。 linux(64位)这样的编译器叫什么名字?

谢谢, 康斯坦丁

【问题讨论】:

    标签: exploit


    【解决方案1】:

    我是加州大学圣地亚哥分校这个项目的研究人员之一,编写了 C-to-exploit-string 编译器部分。您所指的具体工作是特定于 SPARC 的(并且进一步针对已知的 Solaris libc 二进制文件进行了定制)。这些论文实际上更好地概述了我们所做的工作(以及概括和编程方法):

    对于Linux + x64,自我们研究以来,已经出现了许多用于ROP攻击创建的工具,您通常可以通过搜索网络找到。并且其中大部分都比我们(现在相对较旧)的研究专用工具更有用和用户友好。

    让我提出一个建议,如果您想了解 Linux 系统的较低级别并且还没有这样做,请考虑采用以下“阶梯式”方法:

    1. “Old-School”堆栈注入:在您的机器上禁用不可执行堆栈保护,只注入 shell 代码。这里有很多资源 - 从 Aleph One 的开创性作品“Smashing The Stack For Fun And Profit”开始(在网络上广泛提供)。
    2. Return-to-Libc:重新启用不可执行堆栈,并尝试创建自定义有效负载以跳转到 libc(可能的 execve)并尝试获取 shell。

    一旦你掌握了这些,那么进入 ROP 会容易得多。如果你已经在那里,那么就给你力量!

    【讨论】:

    • Ryan,我正试图了解它是如何工作的。我是 ROP 新手,我开始使用 SPARC,因为我正在开发一个漏洞利用程序。我刚刚学会了返回 LibC,但是调用者函数在它到达 system() 之前将 %i0 寄存器作为 %i0 与 /bin/sh.. 我认为 ROP 可能能够拯救我,我可以在中间调用一个小后缀从我溢出的其他寄存器之一恢复 %o0 的函数。我几乎开始通过更新手稿中的图表来理解它,展示了 %sp 如何在 ROP 中发挥作用,但后来我失去了它......
    • 上述评论的继续:AFAIK,我正在利用一个远程程序,如果没有蛮力,我无法知道堆栈偏移量。当我覆盖 %fp 和 %i7 时,我用一些随机限定符编写 %fp堆栈地址,我知道它在 ret 恢复到受感染的 %i7 后变成了 %sp。然后这个 %sp 成为新堆栈帧中 %i7 的基础,对吧?!这就是为什么我不明白我怎么可能在 SPARC 上控制多个级别的回报:|
    • 嗨,bazz,感谢您的关注!您是否通过了整个 CCS 2008 论文? SPARC 上 ROP 的难点在于滑动寄存器窗口和返回后准备卷起的东西。不清楚你是否开启了 ASLR,如果开启了,事情就会变得更加困难(我们的论文中没有解决这个问题)。只要 ASLR 关闭并且您有“常规” strcpy 或其他可用的漏洞利用,您基本上需要在函数返回后回溯所有寄存器应该在哪里,并且论文应该在那里为您提供高级别的。
    • 我想出了办法。感谢您的回复。
    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2010-09-18
    相关资源
    最近更新 更多