被0ctf的这道题目搞了好久。记录一下
思路是使用fastbin attack,how2heap上有一个栗子可以分析一下
先申请5个chunk,free之后使得 fastbin[0]->idx1->idx2->NULL
1 | allocate(0x10) # idx 0, 0x00 |
此时的bins
1 | pwndbg> bins |
1 | pwndbg> x/40gx 0x5619d93ea000 |
然后我们修改idx2的指针,通过fill idx0造成溢出,同时由于内存对齐,可以肯定idx4的指针最后肯定是0x80
修改后如下:
1 | pwndbg> x/40gx 0x560e5e91c000 |
此时的bins指向:
1 | pwndbg> bins |
如果再连续申请两个chunk,那么第一次是idx2,第二次就是idx4
但是malloc有一个check机制,如果两个fastbin的大小不一样就会报错,所以我们再借用一下idx3,让其溢出到idx4,修改idx4的大小
1 | pwndbg> x/40gx 0x5573e66cd000 |
此时idx4的大小已经被修改了,于是可以申请了
1 | allocate(0x10) # idx 1 |
之后,如果我们想要将 idx 4 放到 unsorted bin 中的话,先需要把它的大小改回来,同时为了防止其与 top chunk 合并,我们需要再次申请一个 chunk。此后再释放 idx4 就会进入 unsorted bin 中去了。
1 | pwndbg> x/40gx 0x559b5b9a5000 |
此时dump(2)就可以得到unsorted bin 的地址了。
此时的bins如下
1 | pwndbg> bins |