CTF-MISC学习指南
Base64隐写
想了解base64的隐写首先就得知道它是怎么编码解码的
编码
编码时,将要编码的内容转换为二进制数据(一个字符对应8位二进制),每6位作为一组,从索引表中找到对应的字符,的位置补0,最后不足四位的补=
解码
编码时补充了0增加等号,解码时去除等号并对应删除编码时补充的0,正因为这一点,使隐写成为可能。
上述所说的补位0所在的位置,加入我们修改为其他二进制数,而不是默认的全0,在做base64解码的时候,是不会影响解码结果的,因为这些补位0所在的位置,解码时都会被删除,所以不影响解码结果。
所以我们想要隐藏信息的话,就可以利用这些补位0所在的位置,base64编码后的字符串,如果有1个等号,就有两个bit的补位0可隐写,如果有2个等号,就有四个bit的补位0可隐写;如果没有等号,就没有补位0可隐写。
贴脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 import reimport base64b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' f = open ('base64.txt' ,'r' ) base64str = f.readline() pattern2 = r'(\S)==$' pattern1 = r'(\S)=$' binstring = '' while (base64str): if re.compile (pattern2).findall(base64str): mstr = re.compile (pattern2).findall(base64str)[0 ] mbin = bin (b64chars.find(mstr)) mbin2 = mbin[0 :2 ] + mbin[2 :].zfill(6 ) stegobin = mbin2[-4 :] binstring += stegobin elif re.compile (pattern1).findall(base64str): mstr = re.compile (pattern1).findall(base64str)[0 ] mbin = bin (b64chars.find(mstr)) mbin2 = mbin[0 :2 ] + mbin[2 :].zfill(6 ) stegobin = mbin2[-2 :] binstring += stegobin base64str = f.readline() for i in range (0 ,len (binstring),8 ): print (chr (int (binstring[i:i+8 ],2 )),end='' )