PWN入门笔记 FastBinAttack+HouseOfSpirit+UnsortedBinLeak

好久没发文章了,从3月到5月所有学习记录全都存档在gitee上,包括本篇所有相关题目的exp,链接在此~
接下来想讲一讲自己对FastBinAttack和HouseOfSpirit以及UnsortedBinLeak的认识,因为我发现这俩攻击方法和这一种泄露方法最近用的贼多(也很好用),与其说是Pwn Heap,不如说是Pwn Linked-List(手动狗头)

FastBinAttack

Propaedeutics
What is fast bins?

64位系统中,FastChunk是用户申请的size在[0x20,0xA0]的堆块(32位系统中是[0x10,0x50]),而FastBin则是size在[0x20,0xA0]的空闲堆块。每个Fastbin实质上是一个LIFO的单向链表,而Fastbins实质上是一个数组,数组上10个元素储存着每个Fastbin的head

Structure of a chunk (freed or not)
(not used)(in bins)
+-----------+-----------+
| prev_size |    size   |
+-----------+-----------+
|     fd    |     bk    |
+-----------+-----------+
|fd_nextsize|bk_nextsize|(fastchunk do not have this part)
+-----------+-----------+
|         empty         |
+-----------------------+
(now used)(not in bins)
+-----------+-----------+
| prev_size |    size   |========|
+-----------+-----------+        |
|        content        |        |
+-----------------------+        |
                                 |
size(showed in the form of bits) |
+-----------------+-+-+-+        |
|                 | | | | <======|
+-----------------+-+-+-+
   NON_MAIN_ARENA<-| | |
        IS_MAPPED<---| |
    (P)PREV_INUSE<-----| (the prev_inuse of fastchunk is always 1)
#define MAX_FAST_SIZE     (80 * SIZE_SZ / 4)
// SIZE_SZ==4 in 32bits OS while 8 in 64bits OS
#ifndef DEFAULT_MXFAST
#define DEFAULT_MXFAST     (64 * SIZE_SZ / 4)
#endif
// MXFAST is a value can be modified

然而,ptmalloc 默认情况下会调用 set_max_fast(s) 将全局变量 global_max_fast 设置为 DEFAULT_MXFAST,也就是设置 fast bins 中 chunk 的最大值。当 MAX_FAST_SIZE 被设置为 0 时,系统就不会支持 fastbin 。

mfastbinptr fastbinsY[NFASTBINS];
// NFASTBINS usually is 10, that is to say, there should be 10 pointer to store bins of different size. 

Click here to know more

Attack Method

攻击的关键在于控制一根fd指针,然后修改指针内容为一个恶意地址,于是malloc的下一个fast chunk就会出现在fd指向的恶意地址,于是就达成了MemoryWrite的目的。
而如何控制一根fd指针呢?
修改FastBin来修改已free的chunk,然后再调用若干次malloc直到成功重新使用edited fast chunk,下一个malloc的FastChunk将会出现在上一个chunk的fd指针里写入的恶意地址。恶意地址的特征是存在一段dword,其低地址的1byte恰好在FastChunk的size之间,而其余高地址bytes全为\x00。通常考虑在Global Offset Table或者Block Started by Symbol或者加载的libc(e.g __malloc_hook)中寻找一个合适的恶意地址。

NJUPT-CGCTF:note(300pt)

此题提供了edit功能,无需DoubleFree,直接在形成FastBin之后edit,即可控制fd,直接修改链表

ISCC2018:WriteSomePaper(200pt)

此题并未提供edit功能,需DoubleFree,再Add一次被DoubleFree的chunk,即可控制fd,间接修改链表

others

也可通过非OffByOne的堆溢出来修改链表,其余方法等待探索吧。

HouseOfSpirit

Propaedeutics
What is HOS?

free的参数可控,导致任意地址free,再次allocate遂导致指定地址MemoryWrite

Attack Method

通过修改fd来控制note_list,从而控制free的参数,广义上而言,大多数情况下可以通过fastbin来进行攻击

ISCC2018:HappyHotel(300pt)

其实这道题原题是LCTF2016的pwn200……无语了这破比赛。通过溢出override指针,再去free这个指针,从而HOS。

UnsortedBinLeak

经常需要用到LibcBaseAddr,这时候就必须来一发UnsortedBinLeak

Propaedeutics
What is unsorted bin?

UnsortedBin只有一个链表,且是FIFO的环形双向链表。当释放SmallChunk或者LargeChunk时,不会将它们添加到SmallBin或者LargeBin中,而是添加到UnsortedBin中。而UnsortedBin有一个特性,就是第一个处于其中的空闲chunk的fd和bk都指向main_arena中一固定地址比如<main\_arena+88>这种。

Leak Method
NJUPT-CGCTF:note(300pt)

连续Add两个SmallChunk后delete第一个并且Show,返回值即为&main_arena+88

SCUTCTF2017:babyheap

连续Add三个FastChunk(也可视作SmallChunk)后delete第一个并且Show,也返回了main_arena中偏移量固定的地址

The END

等我(不入流PWN手)把HouseOfOrange学会了再来发博客咯

最后打个小广告
欢迎大家加入W8Cloud,一起学习信息安全知识。
组织链接在此~
组织官网在此~

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值