Pwnable.tw BookWriter

逆向分析

题目是典型的选单程序

题目中存在一个Page,它的内容通过malloc分配,大小由用户指定,指针放在.bss段的PageContent的指针数组中,它的大小存放在.bss段的数组中。
共为Add,View,Edit,Info四种操作,是选单程序的常见操作,不再赘述。

漏洞挖掘

漏洞有三处:

  1. 在input_string函数中存在InformationLeak

当输入字符串长度=Length(可读入最大字符个数)时,字符串结尾无终结符”\0″,可能导致Information Leak
2. edit操作中

会strlen再次计算PageSizePageSize[v1] = strlen(PageContentPtr[v1])
可能造成NextChunk的Size计算进来,从而下次再Edit可HeapOverflow修改NextChunk的Size位
同样也可能根据strlen的计算,构造特定的Content 修改PageSize。
3. 在add操作中,存在HeapOverflow

在判断Page个数时,加入Page判定条件为i<=8 && PageContentPrt[i]==NULL
在.bss段中,PageContentPtr与PageSize数组相邻,其大小均为8,而可添加9个Page,导致Index Overflow

在edit后,若通过strlen计算后,设置Page[0]的Size=0,则添加第9个Page时可修改Page[0]=&heap,从而造成了Page[0]近乎无限能力的Heap Overflow
这是add函数中判断i大小缺少一个等号造成的

漏洞利用

题目中漏洞利用的最大困难是没有free,它主要考察Top chunk 的一个小thick

所以需要tigger _int_free in sysmalloc
这就需要通过heapoverflow修改TopChunk的Size

利用思路有以下两种:

House-Of-Orange

典型的Hous-Of-Orange

Hijack main_arena topchunk

另一种思路是在wp中发现的
tigger sysmalloc free掉topchunk之后,我们可以泄露出目标的heapbase 和libcbase

通过unsorted bin attack 将page[0]的地址修改为unsortedbin(av)的地址
main_arena 中的topchunk指针的地址,这样通过edit我们能够修改main_arena
构造一个Fake main_arena 将topchunk的地址更改为malloc_hook
再次malloc时,会分配到__malloc_hook地址附近(注意构造的fake main_arena要满足要求)
malloc_hook更为了one_gadgets,从而实现spawn shell

发表评论