初学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一样,实现任意地址写已知地址。
由于我们只能任意修改一次的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向指定位置写堆地址。
自此,已经把其它两个指针的指向构造完毕,之后就是分配一个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域,以便之后free的时候不会报错,之后将chain指向下一个伪造House of emma的fake file地址,之后按照house of apple中的限制条件填写对应的字段 ,并且把_wide_data指向pointer_guard,这样就可以将其覆盖为我们已知的地址。
对于house of emma的构造也是根据对应的限制条件,对于file进行构造,但是对于house of emma的一些攻击构造并不是在file的结构上面构造的,所以在之后的payload书写过程中也会进一步对于之后的字段进行伪造,这里只是单独对于file需要满足的条件进行伪造。
自此就完成了整个对于House of apple和house of emma的攻击,最后需要注意的是,由于我们需要free这个伪造的chunk3,所以在他结束的地方需要填写一个伪造的chunk的size来绕过检测机制,之后只需要输入一个不在选项中的数,退出main函数就可以触发整个攻击的流程,完成读取flag,这里也是本地的环境,可以看到输出了success也就是flag的内容。
这里通过debug来更好的了解house of apple是如何实现攻击的,首先我们断点定在_IO_wstrn_overflow,在这里就是对于pointer_guard进行修改的函数,经过下图的一系列赋值,我们可以看到对应的值都已经修改为我们可以预测到的值了,方便之后进行house of emma的加密pcop的gadget。
之后就是在_IO_cookie_read进行断点,可以看到house of emma的攻击过程。
该题目很好的阐述了house of apple是如何进行利用的,并且结合了house of emma,使得对于高版本的堆利用有了更进一步的理解,这里也对house of apple进行一个总结,这个攻击对于这个题目主要的意义在一只能进行一次任意地址写已知地址,但是对于house of emma需要两次,所以可以利用house of apple,这样就相当于多增加了一次large bin attack的机会,这种攻击方式对于题目edit有限制的时候十分有效果。
io.sendlineafter(b'enter your key >>\n', str(10).encode())
add(2)#0
add(2)#1
add(1)#2
delete(2)
delete(1)
delete(0)
io.sendlineafter(b'enter your key >>\n', str(10).encode())