吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6074|回复: 25
收起左侧

[原创] 2020网鼎杯 白虎组 b64 精析

  [复制链接]
bogon1 发表于 2021-4-9 08:50
本帖最后由 bogon1 于 2021-4-9 08:55 编辑

title: 2020网鼎杯 白虎组 b64 精析
date: 2021年4月8日  23:26:20
tags: CTF,技术

扯淡时间

  1. 不懂出题的师傅是哪位,但猜测很大可能性不超过25岁。

  2. 最近又在搞CTF,但看着余弦等大佬都已转战区块链领域良久,不觉心慌慌,感觉自己再亿次被时代抛弃。

题目分析

timu.png

题目很简练,类型:Crypto,最终解出人数是300队以内。
下载打开看是
timu2.png

密文:uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouz
泄露的密文:pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF=
泄露的明文:ashlkj!@sj1223%^&*Sd4564sd879s5d12f231a46qwjkd12J;DJjl;LjL;KJ8729128713

几乎15分钟内就能看出,“泄露的密文”可能是个类似Base64的东西,把“泄露的明文”转换成base64编码看看:

YXNobGtqIUBzajEyMjMlXiYqU2Q0NTY0c2Q4NzlzNWQxMmYyMzFhNDZxd2prZDEySjtESmpsO0xqTDtLSjg3MjkxMjg3MTM=

注意:FoF=和MTM=
与泄露的密文对比后发现最后四位长得很像,猜测最后3位的加密过程肯定是M--->F,T---->o。
初步想法是先把“密文”按照替换法替换成明文(要注意Excel某些时候不区分大小写,不要直接Vlookup):

=LOOKUP(1,0/EXACT(A:A,D2),B:B)

excel1.png

明文的前半部分是不是很熟?基本上flag 的base64开头就是ZmxhZ
base64解码:flag{1e3a2。那接下来就很明显了。爆破下面六个字符对应的字母就可以了。
EIGsXz
excel2.png

爆破

字典构造

我们知道base64的字典一般是大小写字母和数字,加号和斜杠组成(共计64个)
如果用python写就是

import string
string.letters+string.digits+'+/'

这个字典里要去掉参考明文的所有字母(这里需要思考一下),原因是:
参考密文当中不包含EIGsXz,假如 EIGsXz作为密文,明文肯定不是参考明文当中的字符。
所以字典64个字符要减掉参考明文中42个字符(注:不可用Excel 的自动去重功能,因为没区分大小写),共计22个。

#用未被映射的字符构造字典
newDic= ''
for x in dic:
    if(x not in b ):
        newDic+=x

python解析base64

同时又知道python有个解base64的包。

import base64
base64.b64decode('ZmxhZ3sxZTNhMm')

进度条

所以可以直接爆破了(引入个进度条,不然等待很绝望)记得要是

pip install progressbar2。
bar = progressbar.ProgressBar(max_value=scipy.special.perm(len(newDic),len(unknow)))

爆破核心代码

dic1=newDic
for E in newDic:
    dic2=dic1.replace(E,'')
    for G in dic2:
        dic3=dic2.replace(G,'')
        for I in dic3:
            dic4=dic3.replace(I,'')
            for s in dic4: 
                dic5=dic4.replace(s,'')
                for X in dic5:
                    dic6=dic5.replace(X,'')
                    for z in dic6:
                        result='ZmxhZ3sxZTNhMm{E}lN{I}0xYz{G}yLT{E}mNGYtOWIyZ{I}{s}hNGFmYW{X}kZj{G}xZTZ{z}'.format(E=E,G=G,I=I,s=s,X=X,z=z)
                        #  '.............    . E .. I .... G ... E .........  .Is.....    .X ... G......z'
                        #       ZmxhZ3sxZTNhMm{E}lN{I}0xYz{G}yLT{E}mNGYtOWIyZ{I}{s}hNGFmYW{X}kZj{G}xZTZ{z}
                        count+=1
                        #进度条
                        bar.update(count)
                        combineAndDecode(result)

排列组合

scipy.special.perm(len(newDic),len(unknow))

这一串是排列的意思,其实就是A22,6(22个字符中选择6个,有53721360种可能)。这个数字用于设计进度条。
cmd1.png

正则验证

一般盲猜的base64解密,会出一堆乱码字符

luanma.png

所以前面一般加个可打印字符判断,如果是乱码直接下一个尝试了

flag=base64.b64decode(result)
        for x in flag:
            if(x not in string.printable):
                flag=''
                break

然后再写个正则验证flag的符合性(根据其他题的flag,格式一般是)。

re.findall(r'flag{\w{8}-\w{4}-\w{4}-\w{4}-\w{12}}',flag)

字符串加工

因为要打出以下这串:

ZmxhZ3sxZTNhMm{E}lN{I}0xYz{G}yLT{E}mNGYtOWIyZ{I}{s}hNGFmYW{X}kZj{G}xZTZ{z}

所以加了个代码

for x in m:    
    if (a.find(x)==-1):
        n+='{'+x+'}'
        unknow+=x
        maskM+=x

最终代码

# -*- coding: utf-8 -*-

import requests
import sys
import string
import base64
import re
import progressbar
import scipy.special
reload(sys)
sys.setdefaultencoding('utf8')

#a(cypher_base64)--->b(plain_base64)
a='pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF='
b='YXNobGtqIUBzajEyMjMlXiYqU2Q0NTY0c2Q4NzlzNWQxMmYyMzFhNDZxd2prZDEySjtESmpsO0xqTDtLSjg3MjkxMjg3MTM='

#m(cypher_base64)--->n(target_base64)
m='uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouz'
#  ZmxhZ3sxZTNhMm.lN.0xYz.yLT.mNGYtOWIyZ..hNGFmYW.kZj.xZTZ.

n=''
maskM=''
unknow=''

dic=string.letters+string.digits+'+'+'/'

#用未被映射的字符构造字典
newDic= ''
for x in dic:
    if(x not in b ):
        newDic+=x

print "newDic:"+str(len(newDic))
print "newDic:"+newDic

for x in m:    
    if (a.find(x)==-1):
        n+='{'+x+'}'
        unknow+=x
        maskM+=x
    else:
        n+=b[a.find(x)]
        maskM+='.'

print m
print maskM
print n
#未知字符
unknow= "".join(set(list(unknow)))

def combineAndDecode(result):

    try:
        flag=base64.b64decode(result)
        #flag='flag{1e3a2de4-1c02-4f4f-9b2d-a4afabdf01e6}'
        for x in flag:
            if(x not in string.printable):
                flag=''
                break
        if(len(re.findall(r'flag{\w{8}-\w{4}-\w{4}-\w{4}-\w{12}}',flag))>0):
            #print flag
            with open('results.txt','a+') as f:
                f.write(result+'\n')
                f.write(flag+'\n')
            #pass
    except Exception as e:
        pass

count=0
bar = progressbar.ProgressBar(max_value=scipy.special.perm(len(newDic),len(unknow)))

dic1=newDic
for E in newDic:
    dic2=dic1.replace(E,'')
    for G in dic2:
        dic3=dic2.replace(G,'')
        for I in dic3:
            dic4=dic3.replace(I,'')
            for s in dic4: 
                dic5=dic4.replace(s,'')
                for X in dic5:
                    dic6=dic5.replace(X,'')
                    for z in dic6:
                        result='ZmxhZ3sxZTNhMm{E}lN{I}0xYz{G}yLT{E}mNGYtOWIyZ{I}{s}hNGFmYW{X}kZj{G}xZTZ{z}'.format(E=E,G=G,I=I,s=s,X=X,z=z)
                        #  '.............    . E .. I .... G ... E .........  .Is.....    .X ... G......z'
                        #       ZmxhZ3sxZTNhMm{E}lN{I}0xYz{G}yLT{E}mNGYtOWIyZ{I}{s}hNGFmYW{X}kZj{G}xZTZ{z}

                        count+=1
                        #进度条
                        bar.update(count)
                        combineAndDecode(result)

跑的效果是这样:
cmd2.png

大概5分钟内能跑完。

最终结果(21 flag):

(共计可能有21个flag)

ZmxhZ3sxZTNhMmJlNC0xYzAyLTJmNGYtOWIyZC1hNGFmYWRkZjAxZTZ9
flag{1e3a2be4-1c02-2f4f-9b2d-a4afaddf01e6}
ZmxhZ3sxZTNhMmJlNC0xYzAyLTJmNGYtOWIyZC1hNGFmYWVkZjAxZTZ9
flag{1e3a2be4-1c02-2f4f-9b2d-a4afaedf01e6}
ZmxhZ3sxZTNhMmJlNC0xYzAyLTJmNGYtOWIyZC1hNGFmYW5kZjAxZTZ9
flag{1e3a2be4-1c02-2f4f-9b2d-a4afandf01e6}
ZmxhZ3sxZTNhMmJlNC0xYzRyLTJmNGYtOWIyZC1hNGFmYWVkZjRxZTZ9
flag{1e3a2be4-1c4r-2f4f-9b2d-a4afaedf4qe6}
ZmxhZ3sxZTNhMmJlNC0xYzRyLTJmNGYtOWIyZC1hNGFmYW5kZjRxZTZ9
flag{1e3a2be4-1c4r-2f4f-9b2d-a4afandf4qe6}
ZmxhZ3sxZTNhMmJlNC0xYzVyLTJmNGYtOWIyZC1hNGFmYWRkZjVxZTZ9
flag{1e3a2be4-1c5r-2f4f-9b2d-a4afaddf5qe6}
ZmxhZ3sxZTNhMmJlNC0xYzVyLTJmNGYtOWIyZC1hNGFmYW5kZjVxZTZ9
flag{1e3a2be4-1c5r-2f4f-9b2d-a4afandf5qe6}
ZmxhZ3sxZTNhMmRlNC0xYzAyLTRmNGYtOWIyZC1hNGFmYWJkZjAxZTZ9
flag{1e3a2de4-1c02-4f4f-9b2d-a4afabdf01e6}
ZmxhZ3sxZTNhMmRlNC0xYzAyLTRmNGYtOWIyZC1hNGFmYWVkZjAxZTZ9
flag{1e3a2de4-1c02-4f4f-9b2d-a4afaedf01e6}
ZmxhZ3sxZTNhMmRlNC0xYzAyLTRmNGYtOWIyZC1hNGFmYW5kZjAxZTZ9
flag{1e3a2de4-1c02-4f4f-9b2d-a4afandf01e6}
ZmxhZ3sxZTNhMmRlNC0xYzJyLTRmNGYtOWIyZC1hNGFmYWVkZjJxZTZ9
flag{1e3a2de4-1c2r-4f4f-9b2d-a4afaedf2qe6}
ZmxhZ3sxZTNhMmRlNC0xYzJyLTRmNGYtOWIyZC1hNGFmYW5kZjJxZTZ9
flag{1e3a2de4-1c2r-4f4f-9b2d-a4afandf2qe6}
ZmxhZ3sxZTNhMmRlNC0xYzVyLTRmNGYtOWIyZC1hNGFmYWJkZjVxZTZ9
flag{1e3a2de4-1c5r-4f4f-9b2d-a4afabdf5qe6}
ZmxhZ3sxZTNhMmRlNC0xYzVyLTRmNGYtOWIyZC1hNGFmYW5kZjVxZTZ9
flag{1e3a2de4-1c5r-4f4f-9b2d-a4afandf5qe6}
ZmxhZ3sxZTNhMmVlNC0xYzAyLTVmNGYtOWIyZC1hNGFmYWJkZjAxZTZ9
flag{1e3a2ee4-1c02-5f4f-9b2d-a4afabdf01e6}
ZmxhZ3sxZTNhMmVlNC0xYzAyLTVmNGYtOWIyZC1hNGFmYWRkZjAxZTZ9
flag{1e3a2ee4-1c02-5f4f-9b2d-a4afaddf01e6}
ZmxhZ3sxZTNhMmVlNC0xYzAyLTVmNGYtOWIyZC1hNGFmYW5kZjAxZTZ9
flag{1e3a2ee4-1c02-5f4f-9b2d-a4afandf01e6}
ZmxhZ3sxZTNhMmVlNC0xYzJyLTVmNGYtOWIyZC1hNGFmYWRkZjJxZTZ9
flag{1e3a2ee4-1c2r-5f4f-9b2d-a4afaddf2qe6}
ZmxhZ3sxZTNhMmVlNC0xYzJyLTVmNGYtOWIyZC1hNGFmYW5kZjJxZTZ9
flag{1e3a2ee4-1c2r-5f4f-9b2d-a4afandf2qe6}
ZmxhZ3sxZTNhMmVlNC0xYzRyLTVmNGYtOWIyZC1hNGFmYWJkZjRxZTZ9
flag{1e3a2ee4-1c4r-5f4f-9b2d-a4afabdf4qe6}
ZmxhZ3sxZTNhMmVlNC0xYzRyLTVmNGYtOWIyZC1hNGFmYW5kZjRxZTZ9
flag{1e3a2ee4-1c4r-5f4f-9b2d-a4afandf4qe6}

总结

要解这题门道还是挺多的,以下方面要快速知道并投入使用:
1、 python解base64
2、正则表达式
3、字符串快速转置去重分析
4、进度条设计
5、排列组合知识
6、基本是盲猜,连base64原理是什么都可以不用知道。但知道一下base64原理也挺好。

参考链接

VLOOKUP函数不能区分大小写,该如何查找匹配?
https://cloud.tencent.com/developer/news/594528

免费评分

参与人数 11威望 +1 吾爱币 +30 热心值 +8 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
内瑟斯 + 1 我很赞同!
星辰一枚 + 1 + 1 热心回复!
石碎大胸口 + 1 + 1 热心回复!
freedom20112011 + 1 + 1 用心讨论,共获提升!
榆树 + 1 + 1 太菜了,看不懂!
爱你小吉君 + 1 热心回复!
fengbolee + 1 + 1 用心讨论,共获提升!
77-68-6f + 1 + 1 <font style="vertical-align: inherit;"><font style=
小橙子Top + 1 用心讨论,共获提升!
绿雪羚羊 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

99无敌 发表于 2021-4-9 09:24
就看见   白虎    俩字 赶紧点进来,,,,,
qianshang666 发表于 2021-4-9 10:42
99无敌 发表于 2021-4-9 09:24
就看见   白虎    俩字 赶紧点进来,,,,,

兄弟,同道中人呀
qwxa 发表于 2021-4-9 09:22
头像被屏蔽
wuti90 发表于 2021-4-9 09:24
提示: 作者被禁止或删除 内容自动屏蔽
fuzball 发表于 2021-4-9 09:25
我不擅长,所以我觉得能解出来的真厉害
lixiangliuyi 发表于 2021-4-9 09:36
满怀欣喜的奔着白虎来的,最终以看不懂代码失落而归。。
abcdyes 发表于 2021-4-9 09:56
膜拜大佬!
wildfire_810 发表于 2021-4-9 10:43
好厉害。学习了
枫恋蓝点 发表于 2021-4-9 11:03
奔着白虎来的绅士们,你们好。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-28 20:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表