题目信息

附件是一个文本文件,里面有658行base64编码。

分析

先将附件中每行base64编码进行解码,得到一个Python脚本。但其实信息并非隐藏在解码后的数据中,而是隐藏在编码中。首先介绍base64编码的原理,当需要编码的数据剩下1或2字节时,编码与解码过程如下:

可以看到,即使$a_{i} \neq 0$,解码过程也能正确进行;从而可以使用$a_{i}$传递一些信息。因此,只要我们将编码中的$a_{i}$提取出来,就可以解出flag。

解题

实现的Python脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from base64 import b64decode
from string import uppercase,lowercase,digits
from Crypto.Util.number import long_to_bytes

def solve():
with open('encode','r') as f:
codes=f.read()
Lc=codes.split('\n')[:-1]
base=uppercase+lowercase+digits+'+/'
re2=[]
for code in Lc:
if '==' in code:
re2.append(bin(base.find(code[-3]))[2:].rjust(6,'0')[2:])
elif '=' in code:
re2.append(bin(base.find(code[-2]))[2:].rjust(6,'0')[4:])
ret=''.join(re2)
return long_to_bytes(long(ret[:ret.rfind('1')+1],2))

if __name__=='__main__':
print solve()

程序运行结果如下:

1
2
$ python solve.py
ROIS{base_GA_caN_b3_d1ffeR3nT}