BUUCTF-PWN roarctf_2019_realloc_magic(tcache attack,块重叠,劫持_IO_2_1_stdout_泄露libc)

本文详细介绍了如何利用BUUCTF-PWN中的realloc魔术,特别是tcache攻击,通过内存块重叠和劫持_IO_2_1_stdout_泄露libc地址。通过一系列的内存操作,包括malloc、realloc和free,最终实现获取shell的目标。
摘要由CSDN通过智能技术生成

题目分析

在这里插入图片描述

free没有限制,可以多次free
在这里插入图片描述
使用realloc进行内存分配,没有限制大小
在这里插入图片描述
realloc的几个特殊用法(摘自官方WP)

size == 0 ,这个时候等同于free
realloc_ptr == 0 && size > 0 , 这个时候等同于malloc
malloc_usable_size(realloc_ptr) >= size, 这个时候等同于edit
malloc_usable_size(realloc_ptr) < szie, 这个时候才是malloc一块更大的内存,将原来的内容复制过去,再将原来的chunk给free掉

漏洞利用

由于本题没有show功能,因此我们要想泄露libc的地址就需要通过修改_IO_2_1_stdout_来实现
因此第一步我们需要想办法让_IO_2_1_stdout_留在tcache的fd处,这样就能分配到这个地方进行修改
过程如下

  1. 我们需要分配三个chunk0,1,2,申请大小分别为0x70,0x100,0xa0,这里只要realloc之后又realloc(0)就行(如果没有realloc(0)就接着realloc下一个是不能进入tcache的),因为chunk会进入tcache而不会和top chunk合并
  2. realloc(0x100)把chunk1申请出来,然后删除7次填满tcache,再进行一次删除就进入unsorted bin,这样main_arena+0x60就留在了fd处
  3. realloc(0x70)把chunk0申请出来,然后realloc(0x180),这样会把chunk0和chunk1合并分配给你,然后把chunk1的size改为0x41,fd的最低两个字节填充为0x?760(即_IO_2_1_stdout_的地址),这里需要爆破一位。当然,我们在调试的时候可以强行修改内存,如下

set (long long)0x55c1fee5d2e0=0x7fae9fb1d760

完成这一步之后,我们就需要把_IO_2_1_stdout_申请出来了,从而泄露libc地址,使用tcache poisoning就能分配出来,过程如下

  1. realloc(0x100)把chunk1申请出来,然后realloc(0)释放,此时因为size被我们修改为0x41导致它不会回到原来的tcache队列中,然后再次realloc(0x100)就申请到了_IO_2_1_stdout_,我们填入p64(0xfbad1887)+p64(0)*3+p8(0x58)
    这里0xfbad1887是flag位我们不用管原样填上,然后把_IO_read_xxx的部分用0填充,并把_IO_write_base的最低一个byte置为0x58,这样他就指向了_IO_2_1_stderr_+216,其中存储着 _IO_file_jumps的地址,根据它我们就能计算出libc地址
    在这里插入图片描述

得到泄露地址之后,我们还需要把tcache填满,申请不同大小的chunk然后realloc(0)释放就行,如下

realloc(0x120,'a')
realloc(0,'')
realloc(0x130,'a')
realloc(0,'')
realloc(0x170,'a')
realloc(0,'')

完成这步后,我们故伎重演,realloc(0x130)又释放,realloc(0x120)又realloc(0x260),把chunk 大小0x130的size改为0x41,把fd改为__free_hook-8,把它释放之后realloc(0x130),realloc(0)realloc(0x130,’/bin/sh\x

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值