初学house of apple,学习了roderick01师傅的文章内容,在看House of apple(1)(文章链接)时看到有练习题目pwn_oneday,但是在跟着exp复现对应攻击时发现对于exp也没有过多的解释,这里也是对该题目的exp进行详细的分析,也是更进一步的了解如何利用house of apple的攻击。 对于该题目大佬的攻击主要是利用了house of apple和house of emma的组合攻击,最终实现了orw读取flag,在这里主要困难的点在于这里的edit也就是修改chunk中内容的步骤只能进行一次,所以没办法直接利用house of emma(因为house of emma需要两次large bin attack,首先攻击pointer_guard将其修改为已知的内容,第二次攻击是攻击_IO_list_all,将其进行挟持到堆上,这样就可以控制FILE的结构,实现最终的攻击效果),因此由于本题只能进行一次修改,没办法构造出两次写,所以想到了利用house of apple,首先将_IO_list_all上的值覆盖为堆上的值,之后利用house of apple可以实现对于pointer_guard进行覆盖为一个已知的值,这样在利用chain的值指向之后伪造的第二个file结构,对于这个结构可以实现house of emma的攻击方式,最终实现orw攻击 讲完了大致的攻击思路,简单介绍以下house of apple的攻击原理,简单来说就是利用了_IO_wstrn_overflow这个函数,通过伪造file的结构,这个函数可以覆盖传入fp->_wide_data上的地址覆盖为可以知道的堆地址,攻击效果和进行一次large bin attack一样,实现任意地址写已知地址。 这里主要是利用了在fflush(stderr),这个函数会稳定的调用_IO_file_jumps中的sync,如果我们吧这个指针伪造为之前提到过的pcop的Gadget也就是:我们就可以实现控制rdx,并且call对应的函数,这里一般为setcontext + 61,但是这篇文章是将其call mprotect函数,这样就可以增加可执行权限,之后直接执行orw的shellcode就可以了,原理是一样的。 对于这个题目,首先分析以下对应的功能,主要分为add,delete,edit,show四个功能。 在分析add的实现之前需要说明的是,add的chunk大小是固定的,在main函数的时候需要输入一个key值,在之后add的chunk大小只能是key,key + 0x10,2 * key这三个大小的chunk。 由于我们只能任意修改一次的chunk内容,所以如果我们想要即进行large bin attack攻击形成任意地址写一个堆地址,又在这个堆地址内完成对于fake file的构造,就需要我们完成以下的chunk构造,这里借用了roderick01师傅的图(这个图有个小问题,应该chunk的起始为bk这里)。只有这样我们才可以在伪造bk_nextsize的同时修改size位并且构造fakechunk实现House of apple和house of emma的攻击。 因此为了满足这个条件,我们需要对于堆块进行构造,这里roderick01大佬选择的key的值为0xa,这里需要注意对于key大小的选择,需要满足乘以0x110之后的size分配出来的chunk大小位于large bin中,并且chunk1和chunk3的大小需要位于同一个Bins中,这样才可以利用large bin attack向指定位置写堆地址。 之后就是讲解一下如何进行堆风水的排布,这里利用了以下两个公式,我们将x设置为key + 0x10,把y设置为key + 0x20,把z设置为2 * key + 0x10,通过这个恒等式我们可以发现如果我们想构造出上述的示意图效果,只需要分配2个x,这样下一个chunk的指针指向的就是示意图中的chunk2,如果分配两个y下一次分配chunk的指针就会指向chunk3,如果分配一个z,下一个chunk的指针就会指向chunk1。自此就完成了对于key的分配以及一些chunk构造的分析,之后就是对于函数的四个功能进行分析。2∗y−z=2∗key+0x40−2∗key−0x10=0x302 * y - z = 2 * key + 0x40 - 2 * key - 0x10 = 0x302∗y−z=2∗key+0x40−2∗key−0x10=0x302∗y−2∗x=2∗key+0x40−2∗key−0x20=0x202 * y - 2 * x = 2 *key + 0x40 - 2 * key - 0x20 = 0x202∗y−2∗x=2∗key+0x40−2∗key−0x20=0x20 首先是add函数,这里之前也说过,主要就是三个选项,这里的key值也是固定的,所以只能分配key,key + 0x10,2 * key这三个大小的chunk。 之后就是delete函数,这个函数也是存在悬空指针,存在uaf漏洞 edit函数,这里只能修改一次chunk的内容,由于没有检查是否该chunk已经被释放,所以可以利用uaf来进行攻击 最后也就是show函数,这里也就是泄露Heap和libc基地址的,也是只有一次机会。 对于这个题目,之前已经讲述了怎么来构造示意图中的形式,所以首先就是要预留指向对应位置的指针,这里首先申请两个y的chunk和一个x的chunk,这样2这个指针指向的就是示意图中的chunk3,之后把这三个chunk进行删除,由于都是Unsortedbin,删除之后会进行合并,导致和没有分配chunk之前一样 之后就是分配两个x的chunk,并且泄露出heap和libc的基地址,这里的代码实现主要是通过分配四个x的chunk,这样5这个指针就会指向示意图中的chunk2,之后删除3和5这两个chunk,由于他们是unsortedbin,所以我们可以一次性的泄露出libc和heap的基地址,之后就是将4和6删除,继续恢复堆为初始化的状态。 自此,已经把其它两个指针的指向构造完毕,之后就是分配一个z的chunk,这样8这个指针就可以指向示意图中chunk1这个chunk了。之后将这个8指向的chunk删掉在申请一个最大的chunk,使得8指向的chunk进入large bin,这样就完成了对于chunk的所有构造,之后就是进行large bin attack,house of apple和house of emma攻击了 之后就是对于两个进行house of apple和house of emma的fake file伪造,这里利用了pwncli的IO_FILE_plus_struct(),这里用pwntools的FileStructure的话没有_mode的字段,所以选择了这个,伪造的字段首先利用House of apple攻击了pointer_guard,这里设置_IO_read_ptr为0xa81是为了伪造chunk3的size域,以便之后
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-279933.htm
[原创]pwn_oneday题目解析
184 浏览
3 回复
感谢分享
感谢分享
感谢分享,学习了