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来解是正确的

posted @ 2022-04-03 16:11  WXjzc  阅读(162)  评论(0编辑  收藏  举报