1、文件头

CTF的取证赛题通常没有扩展名,需要选手自行判断文件类型。有以下两种方法可以识别文件:1.使用支持16进制的文本工具查看文件头;2.使用已有的文件识别工具。

文件识别工具的原理实质上还是从文件头、尾来判断,所以需要先学习一下文件头的相关知识。

文件头:文件头是位于文件开头的一段承担一定任务的数据。有了文件头,操作系统就可以识别这个文件,并用不同的程序来打开这个文件。

用PNG文件举个例子:

image.png

(固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头

(固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13

(固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)

image.png

(可变)13位数据块(IHDR)

(可变)剩余四字节为该PNG的CRC检验码,由从IDCH到IHDR的十七位字节进行CRC计算得到

文件尾:标示整个文件数据的数据结尾。

有些文件尾不是必须有的,比如图像文件

有些文件尾是必须有,且不可随意更改的,比如压缩文件

image.png

上图绿色的部分即为ZIP格式的压缩文件的文件尾,如果更改了其中的值,可能会造成压缩文件无法正常解压,如下图就是文件尾被破坏后,解压软件提示的出错信息。

image.png

2、工具

通常我们都是用十六进制编辑器来查看文件头。

Windows系统

有诸如WinHex、010Editor等大量十六进制编辑器,笔者比较偏爱010editor,它可以将文件中的不同含义的数据块用不同的颜色标示出来,一目了然。

image.png

Linux系统

hexeditor,全键盘操作,不适合对习惯使用鼠标操作的人。

image.png

Hexdump命令

image.png

用这个命令得到结果与在编辑器里看到的数据不一样,个人认为不太好用。

image.png

3、识别文件格式

除了用查看文件头的方式识别外,还有很多工具可以帮助我们更快、更直接的识别未知文件。

Linux系统中,常用 file命令判断文件类型。使用方法很简单,

file 要识别的文件名

image.png

Windows系统中,推荐使用TrID,这个工具能识别近万种文件格式。有DOS版(TrID_dos),和视窗版(TrIDNet)。TrIDNet使用起来相当简单,导入要分析的文件路径后,点击分析按钮即可看到分析结果。

需要注意的是,必需下载官方的字典(一个名为triddefs的压缩包),并在软件中将其导入,才能使用完整功能。

image.png

4、python脚本识别文件

现有的文件识别工具的原理就是提取文件头部的部分字节,然后与字典进行对比,并输出对比结果。Python有一个filetype库,用filetype的官方文档中的示例即可实现识别功能,不过能识别的文件格式较少。

Python3实现:

import struct
import binascii

fTD = { 
    'FFD8FFE1':'JPEG',
    '89504e47':'PNG',
    '47494638':'GIF',
    '49492A00':'TIFF'
    }

openfile = open("8", "r+b")
data = openfile.read(4)
ascii2bin = binascii.hexlify(data)
ascii2bin = ascii2bin.decode('ascii')
if ascii2bin in fTD:
     print(fTD[ascii2bin])
else:
     print('Unknown')
openfile.close()

 

转自:http://www.freebuf.com/column/170820.html