深圳(chuan)五日游

在0ctf线上赛,我们和西电的L-team组成了G190X战队,取得了不错的成绩,虽然没进0CTF决赛,但还是拿到了萌新邀请赛的资格,冠军有机会受鹅厂资助去vegas

Day 1

下午到达深圳后去到酒店,见到了小金子,发现队伍的指导老师住的地方和选手住的地方不一样,似乎是指导老师有其他活动。。。?
晚上八点左右蓝猫师傅去领了比赛的T恤还有选手牌,抽签决定赛场位置时发现我们和0ctf决赛的队伍是同一个场地,也就是说我们很有可能和他们做的是一套题
我们入住的酒店。。。其他的没啥,就是网速太拙计了,基本属于啥都干不了的状态,晚上拿KGGG的switch玩了几把,然后早早休息了,第二天是jeopardy所以也没啥好准备的

Day 2

昨晚上主办方给每个队伍发了T恤,但是不是一定要在比赛的时候穿,所以我们还是穿的我们自己的衣服,但是在酒店餐厅吃早饭的时候发现国内dalao们好像都穿了。。
到达场地后,发现我们的位置正对着场地边上的灯光(我们的位置在场地边缘),蓝光照脸怎么玩。。。?不过后来灯光调暗了就不影响了
每个队伍的位置给了四条网线,连上需要配置静态IP,但不知为何小金子的mac老是失败,于是乎还是用了我的路由器来配置
比赛开始后放了大量的题目,web,pwn都很多,但只有一个misc,后来又放了一个crypto
大概浏览了一遍,决定先从world of fast bin下手,略微分析了下发现这个程序的逻辑和线上赛的babyheap几乎一样,不一样的是限制了可分配chunk的大小,
不能大于0x58,构造heap overlap后leak出堆地址和libc,发现远程服务器的堆地址最高位0x55~0x56之间,也就是说fastbin attack修改top chunk指针的方法还是能用,之后遍交给小金子完成了
然后我就去看python了,题给了个python命令行程序,保留了符号表,但是代码量很大,IDA分析半天没啥头绪,而且程序没有os, command, subprocess等模块,无法执行命令
交给kggg分析,看能不能搞出个文件读写来读flag,kggg试了几次给出了这样一个有效的poc

1
2
3
4
5
6
def open(fn, mode='r'):
import sys
file = sys.stdin.__class__
f=file.__new__(file)
f.__init__(fn, mode)
return f

大概原理就是,一个类的对象包含这个类的所有方法,包括对这个对象的初始化等等,这个程序允许使用sys模块,sys中有stdin,stdout,stderr这样的file object,
因此,file object的方法也都是可以使用,因此可以用那些方法创建出新的file object,然后就可以文件读写辣
之后就是尝试读flag,/home/python/flag, ./flag都是过了,服务端都没有这些文件,也就是说咱还得getshell然后去找flag
然后我的思路是写进程的mem,这样就可以修改这个已经在运行的进程的代码段来控制程序行为,但是很奇怪的是mem文件无法打开,按道理linux是允许进程写自己的mem的,后来发现是open的时候mode选错了。。。然后就是写exit@plt为shellcode,然后退出程序就可以getshell了,
后来发现我们是国内队伍FB ~_~
中间有个小插曲,说是0CTF那边LC/BC上0day做题了。。。不愧是毛子啊。。。
然后开始看upxof,这个题的程序是个带壳程序,壳是出题人手写的,运行时解壳需要输入password,不过很神奇的是这样也可以直接用linux的upx来解壳
整个题有俩洞,一个是解壳后的程序带canary的栈溢出,一个是程序解壳时输入password存在栈溢出,但是不知道咋用,分析了下觉得壳内的canary是绕不过的,
似乎是要利用解壳时的栈溢出,但是栈上没有返回地址给我们覆盖
后来想用ld.so的加载elf文件的过程,覆盖栈上的环境变量指针,让ld.so加载我们想要的东西,但是这个想法一是没实现,因为栈上的数据不能XJB改,调了半天exp都没成功,
二是我们要控制ld.so的加载,就一定会有一个之前正常执行时要加载的目标不会被加载,strace了一下程序发现没有啥东西是可以替代的。。。
第一天比赛结束,我们只解出了两个题,上一张排名,我们暂时排在第一
day2scordboard
晚上回到酒店继续分析,kggg不久后解出wannacry,我继续看upxof,小金子看那个内核pwn
苦于实在无思路,我翻了下杨坤博士的那篇掘金CTF的slide,看下有没有其他的绕canary的方法,发现里面提到了,canary是由ld.so进行初始化的
于是遍着手调试跟踪,发现环境变量数据上面一部分数据是作为canary被ld.so使用的,整个过程大概是在加载elf的时候,从栈上取出那个特定数据,
然后将其放入TLS,然后程序运行时若需要canary,就从TLS中取出来,也就是说,如果能利用解壳时的栈溢出修改那个变量,我们就可以控制canary用壳内的栈溢出做
ROP了,不过还是那个原因,栈上的内容不能瞎改,所以EXP还是很难写,而且当时调试出来的时候已经挺晚了,困的要死,直接就睡了

Day 3

到达赛场后,没多久小金子就写出了成功控制canary的poc,于是就可以做ROP辣,之后便完成了upxof,我们继续排在第一
于此同时,主办方又放了俩pwn。。。有个babystack看上去挺简单,我们就先做那个了
babystack是一个裸的栈溢出,保护全开,但是是跑在qemu下的,运行命令长这样

1
2
3
#!/bin/bash
cd `dirname $0`
exec ./qemu-x86_64 -B $((RANDOM * 4096)) ./app

google了一波-B参数,发现是guest的offset啥的。。。没怎么看清楚,当时想法是和程序的ASLR有关
当时卡了好久,但是因为程序保护全开,而且函数返回时关掉了stdin和stderr,无法再次输入,只有一次ROP的话咋绕PIE和glibc aslr。。。?
挺长一段时间我们都想着这题其实是没法做的吧。。。不过0ctf那边shellphish很快就FB了,估计是有啥点可以绕
小金子找出了qemu下调试的方法,得用gdbserver,但是非常蛋疼的是无法用vmmap查看内存映射,而且断点十分难下,也无法在程序挂起时把程序断掉
硬着头皮调试,然后改运行命令的RANDOM值为特定值来看是否和ASLR有关,但是发现一个很诡异的情况,不管我RANDOM取啥值程序的基址都是不变的
这就非常诡异了,小金子的机子因为很奇怪的原因无法调试,没办法查看是不是我机子的问题,于是尝试了一波远程,发现远程服务器的程序基址和我本地的是一样的,而且也是固定的。。。
那这个PIE开了也白开啊。。。然后想做ROP来leak libc,来看看远程的libc是不是也是基址不随机的,但是非常尴尬的是程序里控制RDI的gadget的地址有个0x0a,输入时会被截断,
而且程序里没有其他好用的gadget了
之前调试的时候发现本地的LIBC是基址固定的,但是远程不确定,所以我们无法用libc里的gadget,但是之后像刀割梗,开启PIE的程序运行时
,其程序的基址和libc的基址之间的offset是固定的,具体的值和linux内核版本相关,于是写脚本爆破远程libc基址,运气很好,没爆多久就爆出来了
之后就是做ROP,刚开始是想反弹shell,但是本地测试发现无法创建socket套接字,也无法执行/bin/sh,似乎是qemu的原因,于是转而读flag,但是本地测试的时候一直无法打开flag文件,
试了几次又好了。。。简直诡异
这就是我们做出来的最后一个pwn了,其他的pwn实在是没啥思路,然后比赛就结束了,最后我们排在第三
day3scordboard_1
day3scordboard_2
然后上一张猫哥
cat
然后就是颁奖典礼,先进行的是萌新邀请赛,我们作为季军第一个上场,然后是亚军的Nu1l和冠军AAA,冠亚季军每个队员的奖品是HHKB TYPE-S,
每个队分别是两个无刻两个有刻,无刻的比较贵,我拿到的是有刻的:P
然后作为冠军的AAA额外有0x4000(还是0x4400来着。。。?)RMB的奖金和vegas tour,可以说是非常羡慕了
之后是0ctf决赛的颁奖,每个队伍都有奖金,冠军奖金0x20000RMB,之后每一名除以2,冠军还有今年DEFCON CTF决赛的外卡
前三分别是Shellphish,217和binja,引人注目的是binja还来了个女黑阔,而且看来实力不俗,由于shellphish之前已有defcon的资格,217是作为hitcon的一员,这次比赛的外卡应该是给binja的
晚上回到酒店,酒店网络实在是蠢,只好b栈缓存清晰度最差的视频看看,然后玩玩switch,这中间猫哥出门社交,小金子回自己房间洗澡,217的队员来找我们问RCTF奖金的事情,结果他们俩的房间我进不去
只好和217的队员说奖金第二天晚宴的时候给他们

Day 4

腾讯总部赛后复盘和选手晚宴
到达鹅厂后,工作人员给发了临时通行证,进到里面发现确实能看到挺多企鹅的。。。
复盘讲了挺久的,讲下还记得的点吧

  1. 有个web题,漏洞点啥的我忘了,但是实际利用一点也不web,灰常的二进制,但是毛子们可不管,直接上0day把sqlite日穿
  2. 线上没人解出的starcrat,利用非常简单,读got然后写got,但是程序逻辑过于复杂,用到了线段树等数据结构,懂算法还是很重要的
  3. 全场没人解出(我记得是)的RSA,来自某篇paper,果然paper才是水平的提现啊。。。
  4. 我们python的解法是非预期,预期解法是用py opcode做任意代码执行,但是讲道理既然考虑到了可以文件读写,应该也能考虑到mem的读写才对
  5. 我们解出的其他pwn思路和出题人的预想差不多
  6. babystack的qemu并不是虚拟机,而是类似于一个沙盒的东西,多了个31337的syscall来限制程序行为

其他的也不大记得请了
然后吃中饭的时候,我们和binja的人在一块吃,好像有个天大的dalao搭讪binja的队员,秀了波日语,讲的还挺不错,反正比我这个整天看日漫的废宅好
GC的是,他们交谈的时候binja的“女”黑阔也说话了,怎么是个男人的声音。。。?不是女的么?WHY????完全是一张女人脸,而且是标准的黑长直
后来才知道那位是日本著名的变装黑客,纯爷们,后来小金子还和我说,你没看到他的喉结么。。。

晚宴的时候,遇到了科恩的聂博,交流了一波,小金子说我也面试过科恩,于是聂博问我具体的情况,我和他提了下,之后他就去其他地方了
然后让我惊讶的是陈良过来找我,说是要和我说下情况,目测是聂博过去和他提了下

晚上回到酒店,顶着时不时断线的网络下好了巨人和埃罗芒阿老师最新话,结果小金子在自己房间里在我下好前就看完了:P
过后蓝猫师傅的好基友AAA的melody来送香蕉给我们吃,顺便一块儿看巨人,然后被我剧透一脸23333
后来玩switch玩到十二点左右,开了火猫看震中杯LFY打OG,妈呀好长时间没见的LFY猛地一笔直接2:0,看的好tm爽

Day 5

下午飞机回福州,小金子回西安也是下午走,于是我们早上睡到饱才出的酒店,地铁还挺快,半个小时左右就到机场了,然后我们就分开各自找登机口去了

总结

这几天比赛累,但是玩的挺开心,赚了个HHKB,只是上面有TCTF的定制logo,不大好卖,作为windows用户用hhkb得适应一段时间,现在还是用的IKBC的青轴,上一张键盘做结尾吧
keyboard

文章目录
  1. 1. Day 1
  2. 2. Day 2
  3. 3. Day 3
  4. 4. Day 4
  5. 5. Day 5
  6. 6. 总结
|