Home
updated:

base64隐写的一种解决办法


这里介绍了base64隐写的原理。

可以看到,等号的作用类似于‘占位’。要想将隐藏的数据提取出来,只需解除这种占位即可,笔者采用将A(base64加密后是000000,便于后续的位操作)来替换等号,并且局部解密的方式来获取隐藏的数据。

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)  # 自动补0到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())  # 以16进制方式打开文件
            src.close()
    except FileNotFoundError:
        print("File Not Found")
        exit(1)
    result = compare(content)
    print(result)

这一句的目的是寻找等号并避免重复:

if src\[i:i + 2\] == b'3d' and src\[i - 2:i\] != b'3d':

这一句的目的是将局部(4个字符)解码,41即A的ascii码,在解码后变成0的串

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)

最终程序的输出是二进制位串,可以进行下一步处理。是一个位串转字符串的网站。