-
-
[原创] 京东-看雪-2018-春季赛-第九题- pwn- 羞耻player
-
发表于: 2018-7-2 22:17 3372
-
怎么说,感觉这题目出崩了,攻击方法很简单,leak 一个地址然后直接fastbin attack 就完事了,和题目写的一堆函数不成比例的感觉
题目给了 二进制 以及 libc, 版本 2.23,保护全开
先玩一下程序
一开始输入一个name,然后就进入主菜单,一共四个功能
经典的选单程序
add clip 操作,有四种选择,每一种选择传入的东西不同
后面的 edit,play, remove 会根据创建的类型调用对应的函数
先抛开代码怎么实现不说,手动fuzz一下,进行下面的操作直接就崩了
这样自己也是比较好定位漏洞,这里报错是double free, 那么可能是 delete 之前 的 add 或者 edit 操作有对内存 free 没有删除指针什么的
看看代码吧
main 函数如下, 后面的 内容就是 读取 option 然后进行 add edit 什么的函数调用,主要看 init_1438(); 这个函数
init_1438() 函数打印开始信息,并调用了一个 rand_heap_12B0 函数,功能上将大概就是申请随机大小的 chunk , 然后 free 掉,这样就会在 heap 上面形成大小不定的 free chunk
看一下 add 函数的实现,根据 option malloc 不同的大小对应不同的类型,之前的漏洞点在 video处理上,这里先看看video
video add 操作,
申请 0x50 大小的chunk,掉哟个 add_video_pointer 这个函数,然后 chunk[0] 的位置保存的是一个指针之类的? 直接调用函数
看一下 add_video_pointer, 自己名字起的比较怪,其实这里就是一个c++ 类,存在继承关系,类似 父类实现虚函数,子类继承多态实现这样,fvideo_203C70 就是 video 自己的函数列表,点进去就可以看到各种类的实现
各种类参考
总之 add 函数就是 分配一块内存,实例化一个video 类,指针放chunk[0] 位置,并调用里面的 add 函数
一系列的输入,主要关注 a1->frams 的部分,可以根据自己的输入创建<1024 大小的chunk
到这里还没有发现什么问题,那么问题就可能出现在 edit 里面了,看一下
edit video
edit video 实现和 add 差不多,主要关注下面这个部分
根据输入的 frams 重新分配内存,写指针,然后 直接delete 掉???
一般应该是 先delete 然后再 赋值吧,可能写反了,,
到了这里思路就清晰了,edit 的时候把分配的内存直接delete 掉了,这样调用 delete_video 就会double free 了
漏洞利用很简单,也就是文章开头说的,leak 一个内存直接fastbin attack 就完事了,但是因为初始化的时候加上了很多 大小不定的 free chunk, 所以需要处理一下
具体操作如下
完整 exp 如下