这里介绍了base64隐写的原理。
可以看到,等号的作用类似于‘占位’。要想将隐藏的数据提取出来,只需解除这种占位即可,笔者采用将A(base64加密后是000000,便于后续的位操作)来替换等号,并且局部解密的方式来获取隐藏的数据。
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
| import binascii import base64 import re def compare(src): result = '0b' str\_len = len(src) for i in range(0, str\_len, 2): if src\[i:i + 2\] == b'3d' and src\[i - 2:i\] != b'3d': pattern = re.compile(r'(?<=0b)\[01\]\*') if src\[i + 2:i + 4\] == b'3d': code\_tmp = base64.b64decode(bytes.fromhex((src\[i - 4:i\] + b'413d').decode('ascii')).decode('ascii')) result += re.search(pattern, bin(code\_tmp\[1\] >> 4)).group(0).zfill(4) else: code\_tmp = base64.b64decode(bytes.fromhex((src\[i - 6:i\] + b'41').decode('ascii')).decode('ascii')) result += re.search(pattern, bin(code\_tmp\[2\] >> 6)).group(0).zfill(2) return result if \_\_name\_\_ == '\_\_main\_\_': path = input("Please input the source file path: ") try: with open(path, 'rb') as src: content = binascii.hexlify(src.read()) src.close() except FileNotFoundError: print("File Not Found") exit(1) result = compare(content) print(result)
|
这一句的目的是寻找等号并避免重复:
1
| if src\[i:i + 2\] == b'3d' and src\[i - 2:i\] != b'3d':
|
这一句的目的是将局部(4个字符)解码,41即A的ascii码,在解码后变成0的串
1
| code\_tmp = base64.b64decode(bytes.fromhex((src\[i - 4:i\] + b'413d').decode('ascii')).decode('ascii'))
|
这一句直接通过位操作获得隐写的内容并将位数补齐
1
| result += re.search(pattern, bin(code\_tmp\[1\] >> 4)).group(0).zfill(4)
|
最终程序的输出是二进制位串,可以进行下一步处理。这是一个位串转字符串的网站。