混入西工大,打CTF上大分!https://mp.weixin.qq.com/s/oGf660AaxTQS_10qUoUaow我是此文章的原作者,首发于微信公众号。
近日朋友们升入大学,纷纷购置笔记本电脑,我的消息列表就热闹了起来,但也无非安装软件、编程入门云云。
小刘找到了我
发现是西工大信安协会举办的密码学比赛,跟他简单解释了比赛要求后也没太多管。
没想到,两天后他又来找我了。
此时比赛刚刚开始
于是我注册进入比赛系统,没想到还能混进排行榜。
下面是WriteUp环节。
Section 1 签到 9.15 10:38:44
按照操作,获得答案。
Section 1 小猪别跑 9.15 10:40:11
BABBAAABAAABABBABBBABABABAABAAAAAABAAAAAAAABAABBBAABBAB
根据特征搜索,判断是培根密码。使用z,得出答案。
Section 2 我是福瑞兽 9.15 10:45:49
~呜嗷嗷嗷嗷呜啊嗷啊呜呜嗷呜呜~嗷嗷~啊嗷啊呜嗷嗷~嗷~嗷~呜呜嗷呜啊嗷嗷嗷呜啊呜~啊呜嗷呜呜啊啊啊~啊嗷啊呜~呜啊~~嗷~呜嗷~~啊嗷嗷嗷呜呜~啊嗷呜嗷呜呜啊~呜啊啊嗷啊呜~啊呜~~嗷~呜嗷呜嗷嗷嗷嗷嗷呜啊嗷~啊呜嗷呜呜啊呜啊啊啊嗷啊呜~~啊啊~嗷~呜嗷啊呜呜嗷嗷嗷呜啊呜啊嗷呜嗷呜呜~呜啊呜啊嗷啊呜嗷呜~呜~嗷~呜呜呜啊嗷嗷嗷嗷呜呜呜嗷啊呜嗷呜呜~呜呜嗷啊
判断为兽语加密,使用http://hi.pcmoe.net/roar.html,得出答案。
Section 1 百家姓 9.15 10:51:15
郑郑郑窦郑钱郑王王水吴王郑冯郑钱王周吴苏李钱王李吴苏王陈李赵王吴王孙吴苏郑云李周郑章郑吴李苏王章
判断为百家姓暗号,使用http://anhao.tlrkl.top/,解出以下文本:
magnet:?xt=urn:btih:666C61677B576861745F31735F793075725F6E346D653F7D
判断为磁力链接,打开下载工具下载,提示“Invalid info_hash”,因此不是磁力链接。尝试十六进制转换为ASCII字符串,使用https://www.sojson.com/hexadecimal.html,得出答案。
Section 2 PAPER 9.15 12:12:42
下载文件,得到1.png、2.png如图。
利用PS,将碎纸片拼好,发现花的根茎能与纸片上字母的位置对应。
根据“营养往上供给”,判断字符串为“SIKMB”(但不应该是B先出土而排前面吗),使用https://www.sojson.com/md5/,得出答案。
Section 4 Notes 9.15 12:15:05
‖‖‖♬♩‖‖‖¶♯‖‖‖♬♭‖‖‖♬♫‖‖‖♫♪♯♭♪§♯♯♪♭♯♭§♪♫♬‖♩♪§∮‖§♪♬♪♬§♪♬♪♬♯‖§‖∮‖‖‖♫♫♪==
根据特征搜索,判断为音符加密。使用https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyue,得出答案。
Section 1 BASE233 9.15 15:59:48
下载文件,得到base23.cpp、output.txt如下。
#include <iostream>
#include <string>
using namespace std;
static const string base233_chars = "0B7UDomA2ZtJaOFdje43G9zRX1HTnfkhwqElc{WuLPI}bsypCY5SKrQN8gMiVvx6";
string base233_encode(unsigned char const *bytes_to_encode, unsigned int in_len)
{
string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--)
{
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3)
{
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; (i < 4); i++)
ret += base233_chars[char_array_4[i]];
i = 0;
}
}
if (i)
{
for (j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; (j < i + 1); j++)
ret += base233_chars[char_array_4[j]];
while ((i++ < 3))
ret += '=';
}
return ret;
}
int main()
{
const string s = "xxx";
string encoded = base233_encode(reinterpret_cast<const unsigned char *>(s.c_str()), s.length());
cout << encoded << endl;
return 0;
}
base23.cpp
1WYq1Nb5aSOhTz9qTuOhTmvbhj==
output.txt
虽然看不太懂,但原理应该和Base64相似,只不过编码后的文本使用的字符集是被打乱的。用我拙劣的前端水平把这些替换成正常的Base64字符集:
运行,得到正常的Base64字符串,使用https://www.sojson.com/base64.html,得出答案。
9.15 16:50:10
Section 2 你会求逆元吗?
下载文件,得到main.py如下。
flag = 'xxx'
charsets = 'abcdefghijklmnopqrstuvwxyz0123456789_{-},()/!@#$%^&*+=|<>?'
def encode(plain_text, a, b, m):
cipher_text = ''
for i in plain_text:
if i in charsets:
addr = charsets.find(i)
cipher_text += charsets[(a*addr+b) % m]
else:
cipher_text += i
print(cipher_text)
encode(flag,41,47,58)
# cipher_text = 'Auu+aspC+y!s%p+5ps$5@'
虽然这个也看不太懂,但应该也是对文本做了映射,先将源代码的flag设为charsets的内容,执行,得到如下字符串:
$4n|{ud!1k*8ra(yh%5o<-ve@2l+9sb)zi^6p>}wf#3m=_tc/0j&7q?,xg
搬出自己上一题刚刚写的工具,秒杀!
大写字母似乎未经过映射,照搬下来,得到答案。
Section 2 协会招新 9.15 17:02:08
下载文件,得到招新宣传.pdf如下:
全选,复制粘贴到记事本,发现flag藏在几段文本的末尾。
西北工业大学信息安全协会招新宣传
协会简介
西北工业大学信息安全协会(NPUSEC)是于 2014 年成立的技术型学生社团,
致力于在学生群体中普及和交流信息安全技术,成员为不同学院不同专业的信息
安全爱好者。成立八年来,已成长为一个初具规模的学生组织,并且与信息中心
合作,共同维护校内网络安全。flag{
协会组织开展技术分享会,涉及对基础知识的培训以及对 web 渗透测试和逆
向工程等信息安全技术的交流。协会成员组建多支 CTF 团队,积极参加国内各类
CTF 比赛和各类安全方向的项目开发。W3lc0me_
信息安全协会是网络空间安全学院唯一一个下属社团,学院坚持“厚基础、
强系统、重实战、拓交叉”的培养模式,大力支持学生广泛参加具有影响力的网
络安全竞赛与实战演练活动中,在诸多国家级网安竞赛中取得了突破性佳绩,从
实战演练中锻炼和提升了学生的动手能力,着力培养实战型网安专业人才。
在信安协会,你可以
- 与志同道合的师傅一起学习、一起玩耍 T0_NP
- 与协会成员组队参与国内外各类 CTF 比赛,斩获大奖
- 了解前沿的信息安全技术,学习各类最新 0Day 与渗透姿势
- 参与各类网络安全演练活动,提升实战能力,获得丰厚奖励
- 安全大厂实习机会、行业顶尖专家讲座分享 USEC}
- 和洪师傅下棋
QQ 群
307775629
拼凑起来,得到答案。
Section 3 图书馆的水下 9.15 17:13:30
下载文件,得到1.png如下。
提示湖下有东西,并且照片一般不用png格式。经搜索,猜测png尺寸被修改。
框住的部分依次为PNG的宽度和高度
使用https://hexed.it/,将图片的高度从0000 08C8修改为0000 0FC8,得到被隐藏的答案。
Section 3 隐约雷鸣 9.15 17:42:03
压缩包格式选择了RAR(与其他题目不同),并且提示需要使用WinRAR打开(可能是考虑到电脑不自带RAR解压软件)。下载文件,由于我电脑装的是7-Zip软件,于是秒杀了。
交替数据流检测阳性,就是使用NTFS文件系统中的Alternate Data Streams技术,把一个文件当成另一个文件的影子塞进去,表面只有一个文件,实际上还有隐藏的文件,需要使用“start 原文件名:隐藏文件名”打开。使用7-Zip直接打开flag.txt:hide.txt(WinRAR不会显示,并且会把正常文件连带隐藏文件一同解压出去),得到答案。
Section 2 隐藏在主播背后的秘密 9.15 19:24:55
打开网页,等够时长,显示如下文本。
打开开发工具,发现“B站”两个字中塞入了大量零宽字符。
B站关注"快乐滋崩在这里"啊喵( •̀ ω •́ )✧!
经过搜索,查到这种加密方式https://zhuanlan.zhihu.com/p/87919817。使用https://yuanfux.github.io/zero-width-web/,对这些不可见的零宽字符解密,得到答案。
Section 4 黑客小子 9.15 19:31:09
d64935ee63aac7d30a734395699093b954ab1487ea4e28fa16cf7c82d44513dc
国家代码为86,经搜索,首批大王卡号段为176,所以写脚本暴力枚举8617600000000~8617699999999的哈希值来匹配。
跑了五分钟,显示已得到答案。
Section 3 键盘中的爱讯号 9.15 19:33:59
下载,得到小美的纸条.txt。
. . . . .-. -. . . . .-
- . .-. . . .- -. . . . . . . -.--
.-. . .-. . . .- --. -.--
-. . . . - . .-. . .- . . . . -. . .
-.-- --. -. --.
判断为摩斯密码,使用https://www.lddgo.net/encrypt/morse,逐行解密得到文本如下。
HRDV
TFVBHY
RFVGY
6TFUHB
YGNG
正当我百思不得其解时,我又来了个神操作,问朋友进了比赛官方群,群里一份文件赫然醒目。
题目怎么解我是看不来,但是答案知道了。
. . . . .-. -. . . . .-
- . .-. . . .- -. . . . . . . -.--
.-. . .-. . . .- --. -.--
-. . . . - . .-. . .- . . . . -. . .
-.-- --. -. --.
改后:
. . . . .(5) .-.(R) -. .(D) . . .-(V) 组成l (第一个字符5 把. . . .改为 . . . . .)
-(T) . .-.(F) . . .-(V) -. . .(B) . . . .(H) -.--(Y) 组成o
.-.(R) . .-.(F) . . .-(V) --.(G) -.--(Y) 组成v
-. . . . (6) -(T) . .-.(F) . .-(U) . . . .(H) -. . .(B) 组成e
-.--(Y) --.(G) -.(N) .---(G) 组成u (最后一个字符J把- - . 改为.---)
火速提交loveu,下一关。
Section 4 白鸟过河滩 9.15 20:02:03
歌曲播放链接:https://www.bilibili.com/video/BV19Z4y1b7qe
下载文件,得到歌词.txt如下。
55m96bif6L+H5rKz5rupDW==
5rSb5aSp5L6dL2lsZW0N
6aOO5oqK5oiR5LiN5oOz55+l6YGT55qE5LqL5oOF5ZGK6K+J5oiRDW==
5rKz5oqK5oiR5LiN5oOz5b+Y6K6w55qE5pWF5LqL5Lmf5bim6LWwDW==
5oiR5pGY5LiL5oiR55qE57+F6IaADc==
5a6D5Y+Y5oiQ55m96bifDW==
55m96bif5oiR55qE55m96bifDR==
6YCG552A6aOO5Y675ZCnDW==
6aOe6L+H5rKz5rupDX==
5oyl5LiA5oyl5LiA5Y675LiN5Zue6L+YDX==
5LiA5Y675LiN5Zue6L+YDb==
6aOO6LW35rC06LW36Zq+6Z2g5bK4DV==
55m96bif55m96bifIOS4jeimgeWbnuWktOacmw1=
5L2g6KaB5pu/5oiR6aOe5Y676YKj5Zyw5pa5DV==
5LiA5Y676YKj5Zyw5pa5DX==
6YKj5piv5L2g5oiR5YWx5ZCM5pWF5LmhDd==
5oqT5L2P5ZKM5oqT5LiN5L2P55qE54Wn54mHDS==
5ZOq5byg5pu0576ODd==
5Y676L+H5ZKM5rKh5Y676L+H55qE5Zyw5pa5Db==
5ZOq6YeM5pu06L+cDY==
55m96bifIOaIkeeahOeZvem4nw3=
5L2g6KaB6aOe5b6X5pu06auYIOS4jeimgeWbnuadpQ0=
6Iul6L+Y5oOz5LiO5oiR55u46KeBDR==
5bCx5p2l5oiR55qE5qKm6YeM6L65Dd==
55m96bif6L+H5rKz5rupDd==
5oyl5LiA5oyl5LiA5Y675LiN5Zue6L+YDX==
5LiA5Y675LiN5Zue6L+YDd==
6aOO6LW35rC06LW36Zq+6Z2g5bK4Da==
55m96bif55m96bifIOS4jeimgeWbnuWktOacmw1=
5L2g6KaB5pu/5oiR6aOe5Y676YKj5Zyw5pa5DW==
5LiA5Y676YKj5Zyw5pa5Dc==
6YKj5piv5L2g5oiR5YWx5ZCM5pWF5LmhDT==
5Yir5Zue5p2lDT==
5oiR5bCG57uI56m26aG65rWB5YWl5aSn5rW3DW==
6aG65rWB5YWl5aSn5rW3Dd==
5rW35LiN6Zeu5oiR5LuO5L2V5aSE5p2lDT==
6ZW/6aOO6ZW/6aOO6aOY5Zyo5bGx5rW36Ze0Df==
55m96bif55m96bif5bGV57+F5YWl6IuN5aSpDX==
5LiA5Y675YWl6IuN5aSpDd==
6IuN5aSp6L+c5Zyo5rW36IOM6Z2iDQ==
5LiA5Y675YWl6IuN5aSpDQ==
6IuN5aSp6L+c5q+U5rW35pu06L+c
判断为Base64编码,使用https://c.runoob.com/front-end/693/可以整段解码。根据Base64编码原理,Base64中间不会出现等号占位符,所以等号附近可能有隐藏信息。
使用https://blog.csdn.net/qq_51550750/article/details/122813934提供的程序,很快拿到了隐藏的答案。
Section 1 DICE 9.15 21:32:49
下载,得到1.png、2.png如下。
在PS中拼好。吐槽一句:太难拼了,有许多次线条可以完美对上,但是整体会错位。
【公众号里面没写,补充】按照拼好的顺序对应所给的字母表找到字符,求MD5提交即可。
Section 1 与魔对谈 9.16 12:59:48
“佛曰:善,魔曰:恶。”佛魔语言相反,因此将魔说的内容倒序,使用https://ctf.bugku.com/tool/todousharp,解出答案。
Section 3 校歌 9.16 18:40:04
Hint:-代表休止哦~
下载附件,得到校歌图片。
翔巍北辈生先厚炼重飞 — 盛勇 — 万岳巡天飞方 — 泽国梁
2 5 6 6 2 4 6 1 1 4 0 7 3 0 6 3 2 3 4 5 0 1 2 5
将提示中的文本与简谱上的数字对应,休止符换成简谱写法的0,得到以上八进制字符串。
hex(0o256624611407306323450125)
#'0x5765313076334e5055'
使用Python转换为十六进制,再使用https://www.sojson.com/hexadecimal.html将十六进制转换为字符串,得到答案。
写在最后
至此,整个西北工业大学信息安全协会负责的第三届“探索解密”趣味密码比赛已经圆满结束。协会的学长学姐十分热情,即使我不是指定的参赛选手,也能得到他们的欢迎和耐心解答。感谢这位打工人学长和韩学姐,也感谢各位为了比赛默默付出的同好。Respect~