CTF 题目 FileStoragedat 暗示的解题线索:微信中的 FileStorage 文件夹

2024-09-21
来源:网络整理

直接说重点。

下载完题目附件后,里面只有一个名为“keli.dat”的文件,我用十六进制编译器打开,并没有发现什么有价值的线索。

再次回顾题目,发现题目描述特别强调了“有用的标题”,而这道题的题目是“”。“”的字面意思就是“文件存储”,而“dat”一般是作为数据文件的后缀。那么这是什么?在传递什么暗示呢?

玩CTF的时候,知识真的很重要。因为题目内容往往包罗万象,一旦触及到自己的知识储备盲区,就毫无头绪了;但如果你恰好掌握了相关知识,解题就是水到渠成了的事情。就是这么回事。

PC版微信里恰好有一个名为“ ”的文件夹,里面保存的大部分文件恰好都是“.dat”文件。如下图所示。

因此标题给出的文件很有可能是微信资源缓存文件,是一个加密的数据文件。

那么,提问者希望我们做的就是解密并恢复为原始文件,这就需要我们知道微信的“.dat”文件是如何加密的。

其实很简单,就是“异或”,将原文件每个字节与某个值进行异或后保存为“.dat”文件,这里的key就是参与运算的值,也就是密钥,它是加密时随机生成的,我们并不知道。

不过,我们可以尝试一下。

比如说,如果原始文件是JPG图片,JPG文件的前两个字节固定为“FFD8”,那么我们可以将其和“.dat”文件的前两个字节进行异或,如果两个字节值相等,就证明原始文件是JPG文件,得到的值就是密钥。为什么呢?

微信的dat文件如何打开_微信打开文件打不开怎么回事_微信打开文件大写数字变小写

因为原始文件的每个字节都是和同一个值进行异或的,那么再将原始文件数据和加密文件数据进行异或就可以恢复出这个值,而且一定是每个字节都和加密文件的数据相同,各个部分都是相等的。

因此通过比较前两个字节的操作值是否相等,就可以判断是否是尝试的文件类型,一旦尝试成功,key的值也就确定了。

微信缓存的资源文件大多是图片、视频、压缩文件等,我们可以用常见的文件类型逐个尝试,有很大概率是可以成功的。

思路清楚了,我们就可以写脚本了,代码如下。

import os
def xor_file(f_path:str): f_head = { 'jpg':(0xff, 0xd8), 'png':(0x89, 0x50), 'bmp':(0x42, 0x4d), 'gif':(0x47, 0x49), 'avi':(0x41, 0x56), 'zip':(0x50, 0x4b), 'rar':(0x52, 0x61), } with open(f_path, 'rb') as f: f_data = [byte for byte in f.read()] for key, value in f_head.items(): xfound = (x := value[0] ^ f_data[0]) == value[1] ^ f_data[1] if xfound: nf_path = '.'.join((os.path.splitext(f_path)[0], key)) print(f'{f_path} => {nf_path}...', end='') with open(nf_path, 'wb') as f: f.write(bytes([byte ^ x for byte in f_data])) print('...Done') break return xfound
if not xor_file('keli.dat'): print('Unknown file')

运行脚本,显示以下内容。

keli.dat => keli.png......完成

成功恢复了一个PNG图片文件,打开后直接可以看到Flag。

完美的!

本脚本就是为了解决这个问题而写的,经测试对其他微信资源缓存文件有效,可以直接用它恢复你想要的文件,不过只用于合法取证,不能用来干坏事哦!!!

分享