首页
社区
课程
招聘
glibc2.31下的off-by-null
2021-6-16 23:54 8773

glibc2.31下的off-by-null

2021-6-16 23:54
8773

前言

众所周知,libc2.31上的unlink加了更多的限制,现在想unlink越来越难了。尤其是off-by-null这种攻击方式,想实现off-by-null需要一系列复杂的操作。看了t1an5g老师傅的文章,链接如下:https://bbs.pediy.com/thread-257901-1.htm


作者以2019-BALSN-CTF-plaintext为例,来详细介绍libc2.31下off-by-null的流程。师傅图文并茂,写得特别好。可是对于我这种萌新来说,看着特别费劲,费劲的原因应该是对师傅堆的布局不太清楚。为搞清楚利用流程,我特地把程序用exp跟了一遍,并exp的关键地方的堆布局一步一步地画了出来,供萌新食用。


原理:

为绕过 prevsize check,可以需要利用 large bin 的残留指针再结合堆的恰当布局,则能构造出一个fake chunk,后面我将其称作fake_chunk_B

主要是利用残余在 large bin 上的 fd_nextsize / bk_nextsize 指针。首先,我们拿回 large bin,后面我将其称作chunk_A,而 fake_chunk_B 就是 chunk_A + 0x10,在chunk_A 的 bk 位置上写好size,fd先不管,然后部分覆盖chunk_A 的 fd_nextsize 到一个我们可以控制其 bk 的 chunk上(比如从 small bin 或者 unsorted bin 中拿出的chunk,如果其bin中有多个chunk的话,那么拿出来的chunk的bk上必定残留了heap指针,我们可以通过部分覆盖使其指向 fake chunk,以便绕过unlink 检查。这里我们利用的是small bin),由于 chunk_A 的 bk_nextsize 我们并没对其修改,所以其指向的是 chunk_A 本身,为了绕过 unlink 检查( p->fd->bk == p && p->bk->fd == p),我们需要将这个该 fake_chunk_B 的 bk 指向其本身,也就是 chunk_A 的 fd 指向chunk_A + 0x10 并且不能修改已经保存好的其他数据,原本我们可以利用 tcache 的链表特性来完成这一操作,奈何 glibc-2.29的tcache会对 bk 也进行修改,那么则会直接改掉 fake_chunk_B 的 szie,导致unlink失败,但是我们任然可以利用 fastbin 的链表特性来完成这一操作,在chunk_A上写好heap地址后,在进行部分覆盖使其指向chunk_A + 0x10,则这样就能绕过 glibc-2.31 的检查。

由于最后一个字节总是有'\0'填充,所以我们需要爆破0x..........00..(点为任意十六进制)这样的heap地址。综上所诉该攻击方式的概率是 1/16



[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-6-16 23:57 被husterlong编辑 ,原因:
收藏
点赞4
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回