HITCON Training lab14 magic heap

不太清楚堆题的流程,还是按照老传统 看保护 跑一遍 ida
image-20220120141836443
image-20220120142233526
可以对heap进行申请编辑和free操作,不知道是不是我只会unlink的原因,我感觉给了这三个基本可以确定能利用unlink了。然后 IDA 在看一下bss段有没有数组存放chunk。
这个也很好找,一般在 malloc时候会有一个数组:

image-20220120142805926
image-20220120142818221

堆溢出

这也是利用unlink的一个要求,至少能溢出一字节。寻找堆溢出漏洞点也很简单,和栈溢出差不多。

输入

gets,直接读取一行,忽略 '\x00'
scanf
vscanf

输出

sprintf

字符串

strcpy,字符串复制,遇到 '\x00' 停止
strcat,字符串拼接,遇到 '\x00' 停止
bcopy

1
2
3
4
5
6
//edit函数
printf("Size of Heap : ");
read(0, buf, 8uLL);
v3 = atoi(buf);
printf("Content of heap : ");
read_input(heaparray[v1], v3);

仔细观察可以发现,这里面的 v3 是自己指定的,并不是edit chunk的大小而是自己输入任意大小的数据,存在溢出点。

思路

程序内还含有一个后门,我们可以想办法去修改 magic 的数值来getshell,也可以直接利用unlink劫持got表自己生成一个shell。

image-20220120150602803
image-20220120150744258
大概流程就是,首先申请两个堆块大小区分开防止unlink,然后利用edit功能伪造一个chunk使 fakechunk 和 第一个free的chunk unlink,返回一个可控地址

TMD!不打了修了一下午bug心态炸了