CTF pwn题堆入门 -- Fast bin

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
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值