-
-
[原创] 第九题 PWN-羞耻Player WriteUp
-
发表于: 2018-7-2 18:32 3318
-
程序用C++编写,写了一个抽象类Clip,派生出AudioClip,VideoClip,SubtitleClip和MetadataClip四个类。
虚表中有四个函数,分别对应add, edit, remove, play四个操作,具体的函数由不同的派生类不同实现。
IDA标一下数据成员,大概是这样:
标完结构体和函数,看一下代码,发现以下几个可能的漏洞:
这里没有对输入的index进行边界检查,只要该处的值非零就按指针跳两级过去执行,故可以做对象和虚表伪造来实现控制流劫持。
VideoClip的编辑函数,这里写了一个非常魔性的漏洞,先申请了一块内存,然后直接free掉,然后再往里面写入数据。可以使用一般的Use After Free利用方法,泄露地址或做Fastbin Attack或Unlink。
综合这两个漏洞,就有以下的攻击方法:
程序有一个难点:
分配了256个大小随机的堆块,然后随机free掉一些堆块,让它们进入bins,造成之后的堆内存分布不整齐。
解决的方案是,事先分配很多个需要用到的大小,来清空对应大小的bins = =
利用use after free泄露地址,先准备好一个free掉的second=1024的VideoClip,然后创建3个256大小的VideoClip,free 第一个和第二个,再Play 1024大小的VideoClip,就能泄露出需要的三个地址。(libc和堆地址从双链表中泄露,程序基址从对象中的虚表地址泄露)
拿到地址之后,计算好下一堆块地址、偏移量和one gadget地址,new一个VideoClip,放上指向伪造虚表的二级指针。利用任意偏移执行触发,得到一个shell。
exp:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)