CTF pwn题堆入门 – Tcache bin
CTF pwn题堆入门 – Unsorted bin
CTF pwn题堆入门 – Large bin
序言
无奈于pwn题中与堆相关的东西实在是比较多,加上到了2021年的现在,ctf比赛中一来就是堆题,还都是新版本libc,对我这种新手中的新手实在不太友好,以此写下这个系列文章,记录自己学习堆漏洞利用过程中的点滴,同时也是个总结吧。结合自己做题的理解,将堆攻击常见的手段和方式按照一定的规律记录下来。
本文章系列将分成五大块,即tcache bin --> fast bin --> unsorted bin --> small bin --> large bin。
概述
Fast bin是堆利用中最常遇见的情况,常见于libc2.23版本的pwn题中,该libc也就是Unbuntu-16的默认版本。
这里简单总结一下fast bin的性质,64位机器下属于fast bin的chunk大小在0x20 – 0x80之间,每个bin链表之间以0x10字节递增,共计7条bin链;32位机器下为0x10 – 0x40,每个bin链表之间以0x8字节递增,共计7条。注意,上面的大小均是包含了chunk头部的,每个bin是一个单链表,先进后出,所以在fast bin中只有fd指针会被使用。另外属于fast bin的chunk块被释放时不会被unlink,不会和堆块进行合并,即使紧邻Top chunk。
攻击方式
接下来介绍ctf中fast bin常见的漏洞利用和攻击方式,下面的代码示例不加说明都是基于64位的libc-2.23.so。
fast bin poisoning
这种攻击方式的目的是将堆块分配到我们想要控制的内存区域,然后通过题目所给的编辑堆块的功能来修改该内存区域。实现此种攻击方式需要在目标区域伪造出一个堆块,伪造堆块比较简单,将伪造堆块的size大小设置为要申请的chunk大小+0x10,然后将伪造堆块的地址填入对应大小的bin链中,之后正常申请堆块即可。具体细节见下面的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
long long fck[4];
printf("stack addr is %p\n", fck);
long long *ptr = malloc(0x10);
free(ptr);
fck[1] = 0x21; // same with 0x20
ptr[0] = (long long