一、核心思想

  • 通过fastbins链的管理,达到目标地址(target)读写。

二、原理图解

fastbin存储freechunk的单链表结构:

  • fastbins是如何存取fastchunk的,见文章:https://blog.csdn.net/qq_41453285/article/details/97613588。

  • 第一步:我们知道被free的chunk会被放入到arena所管理的fastbins链中。如果此时我们malloc一个堆块p,并将其free到fastbin链中,但是我们的p指针没有置空,所以仍然指向于这个freechunk的fd成员处。
char *p=malloc(size);free(p);

  • 第二步:释放之后,arena管理的fastbin中bin头的fd指针指向于我们申请的这个chunk,p指针就是chunk的fd,如上图所示。
  • 第三步:这个chunk的fd指针本来指向于数值0,此时我们通过p指针将fd指针指向于我们的target地址。
*p=target

  • 第四步:此时我们再去malloc与我们释放的chunk相等大小的chunk,那么被上面被free掉的chunk就会从fastbin单链表中移除,根据fastbin链表的单链表结构,此时arena的fastbin的bin头的fd指针指向于我们的target地址了。
char *q=malloc(size);

  • 第五步:由于此arena的fastbin的bin头的fd指针指向于我们的target地址了。此时我们再去malloc的时候,就是把target这块地址malloc出来给应用层使用了,此时我们就可以使用返回的target的指定地址,对target进行读写了。
char *r=malloc(size);

三、目标地址的构造

  • 如果从fastbins中malloc一个freechunk时,glibc会做以下两个检测:

    • 检测1:检测你要malloc的freechunk的大小是否在该chunk所在的fastbin链的大小尺寸范围内(例如:一个fastbin链所存储的chunk大小必须在0x30-0x40之间,但是你要申请的这个chunk却是0x50,那么就会程序就报错退出)。
    • 检测2:检测你这个freechunk的size成员的PREV_INUSE为是否为1,为1才可以通过检测。
  • 检测详情见文章:https://blog.csdn.net/qq_41453285/article/details/97753705。
  • 因此,如果我们想要从fastbin中malloc出这个target地址来使用,需要做以下的构造:

构造①

  • 构造什么:我们需要让target目标地址指定偏移位置处(size成员地址处)的数值与当前fastbin所管理的freechunk的大小范围一致
  • 存在的问题:我们所攻击的target地址的指定偏移位置处(size成员地址处)的数值不一定能够满足当前的fastbin所管理的大小范围
  • 如何解决:虽然我们的target地址处的数值不能满足fastbin的要求,那么可以通过内存地址的偏移,取target地址附近的其它地址,查看其它地址的指定偏移处是否满足fastbin的大小要求,如果有满足的,那么就将这块地址作为攻击目标
  • 如下图所示,我们不是直接将target地址作为攻击目标放入fastbin中,因为其指定偏移地址处的伪造size成员数值不能够满足系统要求,因此我们选择了target地址附近的一块其他地址来作为攻击的目标,其指定偏移地址处的数值符合fastbin所管理的要求。

构造②

  • 构造什么:如果构造①通过了,那么系统还会检测目标地址偏移的size成员数值的PREV_INUSE为是否为1,以及NON_MAIN_ARENA、IS_MAPPED位的规则。这一系列就是要通过do_check_malloced_chunk函数的检测。
  • do_check_malloced_chunk函数检测见文章:https://blog.csdn.net/qq_41453285/article/details/97753705。
  • 存在的问题:如果我们的攻击目标地址的指定偏移的size成员数值的IS_MAPPED位不为1,那么glibc就会认为该地址不是由mmap系统调用所申请的,于是就执行if,但是assert中的断言会是程序终止(因为不满足)。

  • 如何解决:所以我们选取的攻击目标地址的偏移size成员数值的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位都要为1,比如当前fastbin所能管理的freechunk大小为0x70~0x80,而伪造的size成员处的数值为0x71、0x72这样的数值不能够符合要求的,但0x7f这样的地址就可以满足需要,因此构造完①之后,攻击目标地址的伪造size成员成员数值的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位都要为1,0x7f就可以满足。

四、漏洞的技巧点

  • 技巧①:我们malloc的时候,尽量malloc一个大小在0x70~0x80之间的堆块(因此malloc的参数要为0x60~0x70之间),因为这样我们的目标地址就会被放入0x70~0x80大小范围的fastbin链中,此时我们去构造堆块的时候,由于系统中0x7f这样的数值比较好找,所以能够构造0x7f这样的数值来跳过glibc的检测一。
  • 技巧②:接着技巧①,如果此时我们没有数值为0x7f这样的地址来让我们构造,那么我们就需要使用借助unsortedbin attack了,利用unsortedbin attack向我们的目标地址处写入一个0x7f的数值(见文章:https://blog.csdn.net/qq_41453285/article/details/99329694)。

五、__malloc_hook攻击

  • 见文章:https://blog.csdn.net/qq_41453285/article/details/99321101。

六、演示案例

  • 待续。

  • 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。

堆漏洞挖掘——fastbin attack漏洞相关推荐

  1. linux堆内存管理深入分析,【技术分享】Linux堆溢出之Fastbin Attack实例详解

    1. 摘要 在近几年各大CTF比赛中,看到有很多次pwn类别题中出现fastbin攻击的情况,例如今年的defcon,RCTF,胖哈勃杯,0CTF final等等 ,fastbin attack是堆漏 ...

  2. 漏洞挖掘 符号执行_漏洞挖掘新思路:fuzz+符号执行——driller

    driller 符号执行+fuzz漏洞挖掘思路 先看一段程序 int main() { config_t* config=read_config(); if (config==null){ puts( ...

  3. 逻辑漏洞挖掘之——逻辑漏洞概述

    逻辑漏洞概述 SQL 注入,文件上传,代码执行,我们把渗透一个站点的所有重点都放在了这些可以一步到位的漏洞上,我们把这些漏洞称之为高危漏洞,这些漏洞在工具化盛行的今天,已经越来越难见到了.现有的工具检 ...

  4. java 漏洞挖掘_Java反序列化漏洞的挖掘、攻击与防御

    一.Java反序列化漏洞的挖掘 1.黑盒流量分析: 在Java反序列化传送的包中,一般有两种传送方式,在TCP报文中,一般二进制流方式传输,在HTTP报文中,则大多以base64传输.因而在流量中有一 ...

  5. java 漏洞挖掘_Java XXE漏洞典型场景分析

    本文首发于oppo安全应急响应中心: 0x01 前言: XML 的解析过程中若存在外部实体,若不添加安全的XML解析配置,则XML文档将包含来自外部 URI 的数据.这一行为将导致XML Extern ...

  6. [ 漏洞挖掘基础篇六 ] 漏洞挖掘之越权漏洞挖掘

  7. 二进制漏洞挖掘_漏洞挖掘的艺术-面向二进制的静态漏洞挖掘

    本文首发于"合天智汇"公众号 作者: 萌新 0 本文是本系列的第二篇,将对面向二进制程序的静态漏洞挖掘技术进行介绍与分析. 面向二进制程序的静态漏洞的挖掘技术由于缺少源代码中的结构 ...

  8. 攻防比赛中系统层漏洞挖掘-身份隐藏解决方案

    系统层漏洞挖掘 系统层漏洞的挖掘需要很多相对高级的漏洞挖掘方法.从实战角 度看,以下6种挖掘方法最为实用:代码跟踪.动态调试.Fuzzing技 术.补丁对比.软件逆向静态分析.系统安全机制分析. 1) ...

  9. 那些漏洞挖掘高手都是怎么挖漏洞的?

    前言 说到安全就不能不说漏洞,而说到漏洞就不可避免地会说到三座大山: 漏洞分析 漏洞利用 漏洞挖掘 从个人的感觉上来看,这三者尽管通常水乳交融.相互依赖,但难度是不尽相同的.本文就这三者分别谈谈自己的 ...

最新文章

  1. python下三角代码分析_空间分析:2-3。用Python生成Delaunay三角形,23Python,德劳内
  2. portainer图形化监控
  3. Android Gradle使用总结
  4. lol最克制诺手的英雄_LOL:哪些英雄之间非常克制,不管怎么打,遇到就输了?...
  5. python spider怎么用_python爬虫入门(七)Scrapy框架之Spider类
  6. Mysql -- 外键的变种 三种关系
  7. Silverlight中的InkPresenter(可以保存、加载)
  8. 你看到过哪些简短有内涵的一看就想发朋友圈的句子?
  9. 计算机信息管理是学什么课程设计,毕业论文计算机专业学生信息管理系统(数据库课程设计)...
  10. Cookie 版购物车
  11. 字符串数组排序,如果可以保证前一个字符的末尾与后一个字符的开头相同,返回1,否则返回-1...
  12. 51nod1122 机器人走方格 V4
  13. Android修改APP名称和图标
  14. comsol学习中心:建模工作流程
  15. 当杭州为人称道的美丽遇见了华为云!
  16. 【Nginx服务优化与防盗链】
  17. 人脸活体检测论文:Multi-Modal Face Anti-Spoofing Based on Central Difference Networks
  18. 黄铭钧:院长创业与酒
  19. GD32F130之GPIO
  20. 效应论——破窗效应(zt)

热门文章

  1. delphi bde mysql_Delphi- 连接MySQL数据库BDE
  2. K-Mediods算法
  3. etf动量轮动+大盘择时:年化30%的策略
  4. sql中的日期比较(年,月,日)
  5. 数据库对日期进行比较
  6. 如何使用Aiseesoft Mac Video Enhancer让视频更加清晰
  7. cron 表达式周一到周五执行以及只有周六周天执行
  8. 试证明:已知二叉树的前序序列和中序序列,可以唯一确定该二叉树
  9. 三七互娱php笔试题,三七互娱笔试
  10. 2018三七互娱前端笔试