-
-
[原创]CTF2017 第四题 club_pwn writeup
-
发表于:
2017-11-1 11:19
7851
-
[原创]CTF2017 第四题 club_pwn writeup
这是一道典型的CTF pwn菜单题,先用pwn checksec看一眼有什么保护
这里主要会妨碍到我们的是开启了PIE,但是RELRO是partial,所以.got.plt 可写
下面看一眼程序的主要流程
可以看出主要有以下几个功能,除了guess random number 以外都和box有关
开IDA
这里我们注意到srand seed了seed这个指针的地址
get_box
其中read_int会读入我们的输入然后执行atoi
这里可以看出我们有一个box是否被创建过的检查 is_box_created,估计是防止UAF用到的,不过这个检查写的有问题,之后我们再看
get_box主要会让你选择哪个box,然后malloc多大的一个box,这里有一个限制,就是每个box的大小是从小到大排列的,其中最小不能小于 8 + 16, 最大不能大于 0x1000-16,这个限制存储在0x202090
可以看到8 和 0x1000 之间有5个0,存储我们每个box的大小
destroy_box
除了index的检查,还有两个检查,一个是和get_box中一样的is_box_created,还有一个是一个global的数组,表示该box能不能被destroy,查看该数组可得知只有box 2,3可以被free。同时这里出现了一个bug,那就是is_box_created这个flag在box被free后没有被清0,这代表我们不能重新在这个index malloc一个box,但我们可以free这个box两次,造成double free
leave_message
这里还有一个bug,read的时候因为用的是 i <= box_sizes[v3],所以会出现一个off-by-one的bug,虽然这个bug也可以用,但是double free用起来更简单一些……这个bug的用法主要可以shrink chunk以后构造overlapping chunk然后这样就可控制其中一个的chunk 头。或者也可以用house of einherjar来构造overlapping chunk,原理差不多,再次不做过多叙述
由于之前is_box_created在destroy时没有被清0,造成我们可以做出UAF,覆盖被free的chunk的FD 和 BK,从而使用unlink达成任意读写(和看雪年中CTF中的那道double free题 (第四题) 的其中一个非预期解很像),unlink的手法可参照以下链接
https://bbs.pediy.com/thread-218395.htm
show_message
同样是is_box_created的bug,我们可以leak出已经free过的chunk的fd和bk,如果该chunk是unsorted bin或者small bin,我们就可以得到main_arena的地址,继而得到libc的基地址
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!