MRCTF2020 pyFlag
拿到压缩包的时候7zip预览,一下子就发现Setsuna.jpg中有压缩包,直接丢进winhex查看
可以看到在zip文件头和jpg文件尾中有提示这是秘密文件的part1,那么思路就打开了,将其他图片的秘密文件部分拼成一个文件即可。
全部合起来组成一个zip文件,不是伪加密,先爆破密码
得到密码为1234,给出两个文件
hint中给出了提示
我用各种baseXX编码把flag套娃加密了,你应该也有看出来。 但我只用了一些常用的base编码哦,毕竟我的智力水平你也知道...像什么base36base58听都没听过 提示:0x10,0x20,0x30,0x55
注意四个16进制数,前两个非常明显分别是16和32,后两个是48和85,明显是提醒我们密文只采用了base16,base32,base48和base85这四种方式编码
但是我印象中并没有base48这种编码方式。。是不是误导项?我还是把这个当做base64来做
给出的密文非常杂乱,有明显的嵌套
G&eOhGcq(ZG(t2*H8M3dG&wXiGcq(ZG&wXyG(j~tG&eOdGcq+aG(t5oG(j~qG&eIeGcq+aG)6Q<G(j~rG&eOdH9<5qG&eLvG(j~sG&nRdH9<8rG%++qG%__eG&eIeGc+|cG(t5oG(j~sG&eOlH9<8rH8C_qH9<8oG&eOhGc+_bG&eLvH9<8sG&eLgGcz?cG&3|sH8M3cG&eOtG%_?aG(t5oG(j~tG&wXxGcq+aH8V6sH9<8rG&eOhH9<5qG(<E-H8M3eG&wXiGcq(ZG)6Q<G(j~tG&eOtG%+<aG&wagG%__cG&eIeGcq+aG&M9uH8V6cG&eOlH9<8rG(<HrG(j~qG&eLcH9<8sG&wUwGek2)
我们需要根据种base编码的特征来提取信息并解码
base16:构成为字母A-F数字0-9;匹配正则"^[0-9A-F]+$" base32:构成为字母A-Z数字2-9符号=;匹配正则"^[A-Z2-7=]+$" base64:构成为字母A-Z,a-z,数字0-9符号+/=;匹配正则"^[A-Za-z0-9+/=]+$" base85:比较复杂;直接作为判断条件的else
import re import base64 base = "G&eOhGcq(ZG(t2*H8M3dG&wXiGcq(ZG&wXyG(j~tG&eOdGcq+aG(t5oG(j~qG&eIeGcq+aG)6Q<G(j~rG&eOdH9<5qG&eLvG(j~sG&nRdH9<8rG%++qG%__eG&eIeGc+|cG(t5oG(j~sG&eOlH9<8rH8C_qH9<8oG&eOhGc+_bG&eLvH9<8sG&eLgGcz?cG&3|sH8M3cG&eOtG%_?aG(t5oG(j~tG&wXxGcq+aH8V6sH9<8rG&eOhH9<5qG(<E-H8M3eG&wXiGcq(ZG)6Q<G(j~tG&eOtG%+<aG&wagG%__cG&eIeGcq+aG&M9uH8V6cG&eOlH9<8rG(<HrG(j~qG&eLcH9<8sG&wUwGek2)" pattern1 = "^[0-9A-F]+$" pattern2 = "^[A-Z2-7=]+$" pattern3 = "^[A-Za-z0-9+/=]+$" def basedecode(content: str,type: int): if type == 1: return base64.b16decode(content) elif type == 2: return base64.b32decode(content) elif type == 3: return base64.b64decode(content) elif type == 4: return base64.b85decode(content) else: print("no") def get_type(content: str): try: if re.match(pattern1,content.decode()) is not None: return 1 except: print("not16") try: if re.match(pattern2,content.decode()) is not None: return 2 except: print("not32") try: if re.match(pattern3,content.decode()) is not None: return 3 except: print("not64") return 4 content = base while(True): type = get_type(content) content = basedecode(content,type) print(content)
不管最后出结果时的异常,发现了flagMRCTF{Y0u_Are_4_p3rFect_dec0der}
看来把那个0x30当做base64来解是正确的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异