这道题目是去年参加ISG决赛时遇到的。二进制文件是有多个漏洞,我们当时是做的栈溢出,而堆溢出一直没有研究过。正好这两天在学习堆溢出,发现这道题和0CTF的freenote十分相似,不愧是同一批人出的题目。所以,在这里简要记录下,因为思路是完全一样的
具体地,通过修改restaurant的功能,我们可以重新编辑restaurant的description。description是保存在堆上的,但在修改时,完全没有考虑新的内容会超过之前分配的大小,于是堆溢出了。与freenote一样,我们写大量的内容到堆上,来构造一系列伪chunks,再通过free
时的unlink
,来修改某个值。
在unlink
检查时,也用的是和freenote一样的方法,即找到某个存有我们伪chunk地址的地方,从那里往前3个指针作为fd
,往前2个指针作为bk
。freenote里,保存malloc
地址的结构数组是存在堆上的,所以那道题我们需要首先得到heap的地址。而pepper这道题,保存所有restaurant结构的数组是在全局变量,已经是固定位置,所以省下了这一环节。
后面的思路就完全一样了。再次修改,使得description指向free@got
,并通过读写,将system
的地址写到free@got
,最后删除时就会调用system
了。
下面是具体代码:
所以这道题用的还是unlink
。而我看217的writeup里,似乎是通过fastbin来做的,有空再研究下fastbin这种方法。