附件下载之后是这样:
这道题很像BASE64隐写,但是少了一些东西,用脚本添上:
import base64
def count_padding_chars(encoded_str):
length = len(encoded_str)
remainder = length % 4
padding_needed = 4 - remainder if remainder else 0
return padding_needed
def read_lines_from_file(filename):
lines = []
with open(filename, 'r') as file:
for line in file:
lines.append(line.rstrip())
return lines
def add_padding_chars(encoded_str, padding_needed):
encoded_str += '=' * padding_needed
return encoded_str
def write_lines_to_file(lines, output_filename):
with open(output_filename, 'w') as file:
for line in lines:
file.write(line + '\n')
def main():
input_filename = 'f380d850e6ebdb19b7d0743.txt'
output_filename = '1.txt'
lines = read_lines_from_file(input_filename)
processed_lines = []
for line in lines:
padding_needed = count_padding_chars(line)
padded_line = add_padding_chars(line, padding_needed)
processed_lines.append(padded_line)
write_lines_to_file(processed_lines, output_filename)
print(output_filename)
if __name__ == "__main__":
main()
好啦,现在是酱紫:
再用base64隐写的脚本跑一下就出来FLAG:
# base64隐写
import base64
def get_diff(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in range(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res
def b64_stego_decode():
file = open("1.txt", "rb")
x = '' # x即bin_str
lines = file.readlines()
for line in lines:
l = str(line, encoding="utf-8")
stego = l.replace('\n', '')
# print(stego)
realtext = base64.b64decode(l)
# print(realtext)
realtext = str(base64.b64encode(realtext), encoding="utf-8")
# print(realtext)
diff = get_diff(stego, realtext) # diff为隐写字串与实际字串的二进制差值
n = stego.count('=')
if diff:
x += bin(diff)[2:].zfill(n * 2)
else:
x += '0' * n * 2
i = 0
flag = ''
while i < len(x):
if int(x[i:i + 8], 2):
flag += chr(int(x[i:i + 8], 2))
i += 8
print(flag)
if __name__ == '__main__':
b64_stego_decode()
然后跑出的结果就是FLAG了