Base64Stego

攻防世界_Misc_新手区_base64stego

题目描述:菜狗经过几天的学习,终于发现了如来十三掌最后一步的精髓

知识点

BASE64 是一种编码方式, 是一种可逆的编码方式.
编码后的数据是一个字符串, 包含的字符为: A-Za-z0-9+/
共 64 个字符:26 + 26 + 10 + 1 + 1 = 64
其实是 65 个字符, “=”是填充字符.

64 个字符需要 6 位二进制来表示, 表示成数值为 0~63.

索引字符索引字符索引字符索引字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9G25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

长度为 3 个字节的数据经过 Base64 编码后会变为 4 个字节

例如:
ZTQ
908481
010110100101010001010001
22371717
WIRR

三个字符的数据位数是38=24 正好24=64所以能刚好分为4组,如果数据位数不是6的倍数就会有空位,此时需要往后补0凑够6的倍数,如果8个数据位全为0则对应“=”

Lw
76119
010011000111011100000000
197280
THc=

注意到119的ASCLL码对应的二进制是0 1 1 1 0 1 1 1,而加密出的字符c只有其后四位有关,所以0 1 1 1 0 0中后面两个0可以任意修改而不会影响解密后的结果,所以就可以在这两位中隐藏数据,(至于为什么不能再最后面的0 0 0 0 0 0中隐藏数据 :000000对应的是 ’ = ’ 如果改动后解密出来的结果就变了,容易被人发现。)

tips:有一个 ‘ = ’ 可以隐藏两位数据 两个 ‘ = ’可以隐藏四位,‘ = ’最多只能有两位。

至此给出这道题的python脚本。
其实对应的这种题python有专门的base64库来写脚本,这里给出的是最基本的语法编写了。

base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
path = input("path")   #读取文件的位置
def change(string_test) :
    strings_ans = ""
    for every in string_test :
        bin_num = ""
        if every == "=" :
            return strings_ans
        else :
            num = base64.find(every)
            while num != 0 :
                bin_num += str(num%2)
                num = int(num/2)
            while len(bin_num) <6 :
                bin_num += "0"
            bin_num = bin_num[::-1]
        strings_ans += bin_num
    return strings_ans
def answer(strings_last) :
    ans = ""
    strings_temp = change(strings_last)
    if strings_last.count('=') == 1 :
        ans += strings_temp[-2:]
    else :
        ans += strings_temp[-4:]
    return ans
with open(path + "\\" + "stego.txt","r") as in_file :   #输入文件的名称
    strings_first = in_file.readlines()
    strings = []
    for every_strings in strings_first :
        if every_strings[-2] =="=" :
            strings.append(every_strings)
with open(path + "\\" + "out.txt","w") as out_file :    #输出文件的名称
    ans = ""
    for line in strings :
        ans += answer(line)
    num = 0
    list_num = []
    for i in range(0,len(ans)) :
        num = num*2+int(ans[i])
        if (i+1)%8 == 0 :
            list_num.append(num)
            num = 0
    ans = ""
    for i in list_num :
        ans += chr(i)
    out_file.write(ans)

flag{Base_sixty_four_point_five}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值