堆学习入门

借助hitcon training的题目对三种堆的利用方法进行了一个系统的学习,刚入坑的堆小白们可以一起学习一下。题目链接:https://github.com/scwuaptx/HITCON-Training

Use after free

记录一波建立文件过程
mkdir + name
 touch + name
 echo 'context' > name
 cat name

hacknote(Hitcon training lab10)

这是一个典型的use after free很适合初次接触的人进行练习

程序功能分析

可以发现是一个note,这里有三个功能

add_note

可以发现add的功能是添加字条,第一个段是8字节然后用来储存函数指针 第二段是用来储存我们的输入的

del_note

这里可以发现del是一个删除操作,但是并没有让指针置0所以存在use after free漏洞

ptint_note

是一个调用函数指针的一个过程

解题思路

  • 一、先申请chunk1chunk2其中大小随意不要超过fastbin的范围就可以了
  • 二、
  • free chunk1
  • free chunk2
  • 三、此时fastbin中的分布是
  • chunk2(8) -> chunk1(8)
  • chunk2(32) -> chunk1(32)
  • 四、这个时候申请一个chunk3大小为8 这个时候系统先分配chunk1(8)的大小存放puts函数 然后分配chunk2(8)作为我们的context这个时候我们可以在这里写上magic函数执行获取flag

exp:

总结:

简单的说use after free就是利用free之后指针没有被设置成NULL然后我们可以在此malloc出来使用。

house of force(Hitcon training lab11)

read函数

第三个参数为unsigned符号,当-1时及0xffffffff 任意大小读

利用需要满足的条件
  • 首先,需要存在漏洞使得我们可以控制top chunksize域
  • 其次,需要我们可以自由的控制malloc分配的大小
  • 分配的次数不能受限制
bamboobox

这里利用house of force进行利用,题目的下方会对house of force进行一个原理讲解

程序功能分析

main
  • 这里可以发现开始时程序分配了0x10的空间给hello messagegoodbye_message函数
  • 进行一个循环让我们进行菜单栏选项
menu

这里可以看见这里总共有5个选项其中选项1就是show itemremove就是正常的删除操作,5是正常的退出操作。接下来我们仔细看2,3两个选项

add a new item
  • 这里程序先让我们选择长度,惊喜惊喜!可以看出长度我们时可以任意控制的,随意malloc
  • 然后输入们的item值就可以了
change the item in the box

修改物品的名字,根据给定的索引,以及大小,向指定索引的物品中读取指定长度名字。这里长度由用户来读入,也存在任意长度堆溢出的漏洞。

magic

这里有一个我们的flag文件可以让我们利用

利用思路

  • malloc一个块
  • 利用change the item in the box进行长度的修改使得我们可以覆盖到top chunk的size位置修改top chunk size=-1(因为在其中size是无符号整数-1会被解释为0xffffff)所以size肯定就够我们用了
  • 接着我们利用house of force的方法将top chunk的位置放在heap base地址
  • 然后我们再申请一个0x10的块,去修改函数指针为我们Magic的地址 整个利用这样就完成

exp:

总结:

这里利用house of force

  • 这个利用过程的条件必须要满足那三点
  • 然后是修改top chunk的大小
  • 然后是利用malloctop chunk放置到我们需要改写的那个地址上,可以是got表的地址可以是分配的堆块地址。

Double free(Hitcon training lab12)

故名思义,就是对一个堆块进行了两次free, 但是free了同一个堆块两次,其中在glibc中对此有一个检查

其中是检查main_arean是否指向向了原来的一个chunk,这个就是非常容易绕过的只需要free(p1);free(p2);free(p1)就可以绕过了。

利用过程

这是我们执行doublefree之后的图,此时mallocchunk1,更改chunk1fd,又因为此时chunk1是在fastbin list,也就是结构变成了下图

可以看见现在fastbin list中会多指向一个我们的fakebin(此时就可以进行任意地址写了)

check_fail

if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
    {
      errstr = "malloc(): memory corruption (fast)";
    errout:
      malloc_printerr (check_action, errstr, chunk2mem (victim));
      return NULL;
    }

其中会有一个对fakebinsize大小的检查,如果不满足当前fastbin链中应该有的大小则会显示异常。

例题:

程序功能分析

main

堆题一般都是些菜单题,这又是一道菜单题

add

add函数就是正常的malloc出堆块,然后输入一些数据,这里并没什么漏洞

visit

visit函数就是遍历刚才我们所有建立的东西

del

一个删除函数,其中对指针进行了置0所以无法使用use after free,但是这里似乎可以利用double free

clean

把所有已经创建了的都进行一个了删除

magic

这是一个get_flag的函数

利用思路

利用的思路还是比较明显的,利用double free进行一个got表的改写。首先add函数建立2个堆块,然后free(chunk1)->free(chunk2)->free(chunk1)进行一个检查的bypass。然后再执行add函数,进行chunk1堆块fd指针改写,然后连续free出chunk2,chunk1和我们构造的fake_chunk(这个chunk的地址在got表上),对got表进行一个覆写,将puts函数``got表改写成magic函数的地址。

注意事项

因为要bypassfakebin_size的检查,所以在选got表地址的时候需要gdb调试一下,看存储的数的低四位满足要求,这里就选用了0x601ffa,刚好可以满足条件

exp:

总结

从这些3个利用方式来看,堆的学习主要是建立在对源码和对堆分配,回收等操作的熟悉的基础上。这里推荐用pwndbg进行调试,还有一些大佬会用gefpeda以及一些插件的方法进行调试,具体看个人的习惯了。

原文发布于微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文发表时间:2018-10-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端技术探索

PHP 使用协同程序实现合作多任务(二)

waitingForRead 及 waitingForWrite 属性是两个承载等待的socket 及等待它们的任务的数组。有趣的部分在于下面的方法,它将检查 ...

1191
来自专栏Python中文社区

一种Python全局配置规范以及其修改

專 欄 ❈丁果,Python中文社区作者。对django、pyqt、opencv、tornado感兴趣。 GitHub:https://github.com/...

2929
来自专栏云瓣

Node.js编程之异步

异步操作 Node采用V8引擎处理JavaScript脚本,最大特点就是单线程运行,一次只能运行一个任务。这导致Node大量采用异步操作(asynchronou...

3305
来自专栏大内老A

WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[下篇]

WCF客户端和服务端的框架体系相互协作,使得开发人员可以按照我们熟悉的方式进行异常的处理:在服务操作执行过程中抛出异常(FaultException),在调用服...

2019
来自专栏我就是马云飞

设计模式二十四章经之状态模式

931
来自专栏精讲JAVA

深入探索 Java 热部署

在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加...

1021
来自专栏JMCui

MongoDB系列二(介绍).

一、特点     学习一个东西,至少首先得知道它能做什么?适合做什么?有什么优缺点吧?     传统关系型数据库,遵循三大范式。即原子性、唯一性、每列与主键直接...

2928
来自专栏java一日一条

有了 GC 还会不会发生内存泄漏?

这个问题是我在写C++时考虑到的,C++需要手动管理内存,虽然现在标准库中提供了一些智能指针,可以实现基于引用计数的自动内存管理,但现实环境是很复杂的,我们仍要...

613
来自专栏小勇DW3

Java多线程面试题整理 1) 什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比...

3132
来自专栏崔庆才的专栏

你还在用 os.path?快来感受一下 pathlib 给你带来的便捷吧!

pathlib 是Python内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径)...

1654

扫码关注云+社区

领取腾讯云代金券