依旧不会做,在开头被卡住了,最后看了师傅们的题解跟着复现了下,
考点比较基础,但不得不说这题实在坑,套了好几层编码。
题目给了个27M的无扩展名文件,推测是程序,然鹅并不是,用010打开可以看到一些明文,
猜测是磁盘文件之类的, 用file
查看了后发现是磁盘镜像文件.
然后有三种办法:
- 使用加个
.vmdk
的扩展名(可选), 然后用vm挂载磁盘, 但是一开始不会操作, 就放弃了,
写文的时候百度了下挂载方法, 成功在挂载给虚拟机了, 但是不知道系统怎么操作, 就又弃坑了, 头大. - 使用R-Studio打开, 然后点
驱动器
-扫描
, 勾上搜索已知文件类型
, 待扫描完成, 接着点开原始文件
-文档
-Text文档
, 就会看到两个文本, 而04.txt
就是flag数据, 但是按照其他师傅以及复现结果来看, 提取到的flag数据是残缺的, 大概差了100多字节, 导致解不出来. 或者把misc.mp4
恢复出来, 手动提取flag数据.
- 使用DiskGenius打开镜像文件, 把
misc.mp4
提取出来:
按照套路, 先打开mp4看一看, 是个二次元动画,
不过居然能播放完(不知道哪个题解说会出错的, 可能是win10自己跳过错误部分了?)
嗯… 那就先不管这么多好了, 用010看看文件内容,
(其实这边应该也要去推测下有没有音频隐写的行为, 但是因为看了wp, 就绕过了)
根据插件的解析结果, 发现有两个未知类型的数据段, 可以直接显示成文本, 那这边就把它先提取出来, 保存为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)
效果如下(因为部分文本过长, 做了截取):