导语

pillar的刷题日记

[ACTF新生赛2020]base64隐写1

打开解压后是一个提示和一个ComeOn!.txt,其中全是base64加密的一行一行的内容,如果我们用base64解码,会发现是一个c的源文件。hint是一个微信公众号……不如直接去找

base64隐写

假设你理解了base64的原理(应该都理解吧),如果我们要加密的内容不能被6整除的话,我们需要加为0的padding,并在末尾加上等号,在解码的时候会根据等号的个数删去密文的二进制的最后几位。因此我们在padding中可以隐藏信息,反正在解码的时候都会被舍去。

由此我们可以写脚本提取其中的隐写

import base64

b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('ComeOn!.txt', 'rb') as f:
flag = ''
bin_str = ''
res_str = ''
for line in f.readlines():
stegb64 = str(line, "utf-8").strip("\n")
rowb64 = str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("\n")
offset = abs(b64chars.index(stegb64.replace('=', '')[-1]) - b64chars.index(rowb64.replace('=', '')[-1]))
equalnum = stegb64.count('=') # no equalnum no offset
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
# flag += chr(int(bin(offset)[2:].zfill(equalnum * 2), 2))
# print(flag) 这样写得不出正确结果
for i in range(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i + 8], 2))
print(res_str)

即可得到答案ACTF{6aseb4_f33!}