题外话

最近好久没更新博客了,来水一篇文章,另外之前使用安恒的图床导致很多图片显示不出来,所以现在换用github的图床,图片会正常显示的就是可能加载速度较慢,解决了之前的老毛病。

我自己都觉得博客体验感差,有点卡 但是没办法希望大家能等等,等到我成年以后可以备案之后这些问题都是小问题。

前言

前天参加了强网的青少赛,有幸拿到了线下名额,现在对misc和crypto的题目进行巩固复盘下,有一说一今年的题目还是挺友好的。

另外个人觉得misc出的有点水了 两道题目有同样的考点 质量不是很好。

比较可惜的就是没拿到前三血,misc都是比较靠前做出来。

题目附件:

题解

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}