[原创][writeup]CTFHUB-UnsortedBin Attack
6天前 1517
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
全局变量上方内存区,我们本次不利用此块内容
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
mallocHook上方内存区
1 2 3 4 5 6 |
|
FakeChunk选址
1 2 3 4 5 6 |
|
虽然这题叫UnsortedBin Attack,但是甚至可以用上一题的exp来打通,不是很理解为什么要在interface
函数中设置magic
这个后门,不过为了符合出题人的要求,所以还是单独用UnsortedBin Attack来做一次
假如不存在全局变量heapList;magic
,目前不知道需要申请FakeChunk
到哪个位置,所以需要使用Unsorted Bin
来泄露main_Arena
的地址
根据分析可知:
add()
函数允许用户申请10个不大于0x500
的heapedit()
函数中存在堆溢出漏洞__malloc_hook()
函数位于main_arena-0x10
处__malloc_hook()
函数上方存在可用于构造FakeChunk
的内存区0x60
的chunk#0 chunk#1 chunk#2
、申请1块大小为0x400
的chunk#3
、再申请一块大小为0x60
的chunk#4
chunk#3
使其进入unsorted bin
,此时chunk#3->fd
指向main_arena
edit()
函数填充chunk#2
至chunk#3->size
show()
函数打印chunk#2
并泄露出main_arena
后计算出__malloc_hook
和LibcBase
FastBin Attack
篡改__malloc_hook
使其指向oneGadget当FreeChunk
为unsorted bin
一链表中唯一元素时,该FreeChunk->fd FreeChunk->bk
均指向main_arena+offset
,经过调试得知该offset=88;__malloc_hook = main_arena-0x10
,经过上述分析已知__malloc_hook
上方可构造FakeChunk
以劫持__malloc_hook
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
本题的重点是通过Unsorted Bin来泄露main_arena
,具体泄露方式需要参照题目的show()
函数运作方式,例如本题是以字符串来输出heap
中内容,我们只需要把内存填充至fd\bk
指针即可
举个其它show()
函数形式的例子:write(0,heapList[index]+16,*heapList[index]+8)
该情况下泄露思路如下
0x60
大小的chunk#00x40
大小的chunk#10x400
大小的chunk#2可以注意到在完成泄露准备释放chunk#2 chunk#1
时对chunk#3->heapHeader
进行了一次还原,若不作此操作,将会触发报错
*** Error in `./pwn': free(): invalid next size (fast): 0x0000000001a530f0 ***
可以注意到是在free()函数时的错误,若进入glibc源码中搜索invalid next size (fast)
可以找到触发该报错的函数是_int_free
,以下是触发该报错的检查源码
1 2 3 |
|
该检查会判断下一块chunk的大小是否小于 MINSIZE || 大于 system_mem,若符合则会报错,所以需要将下一个chunk的size修改成符合条件的值避免报错
最后于 6天前 被LeaMov编辑 ,原因: 代码传错