updated:

base64隐写的一种解决办法


这里介绍了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) # 自动补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)

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

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)

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


← Prev BugkuCTF-Misc(1) | 对一段补码算术代码的分析 Next →