首页
社区
课程
招聘
[原创]2019CTF晋级赛Q1第四题单身狗分析
发表于: 2019-3-11 19:46 7480

[原创]2019CTF晋级赛Q1第四题单身狗分析

2019-3-11 19:46
7480

这里贴出个人做题分析思路,希望能帮到大家,最近在找实习,有看上的师傅帮个忙,嘿嘿!


保护全开,然后自己简单运行下,看看功能什么的。
程序运行菜单如图:

将文件,拖入IDA中分析程序逻辑


可以看到打印的提示信息,少了一句话(This is EzRak1e's first pwn),因此去看看,字符串引用,然后找到对应的函数:

可以看到有一个myinit初始化的函数,使用buf的地址来播种, 由于开了随机化,所以播种其实也是随机的。

然后看看其他的函数


直接申请一个0x20的小块,最多读入20个字节,然后存入one_0这个数组中
没有什么异常


先申请一个小块,这个小块开始的8个字节存入另外申请的0x20大小的块的地址,后0x18个字节是可写的content。然后存入小块的地址到two这个数组中
下文中我two数组记录的小块前8字节为ptr,后0x18字节为content


输入索引,然后根据数组中索引所在位置是否有指针,对其指向的内容进行编辑,然后打印内容但是这个索引没有做任何的检查,存在越界,并且Read读取没有00截断,然后又打印内容,这里可以用来泄露

也没有问题


这个根据索引,编辑索引对应的小块的content部分,以及编辑这个小块中ptr存的另外一块的内容。我当时看这个的时候就觉得有洞,因为这种情况下,如果这个小块ptr指向的地方,如果可控那其实就是任意写了,所以我觉得这里有戏,所以提前标注了


生成随机数与lucky_num取模,然后来作为下标,取对应下标的luck_dog来free掉ptr指向的块,然后将随机数与sing_num取模的结果作为sing_dog的下标,然后把one_0中的内容付给Lucky_dog中对应块的的ptr部分,从而达到拯救单身狗的目的,但是程序一开始随机数部分给我带来了困扰,后来仔细想想发现,当lucky_num和sing_num都为1的时候,结果都是0,与随机数无关,这个时候free的就是two[0]中小块的ptr指向的那块,然后将sing[0]中存的那块,存到two[0].ptr中。,这样就不用担心随机数部分了。所以我当时猜想随机数是出题人的障眼法!

至此程序的逻辑都理清楚了!
当时脑子想的是:

程序保护全开----->需要泄露信息
数据越界可以泄露——---->需要泄露点
lucky_dog edit指针可控的话,就可以实现任意写----->怎么改luckdog的ptr部分


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-3-11 19:48 被notwolf编辑 ,原因: 加一个自己帖子的链接
收藏
免费 5
支持
分享
最新回复 (1)
雪    币: 260
活跃值: (39)
能力值: ( LV9,RANK:144 )
在线值:
发帖
回帖
粉丝
2
厉害!
2019-4-4 07:37
0
游客
登录 | 注册 方可回帖
返回
//