CTF pwn题堆入门 – Tcache bin
CTF pwn题堆入门 – Fast bin
CTF pwn题堆入门 – Unsorted bin
序言
无奈于pwn题中与堆相关的东西实在是比较多,加上到了2021年的现在,ctf比赛中一来就是堆题,还都是新版本libc,对我这种新手中的新手实在不太友好,以此写下这个系列文章,记录自己学习堆漏洞利用过程中的点滴,同时也是个总结吧。结合自己做题的理解,将堆攻击常见的手段和方式按照一定的规律记录下来。
本文章系列将分成五大块,即tcache bin --> fast bin --> unsorted bin --> small bin --> large bin。
概述
large bin采用双链表结构,libc-2.23版本下64位机器上,最小为0x400(1024字节),里面的chunk从头结点的fd指针开始,按大小顺序排列。不同于fast bin, small bin, unsorted bin的结构,当属于large bin的chunk被释放时,chunk中还会有fd_nextsize和bk_nextsize指针,分别指向前后第一个与本身chunk大小不同的chunk。当然也就是链表中加入了大小不同的chunk时,这两个指针才会被修改。
攻击方式
分配堆到目的地址
house of force
这里我将house of force总结在large bin的攻击方式里,当然实际上不太恰当,但是house of force的攻击原理是尝试从heap中分配一个非常大的内存,使得可以将chunk分配在高地址的libc中或者进一步让其溢出分配到低地址上的用户代码段中。所以我们可以将其归纳在这里,方便记忆和理解。
要实现house of force攻击,我们需要两点,一是修改Top chunk size为非常大的数,方便我们可以进行任意大的内存分配;二是分配大内存后,Top chunk剩余size必须大于:X(我们想要在目标地址分配的chunk大小,包括头部信息)+ MINSIZE(大小为0x20),这样才能让我们在目标地址处进一步分配X大小的chunk。具体细节见下面代码:
#include <stdio.h>
#include <stdlib.h>
// 将堆分配到这里-->bss段
char bss_var[] = "aaaaaaaa";