这应该是暑假前打的最后一场CTF了,后面准备保研直接摊开了。
EBCDIC
MISC 签到题,直接送分的。提示EBCDIC编码,拿python或者编辑器改一下编码就行。1
2
3
4
5data = "86 93 81 87 C0 A6 85 F1 83 F0 94 85 6D A3 F0 6D 99 85 84 88 81 A3 F2 F0 F2 F1 D0"
data = bytes.fromhex(data)
print(data)
dt = ''.join(data.decode('cp500'))
print(dt)
1 | flag{we1c0me_t0_redhat2021} |
Colorful code
MISC的题大都是脑洞题。这个题只提示了colorful code,一开始我以为只是说的是RGB的颜色代码如#FFFFC0
等,但是思路也基本正确。给了data1和data2两个文件。观察两个文件如下。
第一个文件全是数字与空格,拿python统计一下数字范围在0~19内,再看第二个文件,后面都是三个相同的字母连起来,其十六进制值从0x14到0xFF,这些信息都是没用的,那么大概率只有前面的60字节是有用的信息,每三个一组作为颜色代码的RGB值,刚好20个和data1的数字范围对应。那么data作为像素值代入进行图像的矩阵构建,应该就是正确的思路了。
还有一个问题是我们不知道图像的宽和高。对data1内像素的数量进行简单计算:
1 | data = open("data1", "r").read().split(" ") |
那么图像的宽高应该是37*191或者反过来。
转换图像的代码如下:
1 | from PIL import Image |
1 | from PIL import Image |
这里给了两个脚本,想说明一下这两个脚本解出来的图像是不一样的,因为python的putdata
或者用reshape
来自动化重构像素矩阵,它默认的像素序列的填充方式是先横轴再纵轴,而这个题像素重构的正确方向是先纵轴再横轴,所以后一个脚本得到的图像拿不到正确的flag。
后面就是真正的colorful code所代表的的编程语言PIET,然后这里mark一下一些脑洞大开的编程语言,可能有一些奇奇怪怪的隐写题会用到。
最后把得到的图像放到在线编译网站即可得到flag。(或者可以去github下载python对应的编译包)
primegame
这次的crypto题目简直离谱,虽然有难度,但是都是前面比赛出现过的原题的一丢丢魔改就拿来出题。所以基本上你会Google基本就能AK。
这个的原题writeup链接:Pokajeon / Kapojeon 2020
server 源代码
1 | #!/usr/bin/env python3 |
类似0/1背包问题,将[3,89]的素数的自然对数值作为密钥,然后和flag的每个byte乘后累加,最后再乘以2256。
恢复方法是低密度攻击。然后不管这些,其实魔改writeup的代码即可
1 | # sagemath |
hpcurve
然后这个题也是一次CTF的原题: hxpCTF 2020。
基本就改了加密的时候异或的密钥长度比明文长度长,所以取余即可。
server:
1 | #!/usr/bin/env sage |
solve:
1 | from itertools import product |