首页
社区
课程
招聘
[原创]CTF2017 第四题 club_pwn writeup
发表于: 2017-11-1 11:19 7851

[原创]CTF2017 第四题 club_pwn writeup

2017-11-1 11:19
7851

这是一道典型的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的基地址


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 222
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
其实随机数可以直接爆破
seed的参数是unsigned  int
开了pie后后12bit是固定的  所以只要爆破(1<<20)次就可以了
2017-11-1 13:44
0
雪    币: 848
活跃值: (135)
能力值: ( LV13,RANK:430 )
在线值:
发帖
回帖
粉丝
3
plusls 其实随机数可以直接爆破 seed的参数是unsigned int 开了pie后后12bit是固定的 所以只要爆破(1
那不是比z3要慢吗……1<<20还还是挺大的啊……
2017-11-2 23:29
0
雪    币: 562
活跃值: (4347)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
看了几遍头晕,羡慕懂漏洞的~
2017-11-3 15:17
0
游客
登录 | 注册 方可回帖
返回
//