i春秋 第二届春秋欢乐赛 ReCreators

本文分享了解决一个复杂编码挑战的过程,涉及磁盘镜像文件、多种解码技术和Python脚本编写,最终成功提取隐藏的flag数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依旧不会做,在开头被卡住了,最后看了师傅们的题解跟着复现了下,
考点比较基础,但不得不说这题实在坑,套了好几层编码。


题目给了个27M的无扩展名文件,推测是程序,然鹅并不是,用010打开可以看到一些明文,
010
猜测是磁盘文件之类的, 用file查看了后发现是磁盘镜像文件.
file
然后有三种办法:

  1. 使用加个.vmdk的扩展名(可选), 然后用vm挂载磁盘, 但是一开始不会操作, 就放弃了,
    写文的时候百度了下挂载方法, 成功在挂载给虚拟机了, 但是不知道系统怎么操作, 就又弃坑了, 头大.
  2. 使用R-Studio打开, 然后点驱动器-扫描, 勾上搜索已知文件类型, 待扫描完成, 接着点开原始文件-文档-Text文档, 就会看到两个文本, 而04.txt就是flag数据, 但是按照其他师傅以及复现结果来看, 提取到的flag数据是残缺的, 大概差了100多字节, 导致解不出来. 或者把misc.mp4恢复出来, 手动提取flag数据.
    R-Studio
  3. 使用DiskGenius打开镜像文件, 把misc.mp4提取出来:
    DiskGenius

按照套路, 先打开mp4看一看, 是个二次元动画,
不过居然能播放完(不知道哪个题解说会出错的, 可能是win10自己跳过错误部分了?)

嗯… 那就先不管这么多好了, 用010看看文件内容,
(其实这边应该也要去推测下有没有音频隐写的行为, 但是因为看了wp, 就绕过了)
010
根据插件的解析结果, 发现有两个未知类型的数据段, 可以直接显示成文本, 那这边就把它先提取出来, 保存为flag.hex. 未知数据段
因为数据段可以显示成明文, 所以猜测是做了Hex(Base16)处理, 于是做一次解码.

以前都是用工具配合手动分割做半手解, 但这次数据实在太长了, 只好写代码了(说白了还是工具不行),
其实也有一些在线网站可以直接解未做处理的HEX, 但是保不齐哪天做题不让联网, 所以还是备一些离线工具(手写的也行)

因为已经解过一次了, 所以不想再手解一次, 转为轻松一点的写个脚本处理. (Python3)

import binascii
import base64


def get_continuous_asciis(ranges: list):
    """
    取连续的ASCII文本
    :param ranges: 范围数组, 例[['A', 'B']]
    :return: 
    """
    return ''.join([''.join(map(chr, range(ord(r[0]), ord(r[1]) + 1))) for r in ranges])


with open('flag.hex') as f:
    enc = f.read()

while True:
    b16 = b32 = b64 = False
    if all([i.upper() in '0123456789ABCDEF' for i in enc]):
        b16 = True
    elif all([i.upper() in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ2345678=' for i in enc]):
        b32 = True
    elif all([i.upper() in get_continuous_asciis([['a', 'z'], ['A', 'Z'], ['0', '9']]) + '+/=' for i in enc]):
        b64 = True
    else:
        print('End')
        break
    if b16:
        print('Base16')
        enc = binascii.a2b_hex(enc).decode('utf-8')
    elif b32:
        print('Base32')
        enc = base64.b32decode(enc).decode('utf-8')
    elif b64:
        print('Base64')
        enc = base64.b64decode(enc).decode('utf-8')
    print('-' * 30)
    print(enc)
    print('-' * 30)

效果如下(因为部分文本过长, 做了截取):
run

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值