UAF(Use After Free)

原理:当我们free一个堆块进入fastbin中后没有将指针置0,即使它进入了fastbin,我们依旧可以修改这个堆块的fd指针。

看例题:

image-20250714163217587

add函数是先通过malloc创建一个puts函数来打印chunk存储结构体指针,大小为8,之后创建一个大小为size的chunk存储内容

image-20250714163554567

delete函数则是free掉内容和puts函数的chunk,但是发现了很重要的一点,free之后并没有将指针置0,也就是uaf漏洞

image-20250714163516679

在ida中可以找到一个后门函数,那么这道题的思路是,add两次,note0和note1,再delete(0),delete(1),注意这时的fastbin中,大小为8的链表中的顺序是 note1->note0,fastbin中顺序为后进先出,那么当我们再次申请chunk的时候,之前后释放的note1就会先从fastbin中被申请出来,要记得我们的add中会先申请一个固定的大小为8的chunk,之后再申请我们可自定义的size大小的chunk,现在我们再来add一个note2,那么note1会先被note2的结构体指针也就是printf函数申请出来,之后如果我们自定义size为8,就会接着把note0申请出来,这时我们把内容修改为后门函数的地址,之后再调用print函数即可调用后门函数

在这之前我们要先针对每一个函数在脚本中写一个交互函数,方便运用,见exp:

image-20250714165325168

这是有后门函数的情况,如果没有后门,我们就可以将fastbin里的堆块fd指针改为malloc_hook函数,然后再把这个伪造的堆块申请出来,在把one_gadget 写进malloc_hook中,在用malloc调用one_gadget即可。exp如下:

image-20250725142635669