这篇文章过后估计就会慢下来更新了,内核一直拖着没学,再就是自己逆向能力很差所以也打算多练点题了,因为时间关系这篇文章我就少一点源码的讲解了。
house of corrosion
在large bin attack和tcache stashing unlink当中我们可以实现任意地址写入很大的数,那么我们写入这个数的作用是什么呢?
这一利用方式就是通过其他攻击方式修改global_max_fast的值为一个很大的值,这就导致我们生成的chunk为一个fast bin chunk,然而chunk在进入fast bin时是遵循一定规律的,free时会根据size进入到相应的地址,这也就促使我们可以进一步利用了。
首先这里的计算公式为:
1 | chunk size = ((target - main_arena) * 2) - 0x10 |
第一种方式也就是在fastbinY后的任意地址写入堆地址
当我们取出这个chunk时,会将fd指针留在相应的位置,所以如果存在UAF就可以更进一步的实现任意地址写任意值
下面是以上两个方法的poc可以直接在glibc2.31下使用
1 |
|
house of husk
这一堆利用主要针对的是printf的利用链,具体链子不再关心,我们的最终效果是劫持__printf_function_table
和__printf_arginfo_table
到我们堆地址,然后伪造格式化字符串对应的地址的值one_gadget
1 |
|
最终实现的就是污染掉__printf_arginfo_table但是另一个table也不能为null所以也伪造上,不过不需要弄什么数据。
具体过程大家可以去调试,这里用到了house of corrosion
house of kiwi
这一调用链通过触发__malloc_assert,调用fflush进而调用stderr中的_IO_file_jumps中的sync指针
触发的方式也会有很多种,这里常用的就是在验证top chunk中的一种,house of force这篇文章中利用这是需要绕过这一assert,可以去看一下是什么assert
gdb调试assert时发现fflush调用的是位于_IO_file_jumps
中的_IO_file_sync
指针,且观察发现RDX寄存器的值为IO_helper_jumps
指针,多次调试发现RDX始终是一个固定的地址
如果存在一个任意写,通过修改 _IO_file_jumps + 0x60
的_IO_file_sync
指针为setcontext+61
修改IO_helper_jumps + 0xA0 and 0xA8
分别为可迁移的存放有ROP的位置和ret指令的gadget位置,则可以进行栈迁移
1 |
|
可以看到就只是劫持了sync为setcontext+61然后就是通过IO_helper控制rdx进而控制其他所有寄存器,实现ROP
例题的话,后续会更一篇NULL_FxCK,因为用的Glibc为2.32所以会出现一系列问题,所以不增加这篇文章篇幅了