2022第六届强网杯青少赛 Misc&Crypto-WriteUp
题外话
最近好久没更新博客了,来水一篇文章,另外之前使用安恒的图床导致很多图片显示不出来,所以现在换用github的图床,图片会正常显示的就是可能加载速度较慢,解决了之前的老毛病。
我自己都觉得博客体验感差,有点卡 但是没办法希望大家能等等,等到我成年以后可以备案之后这些问题都是小问题。
前言
前天参加了强网的青少赛,有幸拿到了线下名额,现在对misc和crypto的题目进行巩固复盘下,有一说一今年的题目还是挺友好的。
另外个人觉得misc出的有点水了 两道题目有同样的考点 质量不是很好。
比较可惜的就是没拿到前三血,misc都是比较靠前做出来。
题目附件:
- misc1:https://share.weiyun.com/wxckLdqd
- misc3:https://share.weiyun.com/CaRkgF5v
- crypto1:https://share.weiyun.com/UnB1MJxI
- crypto2:https://share.weiyun.com/YMmjelND
题解
Misc1
下载附件得到chuyinweilai.png winhex分析
发现里面的数据是base64,用脚本解密下写到新的文件
import base64
f = open('chuyinweilai.png','r')
content = base64.b64decode(f.read())
with open('new.png','wb') as f:
f.write(content)
输出后的图片仍然不显示
用winhex分析发现奇数位的字节和偶数位的字节相反了,起初我以为只是出题人对图片的头和尾进行了修改,当我修改头和尾后发现仍然不显示,那么就说明每一个字节都是相反的。
使用脚本修改
import base64
import binascii
f = open('chuyinweilai.png','r')
content = base64.b64decode(f.read())
r = ""
for i in range(0,len(content),2): #分奇偶写入文件
r += str(hex(content[i+1]))[2:].zfill(2) #这里zfill(2)很重要 一定要填充0 否则结果大相径庭
r += str(hex(content[i]))[2:].zfill(2)
content = binascii.unhexlify(r)
with open('new.png','wb') as f:
f.write(content)
运行脚本,输出的图片成功显示:
图片提示音乐的财富密码,我们百度一下发现是数字4536251
这一猜就知道是某种加密的图片隐写,但还不知道是哪种所以刚开始一直试都错了导致做题的进度变慢了,后面我stegsolve分析了一下发现lsb头部有数据,同时又存在加密,根据经验就知道是cloack-pixel加密。
使用payload得到flag
做这种题目还得是多做才能提高速度,有经验就能做快很多。
flag{5cc0aa21208b517dbd0bde650247237f}
Misc3
下载附件得到png图片,winhex分析 直接拖到尾部发现PK头和一个密码7his_1s_p4s5w0rd
改后缀为.zip 发现文件没有密码 给的是一张png图片,那么说明这个密码同样和第一题一样是图片隐写的密码
再次cloack-pixel尝试 结果一下就出了flag(吐槽下出题人真的很爱用cloack-pixel 同时也是我为什么说题目质量不好的原因)
flag{2e55f884-ef01-4654-87b1-cc3111800085}
Crypto1
题目给了一个txt文件 里面是许多的A和B
刚开始猜测是培根密码,但结果不是,后来想到A和B如同0和1 还有摩斯密码
尝试摩斯密码,用脚本将A和B替换为.和-
Cyberchef解密一下:
这个明文看上去像是一个被打乱的明文,以某种规律打乱的替换密码 尝试使用https://quipqiup.com/ 网站进行分析(很多看不懂的密文尝试丢里面会有惊喜)
得到了flag,但这里还不对 这里是一个坑点,当时尝试了很久。同时注意这里的flag的字母要变成小写。
因为摩斯电码存在两种情况,也可以是前者为-后者为. 所以正确解法是A和B替换相反一下,反过来再试就得到了flag
flag{1d817f23-4e20-9405-bf6d-e83d055316d6}
Crypto2
下载附件得到密文FvLFArGp[ovpxBpsssD]qCElwwoClsoColwpuvlqFv
这个密文刚开始第一眼可以隔一位看有F L A G [ xxxxxxxxx] xxxxxx 有点像栅栏密码所以就去在线网站尝试
网站尝试一番过后 当栅栏数为32时最终结果格式为flag{} 得到栅栏数为32
题目提示说最终结果为flag{uuid}
所以先把这段字符串转换为小写 这里直接异或32位就都转换成对应的大小写,同时[变为{
Flag很接近了,我们再去了解一下uuid uuid一般为8-4-4-16 共36位长,且有-
所以这里我们只要把每8位后一位的字母”L” 的ascii(76) 减去 符号”-“的ascii(45)就是每个字符串需要减去的差值
Ord(‘L’) – ord(‘-‘) = 31
开写脚本,讲密文的每一位ascii都减去31 再转换结果
这里我当时以为就是flag了,卡了很久,这里也是一个坑 个人觉得有点不妥的地方
因为uuid都是16进制,那么哪里来的大写的G呢?
所以当时猜测了一下,G与F仅差1位,即ascii -32就是F(原来的是ascii -31),同时看原密文f对应G,有没有可能是小写字母要减去32位 而大写字母只用减去31位呢
写脚本验证(最终脚本):
cryher = "FLAG[vxpsDqCElwwoClsoColwpuvlqFvvFrpopBss]"
res = ""
for i in cryher:
res += chr(ord(i)^32)
content = "VXPSdQceLWWOcLSOcOLWPUVLQfVVfRPOPbSS"
res = "flag{"
for i in content:
if i.isupper(): #大写 -31
res += chr(ord(i)-31)
else: #小写 -32
res += chr(ord(i)-32)
res += "}"
print(res.lower())
这个flag看起来有点样子了,都是符合要求的16进制 事实上就是最终的flag。
需要注意的是最终flag值要为小写
flag{7914d2ce-880c-40c0-8167-2f77f3101b44}