文章目录
- 一、题目
- 二、思路
- 1、知识点
- 三、复现
- 1、利用工具
- 2、利用脚本
- 四、总结
一、题目
点击下载后,一个名伪keli.dat的文件。
二、思路
下载完成后,我们利用winhex打开该文件,并没有发现有价值的信息。然后通过该后缀名为jpg、avi等格式也行不通。
重新读题,题目是 FileStoragedat,有经验的小伙伴可能会知道, FileStorage是微信存储数据的一个文件夹,该文件加下存放的是经过加密后微信中发送、接受的图片而形成的文件后缀为dat的文件。就是微信dat文件。想要做出这到题来,就得先弄懂微信dat文件形成的原因。
1、知识点
微信dat文件
微信的dat文件,将微信图片的每个字节通过异或运算后,保存为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 | 504B0304 |
RAR | 52617221 |
AVI | 41564920 |
先以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:bugku{WeChatwithSteg0}
2、利用脚本
想要成为一名合格的黑客,必须要学会编程,拒绝做脚本小子。我很菜,但是也在不断学习,这里借鉴一个大佬的脚本。
# -*- coding: utf-8 -*-
# @Time : 3/27/2019 21:54
# @Author : MARX·CBR
# @File : 微信Dat文件转图片.pyimport 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)for fn in fsinfo:temp_path = os.path.join(f, fn)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)
复制代码
四、总结
1、微信dat文件的生成原理。
2、利用工具解码。
3、利用脚本解码。