星盟-pwn-fog

知识点

  • fopen打开文件的时候会申请一个chunk

在这里插入图片描述

  • printf输出内容过大时也会申请一个chunk
  • fclose关闭文件时,会把fopen申请的chunk释放掉

程序分析

  • 比较常规的heap题目,拥有增删写与输出

在这里插入图片描述


  • 这个函数从远端/dev/urandom文件里面读取了两个地址分别用来mmap映射,读取文件里的两个地址之后,将里面的随机数赋值进第二次mmap映射空间

在这里插入图片描述


  • add()函数,固定malloc申请0x68(104)大小,实际上chunk的size为(0x70),在提示输入内容需要多少时,出现了null off by one漏洞,当我们输入104的时候就会覆盖该chunk空间之外的一个字节
  • read_content函数功能就是read(0,ptr,size)
add创建的结构如下存贮在mmap映射里面
struct {
   

char *ptr;
int size

}

在这里插入图片描述


  • read_flag函数,打开flag文件,每读出一个值就与之前加载的随机数进行xor运算,相当于加密

在这里插入图片描述


  • write_flag就是输出加密后的flag并且关闭stream文件

思路


1. 利用null off by one 与unlink泄露libc,改写malloc_hook为one_gadget 2. 获取shell

泄露libc


  • 程序申请的是0x68,实际创建的chunk为0x70,可以写入0x68,那么最后8字节就是下一个chunk的presize位,且因为null off by one下一个chunk的size的低1字节会被覆盖为0,就会产生unlink

    • 我们申请完16个chunk,将0-5,8-13的chunk释放掉,之后我们将chunk7的内容输出,进gdb调试该printf会申请一个大小为0x410的chunk,在申请的过程中就会触发malloc_consolidate(),上面释放掉的chunk就会进行合并放入smallbin中

在这里插入图片描述

  • 接着让程序执行read_flag()函数,上面提到过,fopen会创建一个0x230的chunk,此时malloc会从第二次chunk里面进行切分返回chunk回去

在这里插入图片描述

  • 我们的目的就是让通过chunk7覆写刚刚fopen申请出来的chunk,然后执行fclose让他与第一个被合并的chunk进行unlink,那么chunk6,chunk7就会处在unsorted bin的里面,但我们又可以读取他们的内容以及改写,只要我们在申请的chunk的时候,计算一下他的位置,让切分后剩余的chunk地址为chunk7的时候,输出chunk7的内容就可以拿到main_arean+offset了,(改写的presize为0x380,null off by one 之后会把将0x230覆盖成0x200,至于多出来的chunk 0x31,是我们在申请chunk的时候事先布置进去的所以会多出来但是不重要看exp就可以知道)

在这里插入图片描述

  • 执行write_flag里面的fclose函数,0xxxxxxx038会被释放,因为pre_inuse位为0所以会进行unlink与第一个freechunk合并,此时chunk6 7就达到了在unsortedbin内部我们又可以输出和写入的目的

在这里插入图片描述

  • 接着我们申请8个chunk,自己可以计算,输出chunk7就可以拿到main_arean+offset

在这里插入图片描述

  • chunk9 chunk6是同一个地址,那么我们释放掉chunk9,然后通过程序的编号写chunk6改写他的fd指针为,malloc_hook-0x23的地址,然后改写malloc_hook为one_gadget,再申请就拿到shell了

在这里插入图片描述

后面申请的图不上了

EXP


#!/usr/bin/python2  
# -*- coding:utf-8 -*-  
  
from pwn import *  
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值