Skip to main content

✌️CTF-Misc-base64隐写

·78 words
CTF CTF
Yalois
Author
Yalois
freedom
Table of Contents

base64隐写
#

base64
#

Base64是一种二进制到文本的编码方式。

base64的每个字节用6位二进制数来表示,共64个编码字符,2^6=64。加上补位符号’=‘共65个字符。

A-Z a-z 0-9 + / =

img

base64编码
#

编码主要流程: 将原始数据每三个字节分为一组(共24bit),然后每6bit转为一个码表字符(新的四个字节)。如果字节数不是三的倍数,补0使二进制位数是6的倍数来编码

  1. 如果最后多了一个字节(8bit,差16bit),补上4个0(12bit—2*6,差12bit),编码成2个base64字符。最后补两个’=’(6*2bit)。

    img

  2. 如果最后多了两个字节(16bit,差8bit),补上2个0(18bit—3*6,差6bit),编码成3个base64字符。最后补上一个’=’(6bit)。

img

Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数

base64解码
#

  1. 如果最后补了两个’=’,在解码时,忽略’=’,四个base64字符为一组,最后一组将2个base64字符转为12bit,取8bit为新字节,丢弃掉最后4bit。

  2. 如果最后补了一个’=’,在解码时,忽略’=’,四个base64字符为一组,最后一组将3个base64字符转为18bit,取16bit为两个新字节,丢弃掉最后2bit。

  3. 如果最后没有补位,在解码时,将每个base64字符转换为对应的6位二进制数(共24位)。然后将这24位二进制数按照每8位分割为一组,得到三个字节的原始数据。

实际上算法的实现是更加复杂的,需要涉及到二进制位操作。

base64隐写
#

因为在base64解码的时候会丢弃2bit或者4bit,所以在这些地方插入二进制数据不会影响解码的结果,但是会影响编码后base64的结果。所以就可以在这部分进行隐写。

自己写的提取base64可隐写的部分的所有二进制的值合并字符串。

#文本读取内容实现
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open("./f380d850e6ebdb19b7d0743.txt","r") as f:
    for i in f.readlines():
        #最后一个是换行符,去掉
        base64len=(len(i)-1)
        text=i[0:-1]
        if base64len%4==0:
            pass
        elif base64len%4==3:
            #能藏2bit
            t=base64chars.index(text[-1])
            t=(str(bin(t))[2:].zfill(6)) #去掉0b开头然后在前边补0直到补齐6位
            print(t[-2:],end='')
        elif base64len%4==2:
            ##能藏4bit
            t=base64chars.index(text[-1]) 
            t=(str(bin(t))[2:].zfill(6)) #去掉0b开头然后在前边补0直到补齐6位
            print(t[-4:],end='')
        else:
            print("好像有些错误")
        #补全完毕

参考url
#

一份简明的 Base64 原理解析 - 知乎 (zhihu.com)

神奇的 Base64 隐写 - Tr0y’s Blog