首页
社区
课程
招聘
[原创]看雪CTF2017秋季赛第四题club_pwn
发表于: 2017-10-30 17:59 4151

[原创]看雪CTF2017秋季赛第四题club_pwn

2017-10-30 17:59
4151

这次的第四题是一个比较比较经典的堆漏洞的利用。可能是因为出题人疏忽的原因,我找到了两个漏洞。不过两个都是堆上的漏洞。利用起来差别也不大。这里我用的经典的off-by-one的利用方法。

做pwn题的第一步逆向分析还是不能少的。因为代码不多,所以逆向分析的过程分不在赘述。重点要关注的一下几段代码。

在leave message这个函数中。注意框起来的这个比较。多读取了一个字节。因为可以分配任意大小的内存。内存中内容可控。所以可以利用。


在destory释放内存的函数中。没有清空标示正在释放的flag。也没有清空堆指针。这就导致了一个uaf。也可以通过构造堆来利用。(猜测这个是作者的本来思路)

程序利用还有一个比较头疼的地方是pie。做题碰见pie先亮半截。还好次有内置的leak,可以帮助获取elf的加载基地址

在程序开始的时候用seed的地址初始化seed。然后用其低32位作为srand的初始化值。然后做guess。不过因为每次rand的值都会返回。所以是可以爆破seed的。pie的低12位(13位?不确定)是固定的。所以只要跑破20位的seed值就可以了。实际测试下来大概几秒钟吧(i7 7700 linux虚拟机单线程跑)

有关off-by-one漏洞的利用方式其实已经有很多的文章做介绍。这里我就根据这题的情况做一个稍微的介绍。
首先是创建3块内存,大小分别为0x30,0x108,0x120。第一个内存是凑数用的,原因是忘记掉off-by-one是free哪个内存了,做完才发现不需要。
第二个内存是0x108,因为off-by-one在normal bin上比较好做(fastbin由于不立刻free和unlink,还需要 malloc_consolidate 所以不优先考虑)所以大小应该大于0x80(64位)。然后是大小必须是8的倍数且不是16的倍数。(像大小在0x101-0x108之间的内存,ptmalloc分配的时候会将下一个内存的prev size也复用起来给当前内存。而等于0x108的时候正好完全复用,这时候溢出一个字节就能覆盖下一个内存的size,主要是覆盖到最低位的inuse位。这是off-by-one利用的重点)所以就随意选了一个0x108。第三个内存因为程序逻辑大于前一个+16。所以随意写了个0x120(不是fastbin即可,理由同上)

这是现在的内存状态。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//