3. Misc-图片隐写-EXIF信息
任务目标
给定一张包含隐藏信息的图片文件,通过提取并分析其EXIF元数据,找到隐藏在其中的flag字符串。本案例使用一张示例图片演示完整流程。
环境准备
需要Python 3.6+环境,并安装Pillow库(用于读取EXIF信息)。也可使用exiftool命令行工具作为替代方案。
pip install Pillow
示例图片生成
为便于复现,先构造一张包含隐藏flag的示例图片(实际CTF题目中图片由出题人提供):
from PIL import Image
from PIL.ExifTags import TAGS
# 创建一张简单图片并写入EXIF信息
img = Image.new('RGB', (100, 100), color='red')
exif_data = Image.Exif()
exif_data[0x010E] = "CTF{EXIF_1s_4lw4ys_1nf0rm4t1v3}" # ImageDescription标签
exif_data[0x0131] = "CTF{hidden_in_software}" # Software标签
img.save('challenge.jpg', exif=exif_data)
print("示例图片已生成: challenge.jpg")
核心代码:提取EXIF信息
from PIL import Image
from PIL.ExifTags import TAGS
def extract_exif_info(image_path):
"""提取图片所有EXIF信息并返回字典"""
try:
img = Image.open(image_path)
exif = img.getexif()
if not exif:
print("[-] 该图片不包含EXIF信息")
return {}
exif_dict = {}
for tag_id, value in exif.items():
tag_name = TAGS.get(tag_id, tag_id)
exif_dict[tag_name] = value
print(f"[+] {tag_name}: {value}")
return exif_dict
except Exception as e:
print(f"[-] 读取失败: {e}")
return {}
def find_flag(exif_dict):
"""在EXIF信息中搜索flag模式"""
flag_pattern = ['CTF{', 'flag{', 'FLAG{']
for key, value in exif_dict.items():
if isinstance(value, str):
for pattern in flag_pattern:
if pattern in value:
print(f"\n[!] 发现flag! 位于字段 '{key}': {value}")
return value
print("\n[-] 未在EXIF信息中找到flag")
return None
if __name__ == "__main__":
import sys
image_path = sys.argv[1] if len(sys.argv) > 1 else 'challenge.jpg'
print(f"[*] 正在分析图片: {image_path}")
exif_info = extract_exif_info(image_path)
if exif_info:
find_flag(exif_info)
运行与验证
运行方式:
# 1. 生成示例图片
python generate_challenge.py
# 2. 提取并分析EXIF
python extract_exif.py challenge.jpg
预期输出:
[*] 正在分析图片: challenge.jpg
[+] ImageDescription: CTF{EXIF_1s_4lw4ys_1nf0rm4t1v3}
[+] Software: CTF{hidden_in_software}
[!] 发现flag! 位于字段 'ImageDescription': CTF{EXIF_1s_4lw4ys_1nf0rm4t1v3}
验证通过条件:程序能正确列出图片所有EXIF字段,并成功识别出包含CTF{模式的flag字符串。对于真实CTF题目,flag可能藏在任意EXIF字段中(如Make、Model、DateTime、Artist等),需逐一检查所有字段值。
常见问题
- 图片无EXIF信息:部分图片处理工具会自动清除EXIF,可尝试用
exiftool -a file.jpg命令确认;若确实无EXIF,需检查是否有其他隐写方式(如LSB、文件附加数据等)。 - flag为Unicode编码:某些题目会将flag进行编码(如Base64、十六进制),需对可疑字段值进行额外解码尝试。
- 非标准EXIF字段:部分出题人会使用厂商自定义字段,此时
TAGS.get()返回原始数字ID,需手动检查这些未知字段。