CTF 常见文件头标识速查手册¶
文件头(File Header)也称为魔术字节(Magic Bytes)或文件签名(File Signature),是文件开头的特定字节序列,用于识别文件类型。
目录¶
图像文件¶
JPEG / JPG¶
变体: - FF D8 FF E0 - JFIF 格式 - FF D8 FF E1 - EXIF 格式(相机拍摄) - FF D8 FF E2 - ICC 配置文件 - FF D8 FF DB - Samsung D500
PNG¶
文件头: 89 50 4E 47 0D 0A 1A 0A
文件尾: 49 45 4E 44 AE 42 60 82 (IEND块)
偏移: 0x00
ASCII: .PNG....
扩展名: .png
用途: LSB隐写、数据块隐写、高度宽度修改
关键数据块: - IHDR (49 48 44 52) - 图像头部 - PLTE (50 4C 54 45) - 调色板 - IDAT (49 44 41 54) - 图像数据 - IEND (49 45 4E 44) - 图像结束
GIF¶
版本: - GIF87a - 1987年标准 - GIF89a - 1989年标准(支持透明和动画)
BMP (Bitmap)¶
其他BMP变体: - BA - OS/2 Bitmap Array - CI - OS/2 Color Icon - CP - OS/2 Color Pointer - IC - OS/2 Icon - PT - OS/2 Pointer
TIFF¶
文件头: 49 49 2A 00 (Little Endian)
或 4D 4D 00 2A (Big Endian)
偏移: 0x00
ASCII: II*. 或 MM.*
扩展名: .tif, .tiff
用途: 元数据隐写、多页图像
WEBP¶
ICO (Icon)¶
SVG¶
压缩文件¶
ZIP¶
文件头: 50 4B 03 04 (本地文件头)
或 50 4B 05 06 (中央目录结束)
或 50 4B 07 08 (跨区文件)
文件尾: 50 4B 05 06
偏移: 0x00
ASCII: PK..
扩展名: .zip, .jar, .apk, .docx, .xlsx, .pptx
用途: 最常见的隐藏载体、伪加密、CRC爆破
ZIP签名详解: - 50 4B 03 04 - Local File Header - 50 4B 01 02 - Central Directory File Header - 50 4B 05 06 - End of Central Directory
RAR¶
文件头: 52 61 72 21 1A 07 00 (RAR 1.5+)
或 52 61 72 21 1A 07 01 00 (RAR 5.0+)
偏移: 0x00
ASCII: Rar!....
扩展名: .rar
用途: 密码爆破、卷标隐写
7Z¶
GZIP¶
BZIP2¶
TAR¶
XZ¶
LZ¶
CAB (Cabinet)¶
文档文件¶
PDF¶
文件头: 25 50 44 46 2D
文件尾: 25 25 45 4F 46 或 0D 0A 25 25 45 4F 46 0D 0A
偏移: 0x00
ASCII: %PDF-
扩展名: .pdf
用途: 隐藏对象流、注释隐写、JavaScript
版本标识: - %PDF-1.0 到 %PDF-2.0
DOC (MS Word 97-2003)¶
DOCX (Office Open XML)¶
RTF (Rich Text Format)¶
XML¶
HTML¶
文件头: 3C 21 44 4F 43 54 59 50 45 20 68 74 6D 6C
或 3C 68 74 6D 6C
或 3C 68 65 61 64
ASCII: <!DOCTYPE html 或 <html 或 <head
扩展名: .html, .htm
用途: Web页面、XSS
音视频文件¶
MP3¶
ID3标签: - ID3v1 - 文件末尾128字节 - ID3v2 - 文件开头
MP4 / M4A / MOV¶
文件头: 00 00 00 (14|18|1C|20) 66 74 79 70
偏移: 0x00
ASCII: ....ftyp
扩展名: .mp4, .m4a, .m4v, .mov, .3gp
用途: 视频隐写、元数据
ftyp类型: - ftypisom - ISO Base Media - ftypmp42 - MPEG-4 Part 2 - ftypM4A - Apple iTunes AAC - ftypqt - QuickTime
AVI¶
WAV (Wave Audio)¶
FLAC¶
OGG¶
MIDI¶
MKV (Matroska)¶
可执行文件¶
ELF (Linux)¶
架构标识(第5字节): - 01 - 32位 - 02 - 64位
字节序(第6字节): - 01 - Little Endian - 02 - Big Endian
PE (Windows EXE/DLL)¶
文件头: 4D 5A
PE签名: 50 45 00 00 (在偏移0x3C指向的位置)
偏移: 0x00
ASCII: MZ
扩展名: .exe, .dll, .sys, .ocx
用途: Windows可执行文件、逆向分析
DOS头:MZ (Mark Zbikowski)
Mach-O (macOS)¶
文件头: FE ED FA CE (32-bit Big Endian)
或 CE FA ED FE (32-bit Little Endian)
或 FE ED FA CF (64-bit Big Endian)
或 CF FA ED FE (64-bit Little Endian)
偏移: 0x00
扩展名: (无扩展名或 .dylib)
用途: macOS/iOS可执行文件
Java Class¶
DEX (Dalvik)¶
APK (Android Package)¶
SWF (Flash)¶
文件头: 46 57 53 (未压缩)
或 43 57 53 (ZLIB压缩)
或 5A 57 53 (LZMA压缩)
ASCII: FWS 或 CWS 或 ZWS
扩展名: .swf
用途: Flash动画、漏洞利用
脚本与代码¶
Python编译文件¶
Shell脚本¶
PHP¶
数据库文件¶
SQLite¶
文件头: 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00
偏移: 0x00
ASCII: SQLite format 3.
扩展名: .db, .sqlite, .sqlite3
用途: 数据提取、SQL注入
MySQL MyISAM¶
PostgreSQL¶
磁盘镜像¶
ISO 9660¶
VMDK (VMware)¶
文件头: 4B 44 4D (KDM)
或 23 20 44 69 73 6B 20 44 65 73 63 72 69 70 74 6F 72
ASCII: KDM 或 # Disk Descriptor
扩展名: .vmdk
用途: 虚拟机磁盘
VDI (VirtualBox)¶
QCOW2 (QEMU)¶
VHD (Virtual Hard Disk)¶
加密与证书¶
PGP Public Key¶
文件头: 99 (通常紧随长度字节)
或 2D 2D 2D 2D 2D 42 45 47 49 4E 20 50 47 50
ASCII: -----BEGIN PGP
扩展名: .pgp, .gpg, .asc
RSA Private Key (PEM)¶
文件头: 2D 2D 2D 2D 2D 42 45 47 49 4E 20 52 53 41
ASCII: -----BEGIN RSA PRIVATE KEY-----
扩展名: .pem, .key
X.509 Certificate (DER)¶
SSH Private Key¶
文件头: 2D 2D 2D 2D 2D 42 45 47 49 4E 20 4F 50 45 4E 53 53 48
ASCII: -----BEGIN OPENSSH PRIVATE KEY-----
扩展名: .pem (无扩展名)
PKCS#12¶
其他格式¶
Torrent¶
PCAP (Wireshark)¶
文件头: D4 C3 B2 A1 (标准)
或 A1 B2 C3 D4 (变体)
或 0A 0D 0D 0A (PCAP-NG)
扩展名: .pcap, .cap, .pcapng
用途: 网络流量分析
Lua Compiled¶
QR Code (二维码图片)¶
Base64编码文本¶
Hex编码文本¶
快速查询表¶
图像格式速查¶
| 格式 | 文件头(Hex) | ASCII | 常用扩展名 |
|---|---|---|---|
| JPEG | FF D8 FF | ÿØÿ | .jpg |
| PNG | 89 50 4E 47 0D 0A 1A 0A | .PNG.... | .png |
| GIF | 47 49 46 38 (37|39) 61 | GIF87a/89a | .gif |
| BMP | 42 4D | BM | .bmp |
| TIFF | 49 49 2A 00 / 4D 4D 00 2A | II*. / MM.* | .tif |
| ICO | 00 00 01 00 | - | .ico |
| WEBP | 52 49 46 46 ... 57 45 42 50 | RIFF...WEBP | .webp |
压缩格式速查¶
| 格式 | 文件头(Hex) | ASCII | 常用扩展名 |
|---|---|---|---|
| ZIP | 50 4B 03 04 | PK.. | .zip |
| RAR | 52 61 72 21 1A 07 | Rar!.. | .rar |
| 7Z | 37 7A BC AF 27 1C | 7z¼¯'. | .7z |
| GZIP | 1F 8B 08 | - | .gz |
| BZIP2 | 42 5A 68 | BZh | .bz2 |
| XZ | FD 37 7A 58 5A 00 | .7zXZ. | .xz |
| TAR | 75 73 74 61 72 (偏移257) | ustar | .tar |
| CAB | 4D 53 43 46 | MSCF | .cab |
可执行文件速查¶
| 格式 | 文件头(Hex) | ASCII | 平台 |
|---|---|---|---|
| ELF | 7F 45 4C 46 | .ELF | Linux |
| PE | 4D 5A ... 50 45 | MZ...PE | Windows |
| Mach-O | CF FA ED FE | - | macOS |
| Java | CA FE BA BE | CAFEBABE | JVM |
| DEX | 64 65 78 0A | dex. | Android |
| Class | CA FE BA BE | CAFEBABE | Java |
音视频格式速查¶
| 格式 | 文件头(Hex) | ASCII | 常用扩展名 |
|---|---|---|---|
| MP3 | FF FB / 49 44 33 | ÿû / ID3 | .mp3 |
| MP4 | 00 00 00 (14|18|1C|20) 66 74 79 70 | ....ftyp | .mp4 |
| AVI | 52 49 46 46 ... 41 56 49 20 | RIFF....AVI | .avi |
| WAV | 52 49 46 46 ... 57 41 56 45 | RIFF....WAVE | .wav |
| FLAC | 66 4C 61 43 | fLaC | .flac |
| OGG | 4F 67 67 53 | OggS | .ogg |
文档格式速查¶
| 格式 | 文件头(Hex) | ASCII | 常用扩展名 |
|---|---|---|---|
| 25 50 44 46 | %PDF- | ||
| DOC | D0 CF 11 E0 A1 B1 1A E1 | - | .doc |
| DOCX | 50 4B 03 04 | PK.. | .docx |
| RTF | 7B 5C 72 74 66 31 | {\rtf1 | .rtf |
| XML | 3C 3F 78 6D 6C | <?xml | .xml |
使用工具¶
命令行工具¶
查看文件头(十六进制):
# 查看前16字节
xxd -l 16 file.bin
# 查看前32字节
hexdump -C -n 32 file.bin
# 或使用 head + od
head -c 16 file.bin | od -A x -t x1z
识别文件类型:
搜索文件签名:
# 使用 binwalk
binwalk file.bin
# 使用 foremost
foremost -i file.bin -o output/
# 使用 grep (十六进制)
grep -abo "PNG" file.bin
Python脚本¶
读取文件头:
#!/usr/bin/env python3
def read_file_header(filename, length=16):
"""读取文件头部字节"""
with open(filename, 'rb') as f:
header = f.read(length)
# 十六进制格式
hex_str = ' '.join(f'{b:02X}' for b in header)
# ASCII格式(可打印字符)
ascii_str = ''.join(chr(b) if 32 <= b < 127 else '.' for b in header)
print(f"Hex: {hex_str}")
print(f"ASCII: {ascii_str}")
return header
# 使用示例
read_file_header('file.bin')
识别文件类型:
#!/usr/bin/env python3
FILE_SIGNATURES = {
b'\xFF\xD8\xFF': 'JPEG',
b'\x89\x50\x4E\x47\x0D\x0A\x1A\x0A': 'PNG',
b'\x47\x49\x46\x38': 'GIF',
b'\x50\x4B\x03\x04': 'ZIP',
b'\x52\x61\x72\x21': 'RAR',
b'\x1F\x8B\x08': 'GZIP',
b'\x42\x5A\x68': 'BZIP2',
b'\x25\x50\x44\x46': 'PDF',
b'\x7F\x45\x4C\x46': 'ELF',
b'\x4D\x5A': 'PE/EXE',
}
def identify_file(filename):
"""识别文件类型"""
with open(filename, 'rb') as f:
header = f.read(16)
for signature, filetype in FILE_SIGNATURES.items():
if header.startswith(signature):
return filetype
return 'Unknown'
# 使用示例
print(identify_file('file.bin'))
在线工具¶
- 文件签名数据库:https://www.garykessler.net/library/file_sigs.html
- 在线文件识别:https://hexed.it/
- TrID:https://mark0.net/soft-trid-e.html
CTF 常见技巧¶
1. 文件头修复¶
场景:文件损坏或文件头被修改
# 查看当前文件头
xxd -l 16 broken.png
# 修复PNG文件头
printf '\x89\x50\x4E\x47\x0D\x0A\x1A\x0A' | dd of=broken.png bs=1 count=8 conv=notrunc
# 或使用 Python
python3 -c "
data = open('broken.png', 'rb').read()
fixed = b'\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A' + data[8:]
open('fixed.png', 'wb').write(fixed)
"
2. 文件类型伪装¶
检测方法:
# 1. 检查扩展名与文件头是否匹配
file suspicious.jpg
# 如果输出 "PNG image",说明是伪装
# 2. 查看文件头
xxd -l 16 suspicious.jpg
# 3. 修正扩展名
mv suspicious.jpg real.png
3. 多文件拼接¶
检测:
# 使用 binwalk 扫描
binwalk combined.jpg
# 输出示例:
# 0 0x0 JPEG image
# 524288 0x80000 ZIP archive
# 提取
binwalk -e combined.jpg
# 或手动提取
dd if=combined.jpg of=hidden.zip bs=1 skip=524288
4. IEND后隐藏(PNG)¶
# 查找 IEND 位置
grep -abo "IEND" image.png
# 输出:12345:IEND
# 提取IEND后数据
tail -c +12358 image.png > hidden_data.bin
# (12345 + 12 [IEND块大小] + 1)
5. ZIP伪加密¶
# 检测伪加密
xxd image.zip | grep -A 5 "504b 0304"
# 第7-8字节如果是 09 00 表示加密
# 修改为 00 00 表示未加密
# 修复伪加密
python3 << 'EOF'
data = bytearray(open('fake_encrypted.zip', 'rb').read())
# 找到 PK 头
pos = data.find(b'PK\x03\x04')
if pos != -1:
data[pos+6:pos+8] = b'\x00\x00' # 清除加密标志
open('fixed.zip', 'wb').write(data)
EOF
参考资源¶
文件签名数据库¶
- Gary Kessler's File Signatures:https://www.garykessler.net/library/file_sigs.html
- Wikipedia - List of file signatures:https://en.wikipedia.org/wiki/List_of_file_signatures
- PoC||GTFO Pocorgtfo:https://www.alchemistowl.org/pocorgtfo/
工具资源¶
- Binwalk:https://github.com/ReFirmLabs/binwalk
- Foremost:http://foremost.sourceforge.net/
- TrID:https://mark0.net/soft-trid-e.html
- ExifTool:https://exiftool.org/
标准文档¶
- PNG Specification:https://www.w3.org/TR/PNG/
- JPEG Standard:https://www.w3.org/Graphics/JPEG/
- ZIP Format:https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
- PDF Reference:https://www.adobe.com/devnet/pdf/pdf_reference.html
快速搜索脚本¶
#!/bin/bash
# 批量识别文件类型
echo "=== File Type Identification ==="
echo ""
for file in "$@"; do
echo "File: $file"
# 使用 file 命令
file_type=$(file -b "$file")
echo " Type: $file_type"
# 显示文件头
header=$(xxd -l 16 -p "$file" | sed 's/../& /g')
echo " Header: $header"
# 扫描嵌入文件
embedded=$(binwalk -B "$file" 2>/dev/null | grep -c "0x")
if [ "$embedded" -gt 1 ]; then
echo " Warning: Possible embedded files detected!"
fi
echo ""
done
使用方法:
文档版本:v1.0 更新日期:2025-01 内容来源:CTF实战经验、文件格式标准、开源工具文档
使用建议: 1. 收藏本文档作为快速参考 2. 遇到未知文件时先查文件头 3. 结合工具(file、binwalk、foremost)分析 4. 注意文件头伪装和多文件拼接 5. 熟记常见格式的文件头(JPEG、PNG、ZIP、PDF、ELF)