2024ISCC练武题MISC:FunZip(内含base64隐写及补充数据脚本)

附件下载之后是这样:

这道题很像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了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值