Blind Return Oriented Programming (BROP) Attack - 攻击原理_工具资源_青云站长教程网
欢迎来到站长教程网!
  • 秒到短信接口 免费试用
  • 微信支付宝接口 秒结算
  • 中文网站排名|申请加入
  • 搜索引擎全站查询
  • 查询移动网站权重数据
  • 海外主机 台湾公司直销
  • 工具资源

    当前位置:主页 > 网站运营 > 工具资源 >

    Blind Return Oriented Programming (BROP) Attack - 攻击原理

    时间:2019-07-21|栏目:工具资源|点击:
  • 第一次在WooYun发文章,不知道是否符合众客官口味,望轻拍。

    这篇文章翻译至我的这篇博客,主要介绍了一种叫做BROP的攻击,该文章主要介绍原理部分,对该攻击的重现可以参看我的另外一篇博客。

    BROP攻击基于一篇发表在Oakland 2014的论文Hacking Blind,作者是来自Standford的Andrea Bittau,以下是相关paper和slide的链接:

    paper

    slide。

    以及BROP的原网站地址:

    Blind Return Oriented Programming (BROP) Website

    可以说这篇论文是今年看过的最让我感到兴奋的论文(没有之一),如果要用一个词来形容它的话,那就只有“不能更帅”才能表达我对它的喜爱程度了!

    这篇文章假设读者已经了解Return-Oriented Programming (ROP) 的基本概念,所以只是介绍BROP的实现原理,如果还不清楚什么是ROP,请先出门左转,看看Wiki的相关介绍。

    BROP的实现真的是让人感到非常“cool”和“smart”,我希望能够通过这篇文章把它讲清楚。

    0x01 BROP攻击的目标和前提条件

    目标:通过ROP的方法远程攻击某个应用程序,劫持该应用程序的控制流。我们可以不需要知道该应用程序的源代码或者任何二进制代码,该应用程序可以被现有的一些保护机制如NX, ASLR, PIE, 以及stack canaries等保护,应用程序所在的服务器可以是32位系统或者64位系统。

    初看这个目标感觉实现起来特别困难。其实这个攻击有两个前提条件的:

    必须先存在一个已知的stack overflow的漏洞,而且攻击者知道如何触发这个漏洞;

    服务器进程在crash之后会重新复活,并且复活的进程不会被re-rand(意味着虽然有ASLR的保护,但是复活的进程和之前的进程的地址随机化是一样的)。这个需求其实是合理的,因为当前像nginx, MySQL, Apache, OpenSSH, Samba等服务器应用都是符合这种特性的。

    0x10 BROP的攻击流程 1 - 远程dump内存

    由于我们不知道被攻击程序的内存布局,所以首先要做的事情就是通过某种方法从远程服务器dump出该程序的内存到本地,为了做到这点我们需要调用一个系统调用write,传入一个socket文件描述符,如下所示:

    write(int sock, void *buf, int len)

    将这条系统调用转换成4条汇编指令,如图所示:

    write gadgets

    所以从ROP攻击的角度来看,我们只需要找到四个相应的gadget,然后在栈上构造好这4个gadget的内存地址,依次进行顺序调用就可以了。

    但是问题是我们现在连内存分布都不知道,该如何在内存中找到这4个gadgets呢?特别是当系统部署了ASLR和stack canaries等保护机制,似乎这件事就更难了。

    所以我们先将这个问题放一放,在脑袋里记着这个目标,先来做一些准备工作。

    攻破Stack Canaries防护

    如果不知道什么是stack canaries可以先看,简单来说就是在栈上的return address下面放一个随机生成的数(成为canary),在函数返回时进行检查,如果发现这个canary被修改了(可能是攻击者通过buffer overflow等攻击方法覆盖了),那么就报错。

    那么如何攻破这层防护呢?一种方法是brute-force暴力破解,但这个很低效,这里作者提出了一种叫做“stack reading”的方法:

    假设这是我们想要overflow的栈的布局:

    stack layout

    我们可以尝试任意多次来判断出overflow的长度(直到进程由于canary被破坏crash了,在这里即为4096+8=4104个字节),之后我们将这4096个字节填上任意值,然后一个一个字节顺序地进行尝试来还原出真实的canary,比如说,我们将第4097个字节填为x,如果x和原来的canary中的第一个字节是一样的话,那么进程不会crash,否则我们尝试下一个x的可能性,在这里,由于一个字节只有256种可能,所以我们只要最多尝试256次就可以找到canary的某个正确的字节,直到我们得到8个完整的canary字节,该流程如下图所示:

    stack reading

    我们同样可以用这种方法来得到保存好的frame pointer和return address。

    寻找stop gadget

    到目前为止,我们已经得到了合适的canary来绕开stack canary的保护, 接下来的目标就是找到之前提到的4个gadgets。

    在寻找这些特定的gadgets之前,我们需要先来介绍一种特殊的gadget类型:stop gadget.

    一般情况下,如果我们把栈上的return address覆盖成某些我们随意选取的内存地址的话,程序有很大可能性会挂掉(比如,该return address指向了一段代码区域,里面会有一些对空指针的访问造成程序crash,从而使得攻击者的连接(connection)被关闭)。但是,存在另外一种情况,即该return address指向了一块代码区域,当程序的执行流跳到那段区域之后,程序并不会crash,而是进入了无限循环,这时程序仅仅是hang在了那里,攻击者能够一直保持连接状态。于是,我们把这种类型的gadget,成为stop gadget,这种gadget对于寻找其他gadgets取到了至关重要的作用。

    寻找可利用的(potentially useful)gadgets

    上一篇:令人堪忧的app工厂安全(一个弱口令影响整体安

    栏    目:工具资源

    下一篇:学而思(好未来)集团网上核心系统最高权限可

    本文标题:Blind Return Oriented Programming (BROP) Attack - 攻击原理

    本文地址:http://www.jh-floor.com/wangzhanyunying/gongjuziyuan/8023.html

    您可能感兴趣的文章

    广告投放 | 联系我们 | 版权申明

    重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

    如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

    联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

    Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号