PolarCTF2024春季个人挑战赛个人Writeup
这里包含了Crypto的两道题,Misc的两道题和Web的一道题。
Reverse方向的题解单独写了一篇:PolarCTF2024春季个人挑战赛Reverse方向个人Writeup
Crypto
周杰伦的贝斯
附件是一个文本文档,其中充满了emoji
搜索得知,使用的是base100编码
到这里可以联合附件名称和题目名称推测,这里使用了base家族编码(周杰伦的贝斯),逐步进行base100、base64、base32(100_64_32.txt)就可以得到flag
base64解码:
base32解码:
最终得到明文Jay Chou
flag为flag{Jay Chou}
在线工具
歌词最后一句
附件提供了一个压缩包,内含两个图片,一个是十个小人的图片,另一个是包含一张专辑封面的图片
查询得知,小人的图片是福尔摩斯密码小人,密码表如下:
对照得出字符串:wydzmnzwsb
另一种包含周杰伦专辑封面的图片,经过对比,可以发现是周杰伦的《11月的萧邦》
接下来就是联系题目名称,思考上面小人解密出的字符串的含义,推测是该专辑中某首歌的歌词最后一句的首字母
寻找得知,是单曲《枫》中的“我要的只是你在我身边”的首字母
MD5加密后得到flag
flag为flag{776e26e39d01c914e8faa6796bf7e9b3}
在线工具
MD5在线加密/解密/破解—MD5在线 (sojson.com)
Misc
加点儿什么
图片是一张平平无奇的经典之作:
这个图片中蕴含了什么内容,并不容易被得知,使用010 Editor打开发现文件尾部存在额外的内容:
PK的字样,暗示我们它极有可能藏了一个压缩包,使用解压缩软件打开:
发现其中存在一个源代码文件,文件内容:
#include<bits/stdc++.h>
using namespace std;
#define MAX 100
//提示:密文输入372658619JI0707I8G64HF2400F96991
//提示[1]:代码不是完全准确,需要你加点东西(非常简单)
char ciphertext[MAX]; //密文
char plaintext[MAX]; //明文
int K=4;
//加密
void Encryption()
{
cout<<"请输入明文:"<<endl;
gets(plaintext);
cout<<"密文为:"<<endl;
for(int i=0; plaintext[i] != '\0'; i++)
{
if(plaintext[i] >= 'A' && plaintext[i] <= 'Z')
{
ciphertext[i] = (plaintext[i] - 'A' + K) % 26 + 'A';
}
else if (plaintext[i] >= 'a' && plaintext[i] <= 'z')
{
ciphertext[i]=(plaintext[i] - 'a' + K) % 26 + 'a';
}
else
ciphertext[i] = plaintext[i];
cout<<plaintext[i];
}
printf("\n");
}
//解密
void Decryption()
{
cout<<"请输入密文:"<<endl;
gets(ciphertext);
cout<<"明文为:"<<endl;
for(int i=0; ciphertext[i] != '\0'; i++)
{
if(ciphertext[i] >= 'A' && ciphertext[i] <= 'Z')
{
plaintext[i] = ((ciphertext[i] - 'A' - K) % 26 + 26)%26 + 'A';
}
else if (ciphertext[i] >= 'a' && ciphertext[i] <= 'z')
{
plaintext[i]=((ciphertext[i] - 'a' - K) % 26 + 26)%26 + 'a';
}
else
plaintext[i] = ciphertext[i];
}
printf("\n");
}
int main()
{
int n,flag=1;
while(flag)
{
cout<<"请选择(1:加密,2:解密,3:退出):"<<endl;
cin>>n;
getchar();
switch(n)
{
case 1:
Encryption();
break;
case 2:
Decryption();
break;
case 3:exit(0);
}
}
}
与Reverse方向中的C^题目的代码较为相似,同样是类似凯撒密码的实现,这里的解密方法减去的为K变量,K的值为4,可以复用那里的代码,略微改动即可用于解密这里的字符串
参考脚本:
flag = list("372658619JI0707I8G64HF2400F96991")
for i in range(len(flag)):
ord_ = ord(flag[i])
if ord_ >= 0x40 and ord_ <=0x5a:
flag[i] = chr(ord_ - 4)
print("".join(flag))
输出结果:
372658619FE0707E8C64DB2400B96991
flag为flag{372658619FE0707E8C64DB2400B96991}
你懂二维码吗?
附件存在两个文件,一个压缩文件和一个jpg文件,但是并不可以解压,提示文件已损坏。
010 Editor中打开:
发现模板并不能正确执行,于是转而求助于WinRAR的压缩包修复功能,修复后压缩包如下:
替代1.zip的文件是1.txt,而它是存在密码的,hahaha目录中又存在一个图片,打开发现是PolarCTF的微信公众号的二维码
使用010 Editor打开,发现尾部存在额外内容:
猜测666777888为1.txt的密码,成功打开:
发现这个1.txt实际上是一个二进制文件,观察文件头表明很可能是一个PNG文件,解压后修改后缀为.png
扫描二维码得到flag:
flag为flag{zun_du_jia_du}
在线工具
Web
机器人
根据题目名称可以猜测,与robots.txt文件有些关系,访问该文件发现如下内容:
存在一半的Flag,还有一个目录,直接访问会返回403
可以扫描一下该目录:
发现该目录下存在一个flag.php文件,访问后得到后半段flag
flag为flag{4749ea1ea481a5d56685442c8516b61c}
(完)