-
-
[原创]看雪.京东 2018CTF 第九题 PWN-羞耻player Writeup
-
发表于: 2018-7-4 03:22 3275
-
后面有时间再修改更新下,里面可能有错误。
这是一个堆漏洞的利用题,c++编写。漏洞点有三处:一个逻辑错误导致的UAF:新申请的堆先赋值给了指针,再释放指针指向的旧堆,实际是释放了新申请的堆,释放与赋值的顺序颠倒出现了悬挂指针,UAF得以实现,但是由于PIE,不能单独直接利用;二是没有检查输入的表示大小的数为负数,导致heap overfolw;三是打印函数多打印一个字节,可以按字节泄露信息。
##程序分析
先checksec:
程序运行情况如下:
程序模拟了音视频播放器,包括添加、修改、播放、删除包括视频、音频及其相关信息的功能,而且都是通过类完成编写,实际功能类都继承于同一个父类,父类定义大致如下:
然后定义了4个子类Metadata
,SubClip
,AudioClip
和VideoClip
,vtable
在偏移203BD0
处。
漏洞点在VideoClip
的clip_edit
函数中:
信息泄露可以利用播放功能。VideoClip
和AudioClip
的clip_play
函数能打印经异或编码后的出信息:
在play
这里,也有问题,多打印了一个字节。
程序用到的数据结构如下:
其中的p_method
指向各自的vtable
。
另外程序开始还申请了256随机大小的堆并进行了随机释放。
先跑空bins,然后利用fastbin进行堆地址的泄露,再利用small bin进行libc基址的泄露。
然后进行堆喷射将one_gadget
地址有效覆盖堆。
再结合SubClip
的clip_add
功能改写vtable
指针。SubClip
的clip_add
功能中,除了能读取负数的大小外,其还有复制已经存在的subtitle内容的功能。代码如下:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-7-4 12:00
被poyoten编辑
,原因: 前后多次写得有出入
赞赏
他的文章
看原图
赞赏
雪币:
留言: