好久没发文章了,从3月到5月所有学习记录全都存档在gitee上,包括本篇所有相关题目的exp,链接在此~
接下来想讲一讲自己对FastBinAttack和HouseOfSpirit以及UnsortedBinLeak的认识,因为我发现这俩攻击方法和这一种泄露方法最近用的贼多(也很好用),与其说是Pwn Heap,不如说是Pwn Linked-List(手动狗头)
64位系统中,FastChunk是用户申请的size在[0x20,0xA0]的堆块(32位系统中是[0x10,0x50]),而FastBin则是size在[0x20,0xA0]的空闲堆块。每个Fastbin实质上是一个LIFO的单向链表,而Fastbins实质上是一个数组,数组上10个元素储存着每个Fastbin的head
(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
攻击的关键在于控制一根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)中寻找一个合适的恶意地址。
此题提供了edit功能,无需DoubleFree,直接在形成FastBin之后edit,即可控制fd,直接修改链表
此题并未提供edit功能,需DoubleFree,再Add一次被DoubleFree的chunk,即可控制fd,间接修改链表
也可通过非OffByOne的堆溢出来修改链表,其余方法等待探索吧。
free的参数可控,导致任意地址free,再次allocate遂导致指定地址MemoryWrite
通过修改fd来控制note_list,从而控制free的参数,广义上而言,大多数情况下可以通过fastbin来进行攻击
其实这道题原题是LCTF2016的pwn200……无语了这破比赛。通过溢出override指针,再去free这个指针,从而HOS。
经常需要用到LibcBaseAddr,这时候就必须来一发UnsortedBinLeak
UnsortedBin只有一个链表,且是FIFO的环形双向链表。当释放SmallChunk或者LargeChunk时,不会将它们添加到SmallBin或者LargeBin中,而是添加到UnsortedBin中。而UnsortedBin有一个特性,就是第一个处于其中的空闲chunk的fd和bk都指向main_arena中一固定地址比如这种。
连续Add两个SmallChunk后delete第一个并且Show,返回值即为&main_arena+88
连续Add三个FastChunk(也可视作SmallChunk)后delete第一个并且Show,也返回了main_arena中偏移量固定的地址
等我(不入流PWN手)把HouseOfOrange学会了再来发博客咯
最后打个小广告
欢迎大家加入W8Cloud,一起学习信息安全知识。
组织链接在此~
组织官网在此~