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,需手动检查这些未知字段。