记一次线下决赛经历

我的第一场线下决赛是祥云杯,在吉林长春。初赛有幸和队友们一起打到了第八,拿到了决赛的资格。

线下决赛采用的是AWD+CTF模式,由于自己学的是misc方向,且是第一次打AWD,所以即使赛前准备了不少,一到比赛场上刚开始还是处于懵逼状态。

前言

首先,东北的温度是真的低,我们去的那一段时间都是-20度左右,好一点的情况-16度,坏一点的情况直接就是-24度了。不过风不是很大,室内也挺暖和的。走在路上只要不碰什么东西,也没有想象中的那么冷。但是同行的一位大佬经常拿雪球砸我,为了还击,不得不让手感受这-20度的雪。

不得不说东北的雪是真的厚,即使已经连续一周没下雪了,我们过去的时候地上还有很厚的冰雪。

在飞机上的时候就能感觉到地面上都铺满了雪。

在轻轨上的轨道上也随处可见一周前就下满的雪,还是没有化掉。

人行道上都是被踩实的冰

在东北吃晚饭的时候,发现好像没有什么比较清淡的饭菜,都是大鱼大肉的。

午饭就没有什么特别的了,都是比赛场内主办方发的KFC。

有点遗憾的就是没有去滑雪,不知道以后还有没有机会去东北玩,有机会的话一定要去滑雪。

AWD

比赛一共两天,第一天的赛制是AWD。第一次打AWD,比赛开始前就很慌。怕被大师傅们开局就打爆,然后自己都连不上靶机。在AWD比赛中我主要负责给队里的web手打辅助,监控流量,找一些简单的漏洞等等。

早上一共有两个web机两个pwn机。有一个web机开局就炸了,连续被check13轮,网站进都进不去,整站重置也没用,白白丢了好多好多分数。之后又玄学变好了,但是也没人打,且还是连不上去,甚至有时候ssh都连不上,到了12点的时候就被裁判给下了。后来得知几乎全场都是这种情况,所以导致了能稳住初试分数就可以进前十了。

然后就是另一个web机了,队友开局上了通防,被警告了一次。后来我们修改了一下通防,减少了一些功能。但是还是被裁判第二次警告了,扣了AWD百分之五的总分,有点难受。甚至之后还有第三次警告,跟裁判裁决之后发现了是裁判的问题,就没有第三次警告了,不然估计AWD直接要最后一名了。

队友挂上waf之后,我刚开始删了点后门,然后就开始了一整天枯燥无味的流量监控生活。发现异常流量就测试一下,然后抄个流量打全场,并把流量给队友,让他修复漏洞。由于自己太菜了,这次比赛并没有干太多事,主要就在监控流量,还好队友们很强被带飞了。

下午场就是把一直被全场check的web机下了,然后又新上了两个pwn机。场上变成了一web四pwn的局面。咱队里就是两个web一个机,一个pwn爷爷四个机。听说还有队伍是三个web手,估计直接就暴毙了。

最后成绩也还挺满意的,由于队内三人AWD经验几乎都是没有的,所以刚开始我们想着尽量不要倒数后五名,可最后排名也拿了个第15,超出预期了。

CTF

第二天是CTF夺旗模式,以为终于是自己能够发挥点作用的时候了,没想到又出了点情况。早上放了两道pwn,其他四个方向各放了一道。

然后我就一直在做misc,但是又一直做不出来。想着到了中午十二点放新题的时候在看看新题调整下思路吧。没想到中午十二点到了,又放了两道pwn,一道密码,一道逆向,web和misc始终只有一道。咱队内一个web手,一个misc手表示体验很棒,想打出题人。祥云杯获名祥pwn杯。被折磨了整整一天之后,最终不出所料的我又是0输出。(misc题wp放在文章最后)

这次题目设置的也比较难,全场最终有十个队伍是0解的。大家都是初赛排名靠前的队伍,最终有三分之一0解,可想而知难度还是不小的。我们队在最后40分钟的时候,pwn爷爷拿下了一道pwn,也是全场的最后一解,最终使我们CTF模式排在了第20名。

最终的分数换算是AWD分数/AWD全场第一分数*600+CTF分数/CTF全场第一分数*400。由于我们AWD被罚了5%的分数,最终换算分是全场第21名,没罚分的话估计能在第15名左右,不过也没办法,下次继续努力。不得不说r3kapig是真的强,两场比赛都是第一,且和第二的差距很大,第一名1000分,第二名就变成了600多分了。这个特等奖拿的真的实至名归了,20万奖金也是着实羡慕。

MISC题wp

链接:https://pan.baidu.com/s/13EwaItglDX8ihPf65oMryg
提取码:skyh

开局一张图,开启misc快乐之旅。

- Hey bro! Hint is here, come on~!
- Have u found the secret in color?
- If not, maybe u need to understand the nature of color.
- What r u waiting for? Hurry up!

---

+ Let's go to the amusement park!
+ I bought three tickets. 
+ There are three adjacent seats. They are E, F, and G.
+ Which seat would you like to take?
+ G? Yes, I think the seat G is the best!
+ Okay! And now, we shall set off!

看题目描述就能很明显的发现,G的含义应该就是RGB中的绿色,所以信息应该就是隐藏在图片的G通道中了。

还有一个flag.crypto文件,密码就藏在图片中了。

图片是560*560像素,每个色块28*28,一共有400个色块。由于色块交界处颜色有出入,应该是羽化的问题,所以提取色块中间的颜色。

from PIL import Image,ImageDraw
pic = Image.open("secret.png")
a,b = pic.size
for y in range(10,b,28):
	for x in range(10,a,28):
		print(pic.getpixel((x,y)))

提取后得到所有色块的颜色数据:(由于文章篇幅限制,以下就显示一段数据)

(148, 115, 101)
(23, 104, 240)
(220, 186, 205)
(23, 104, 240)
(134, 165, 104)
(93, 240, 150)
(101, 75, 132)
(101, 75, 132)
(26, 193, 68)
(185, 53, 243)
(114, 114, 114)
(128, 159, 80)
(23, 101, 34)
(160, 69, 88)
(23, 104, 240)
(61, 71, 61)
(240, 89, 171)
(160, 69, 88)
(160, 69, 88)
(23, 116, 34)
(200, 105, 217)
(23, 116, 34)
(227, 174, 14)
(106, 58, 216)
(23, 8, 95)
(101, 75, 132)
(148, 115, 101)
(23, 101, 34)
(227, 49, 26)
(160, 225, 60)
(79, 24, 16)
(152, 84, 118)
(101, 75, 132)
(23, 116, 34)
(178, 180, 120)
(160, 69, 88)
(23, 101, 34)
(233, 64, 58)
(160, 69, 88)
(142, 31, 99)
(23, 104, 240)
(92, 232, 59)
(148, 115, 101)
(106, 58, 216)
(148, 115, 101)
(114, 114, 114)
(23, 101, 34)
(23, 104, 240)
(23, 116, 34)
(23, 101, 34)
(195, 179, 100)

通过观察可知里面有很多相同的色块,肯定和这些相同的色块有关系。由于题目已经说明了是G通道隐写,所以其实可以把G通道数据单独拿出来,脚本如下:

from PIL import Image,ImageDraw
pic = Image.open("secret.png")
a,b = pic.size
list1 = []
for y in range(10,b,28):
	for x in range(10,a,28):
		list1.append(hex(pic.getpixel((x,y))[1])[2:])
print(list1)

然后就能获取400个色块的十六进制数了:

['ed', '47', 'e0', '65', '37', '36', '74', '72', '65', '92', '54', '72', '40', '97', '3a', '73', '69', '4b', 'bf', '47', '60', '3a', 'bc', '59', '68', '74',
'65', '59', '33', '45', '47', '33', 'b0', '21', '0', '47', '54', '35', '40', 'b4', '45', '74', '72', '73', 'cf', '65', '53', '33', '62', '40', '3a', '4b', '74', 'f1', 'a7', 'b1', '9c', '7e', 'ff', '39', '3a', '4b', '4b', '9a', '69', '73', '65', '59', '65', '5d', '49', '59', '74', '7e', '73', '68', 'b', '47', 'fb', '47', '40', '77', '65', '16', '72', '69', '45', '33', '59', 'af', '72', '8', '1f', '68', '69', 'cf', 'bf', 'b1', '68', '69', '3f', '74', '84', '40', '3a',
'73', '3a', 'b3', 'b', '54', '73', '1c', 'de', '74', 'e0', 'ec', '92', '54', '54', '55', '9', '1f', '47', '6d', '74', '74', '47', 'a6', '68', 'a4', '7e', '33', '7b', '65', '8e', '59', '72', '74', '71', '45', '65', '74', '65', '8d', '65', '7e', '33', '3a', '74', '65', '2b', 'f6', '40', '69', '74', '59', '47', '68', '69', 'ae', '54', '47', 'cd', '3a', '45', '33', '3a', '7e', '59', '72', '1b', '68', '14', '72', '4e', '8d', '4b', '73', '74', '4b', 'd0', '7e', '7e', '68', '4b', '4b', '72', '7e', 'bf', 'b9', '59', '55', '68', 'b7', '65', '4b', '7e', '64', '59', '33', '73', '54', '4b', '45', '47', '72', '73', '47', '68', '65',
'68', '59', '4b', '68', '45', '45', '72', 'e0', 'cc', '1c', '15', '67', '92', '44', '3a', '4b', '59', '45', '68', '4b', '33', '74', '72', '40', '74', '68', 'f6', '40', '7e', 'bc', '68', '69', '33', 'fc', '3a', '40', '40', '45', '33', '59', '35', '30', '4b', 'cf', '33', '74', '73', '73', 'e2', 'eb', '74', '8f', 'a5', '72', '54', '45', '68', '47', '73', '33', '69', '45', '48', '4b', '74', '59', '59', '10', 'b8', 'aa', '65', 'a8', '80', '9', '4b', '42', '54', '66', '38', '68', '3a', '74', '98', '47', '69', '4b', '81', '73', '69', '34', '69', '69', '71', 'ec', '3a', '47', '59', '45', '65', '38', '73', '7d', '45', '33', '69', 'eb', '59', '40', '40', '69', '61', '45', '69', '3a', '65', 'f0', 'dc', '95', '7e', '3a', '6b', '2d', '70', '4b', '61', '54', '45', '68', '59', '74', '69',
'68', '98', '73', '54', '59', '7a', '65', '5', '69', '68', 'ba', '68', 'a5', 'f0', '4b', '4b', 'c1', '35', '72', '9f', '65', '45', '68', '47', '59', '45', '45', '74', '69', '74', 'ae', '3a', '8', '4b', '73', '65', '31', 'e1', '18', '54', '4b', '74', 'b4', '45', '65', '40', '45', '1f', '68', 'e8', '73', '3a', '73', '72', '65', '68', '74', '65', 'b3']

最后用字典保存,将列表内的数据相同次数提取出来。

from PIL import Image,ImageDraw
pic = Image.open("secret.png")
a,b = pic.size
list1 = []
for y in range(10,b,28):
	for x in range(10,a,28):
		list1.append(hex(pic.getpixel((x,y))[1])[2:])
#print(list1)

dic1 = {}
for i in list1:
	dic1[i] = dic1.get(i,0)+1
	
print(dic1)
{'ed': 1, '47': 16, 'e0': 3, '65': 23, '37': 1, '36': 1, '74': 25, '72': 15, '92': 3, '54': 12, '40': 13, '97': 1, '3a': 17, '73': 18, '69': 19, '4b': 22, 'bf': 3, '60': 1, 'bc': 2, '59': 20, '68': 24, '33': 14, '45': 21, 'b0': 1, '21': 1, '0': 1, '35': 3, 'b4': 2, 'cf': 3, '53': 1, '62': 1, 'f1': 1, 'a7': 1, 'b1': 2, '9c': 1, '7e': 11, 'ff': 1, '39': 1, '9a': 1, '5d': 1, '49': 1, 'b': 2, 'fb': 1, '77': 1, '16': 1, 'af': 1, '8': 2, '1f': 3, '3f': 1, '84': 1, 'b3': 2, '1c': 2, 'de': 1, 'ec': 2, '55': 2, '9': 2, '6d': 1, 'a6': 1, 'a4': 1, '7b': 1, '8e': 1, '71': 2, '8d': 2, '2b': 1, 'f6': 2, 'ae': 2, 'cd': 1, '1b': 1, '14': 1, '4e': 1, 'd0': 1, 'b9': 1, 'b7': 1, '64': 1, 'cc': 1, '15': 1, '67': 1, '44': 1, 'fc': 1, '30': 1, 'e2': 1, 'eb': 2, '8f': 1, 'a5': 2, '48': 1, '10': 1, 'b8': 1, 'aa': 1, 'a8': 1, '80': 1, '42': 1, '66': 1, '38': 2, '98': 2, '81': 1, '34': 1, '7d': 1, '61': 2, 'f0': 2, 'dc': 1, '95': 1, '6b': 1, '2d': 1, '70': 1, '7a': 1, '5': 1, 'ba': 1, 'c1': 1, '9f': 1, '31': 1, 'e1': 1, '18': 1, 'e8': 1}

然后从多到少排序,并将十六进制数asc码转码即可得到key。脚本一把梭:

from PIL import Image,ImageDraw
pic = Image.open("secret.png")
a,b = pic.size
list1 = []
for y in range(10,b,28):
	for x in range(10,a,28):
		list1.append(hex(pic.getpixel((x,y))[1])[2:])
#print(list1)

dic1 = {}
for i in list1:
	dic1[i] = dic1.get(i,0)+1
	
#print(dic1)

result = sorted(dic1.items(),key=lambda x: x[1] ,reverse=True)
# print(result)
for a in result:
	print(chr(int(a[0],16)),end='')

最终解得答案:

theKEYis:Gr3@T~à¿5ϼ´ ³ìU    qö®ë¥8í76`°! Sbñ§ÿ9]Iûw¯?
                                                      Þm¦¤{+Í?Nй·dÌgDü0âH¸ª¨Bf4}Ük-pz║ºÁè

有效字符只有前15位,这也是我没有解出来的关键,我以为所有数据都是有用的,就一直在想着异或啥的,然后就卡了一整天,也被折磨了一整天。感谢或或师傅(L1near)在比赛结束后跟我说了我解法,最终才有此篇wp。

获得加密文件key:Gr3@T~

flag.txt内数据:

💙📟😽😂🍳✉💞📟💞🍸🌀📑🐮🏉😔🐶🌀🍨👈🌴🚅🌼🍸💙💾📥🍑🍑💇

利用html解码一下

得到emoji,显然是emoji密码。

?????✉???????????????????????

emoji密码爆破工具:

链接:https://pan.baidu.com/s/1cyeNbP-ML8XTzXcJuwaJ2w
提取码:y7r6

这里需要用到emoji密码爆破,爆破完即可得到flag:

发表评论