知识点
FileStorage是微信存储数据的一个文件夹,该文件夹下存放的是经过加密后微信里发送、接受的图片而形成的文件后缀为dat的文件。就是微信dat文件。想要做出此题,就得先弄懂微信dat文件形成的原因。
微信的dat文件,将微信图片的各字节通过异或运算后,保存为dat后缀名存储方式。
解题流程
点击下载后,
打开,一个名伪keli.dat的文件
首先我们用winhex等二进制查看工具打开该图片。图片左边的字节为17CE。
这个17CE是重点,我们现在知道图片经过异或运算后,得到的结果是17CE,那么我们这里使用常见的几类图片格式进行逆推。
大概公式:文件头 XOR 17CE = 两个相同的字节。
下图为常见的几类图片文件头格式
后缀名 文件头
JPG FF D8 FF
PNG 89 50 4E 47
BMP 42 4D
GIF 47 49 46 38
ZIP 50 4B 03 04
RAR 52 61 72 21
AVI 41 56 49 20
先以jpg图片格式为例。打开计算器,并调制程序员模式,进行异或运算,输入FFD8 XOR 17CE运算后的结果是E816,先然,各字节和17CE进行异或运算,应该相等才对。所以这张图片并不是jpg格式。
我们以PNG文件头格式为例。png文件头为8950,dat文件头为17CE。经过异或运算后,得到的结果是9E9E。说明原图的各个字节同9E进行异或运算后得到的字节保存后,就是dat文件。
3. 已知dat文件所有字节,已知异或运算字节为9E,所以将这个dat文件的每个字节和9E进行异或运算后,就会得到一张PNG的图片了。思路有了我们进行复现。
三、复现
1、利用工具
一个大佬写的工具:
https://github.com/PiaoZhenJia/WeChatDatFileDecoder
文件下载完毕后,进入bin/debug/路径。运行WpfApp1.exe
手动输入要进行解码的dat文件路径。手动输入文件解码后的保存路径。点击开始转换。
会得到一个png结尾的图片,打开后为flag。
得到flag
方法二:
最好能通过脚本解码dat
import osdef imageDecode(f,fn):dat_read = open(f, "rb")out='P:\\'+fn+".png"png_write = open(out, "wb")for now in dat_read:for nowByte in now:newByte = nowByte ^ 0x36png_write.write(bytes([newByte]))dat_read.close()png_write.close()def findFile(f):fsinfo = os.listdir(f) #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。for fn in fsinfo:temp_path = os.path.join(f, fn) #python路径拼接os.path.join()函数if not os.path.isdir(temp_path):print('文件路径: {}' .format(temp_path))print(fn)imageDecode(temp_path,fn)else:...path = r'C:\Users\Data'
findFile(path)"""
os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
它不包括 . 和 .. 即使它在文件夹里。
"""