CTF新手必看:用010Editor和CRC校验,5分钟揪出被篡改的PNG图片宽高
CTF新手实战5分钟掌握PNG图片宽高篡改检测技巧当你第一次参加CTF比赛面对一张无法正常显示的PNG图片时是否感到无从下手这很可能是题目设计者修改了图片的宽高参数。作为MISC方向的基础题型掌握快速检测PNG图片宽高是否被篡改的技能能让你在比赛中抢占先机。1. 理解PNG文件结构与关键参数PNG文件由多个数据块(chunk)组成每个块包含长度、类型、数据和CRC校验值。其中IHDR块存储着图片的关键元数据包括宽度4字节高度4字节位深度1字节颜色类型1字节压缩方法1字节滤波器方法1字节隔行扫描方法1字节这些参数共同决定了图片的显示方式。修改宽高而不更新CRC校验值是CTF题目中常见的设置陷阱。提示CRC校验是一种错误检测机制用于验证数据在传输或存储过程中是否被修改。PNG文件对每个数据块都计算了CRC值。2. 快速检测宽高篡改的三种方法2.1 使用010Editor自动检测010Editor是二进制文件分析的利器其内置的PNG模板能自动校验CRC用010Editor打开可疑PNG文件系统会自动加载PNG模板查看左下角状态栏若显示CRC Mismatch则宽高很可能被修改若显示CRC OK则宽高可能未被篡改# 010Editor命令行快速检查CRC 010Editor filename.png -template:PNG.bt2.2 对比属性查看器数据Windows自带的图片属性查看器会读取实际显示的宽高而十六进制编辑器显示的是文件头中存储的值工具类型数据来源可靠性图片属性查看器实际显示尺寸可能被欺骗010Editor/HxD文件头原始数据更可信操作步骤右键图片 → 属性 → 详细信息记录宽高用010Editor打开同一文件定位到IHDR块对比两个宽高值是否一致2.3 肉眼观察图片显示异常被篡改宽高的图片通常会出现以下现象完全无法打开显示为纯色或杂乱图案只有部分内容可见图片底部出现异常条纹这些视觉线索能快速提示可能存在宽高篡改但需要结合工具验证。3. 深入理解CRC校验机制CRC校验是检测宽高篡改的核心原理。PNG文件的每个数据块都包含长度字段4字节类型字段4字节数据字段N字节CRC字段4字节CRC值是根据类型字段和数据字段计算得出的。修改宽高数据后若不更新CRC就会导致校验失败。计算CRC的Python示例import binascii # IHDR块数据不包括长度和CRC ihdr_data b\x49\x48\x44\x52\x00\x00\x05\x1C\x00\x00\x05\x00\x08\x06\x00\x00\x00 # 计算CRC32 crc32 binascii.crc32(ihdr_data) 0xFFFFFFFF print(hex(crc32)) # 输出0x6F03AD714. 实战演练从检测到修复4.1 检测流程总结完整的宽高篡改检测应遵循以下步骤初步观察图片是否能正常显示是否有明显异常工具验证使用010Editor检查CRC状态对比属性查看器与十六进制编辑器中的宽高值辅助工具使用pngcheck命令行工具验证尝试用图片编辑软件重新保存4.2 修复被篡改的宽高发现宽高被篡改后有两种主流修复方法方法一CRC暴力破解通过枚举可能的宽高值找到能使CRC校验通过的正确组合import struct import binascii def find_correct_dimensions(crc32key, widthNone, heightNone): if width is None: # 爆破宽度 for w in range(0, 65535): data b\x49\x48\x44\x52 struct.pack(i, w) height b\x08\x06\x00\x00\x00 if binascii.crc32(data) 0xffffffff crc32key: return w else: # 爆破高度 for h in range(0, 65535): data b\x49\x48\x44\x52 width struct.pack(i, h) b\x08\x06\x00\x00\x00 if binascii.crc32(data) 0xffffffff crc32key: return h return None方法二图片编辑器修复用画图或其他图片编辑器打开被篡改的图片不做任何修改直接另存为新文件新文件会自动生成正确的CRC值4.3 进阶技巧使用pngcheck工具pngcheck是专门用于验证PNG文件的命令行工具能提供详细错误信息pngcheck -v suspicious.png典型输出示例File: suspicious.png (2024 bytes) chunk IHDR at offset 0x0000c, length 13 1384 x 866 image, 24-bit RGB, non-interlaced CRC error in chunk IHDR (computed 6f03ad71, expected 12345678) chunk IDAT at offset 0x00025, length 8192 zlib: deflated, 32K window, default compression chunk IEND at offset 0x02031, length 0 Errors were detected in suspicious.png5. 常见问题与避坑指南5.1 为什么有时修改宽高CRC仍能通过这种情况通常是因为题目设计者同时修改了宽高和对应的CRC值使用了特殊的宽高组合使得CRC巧合匹配图片编辑器在保存时自动修正了CRC5.2 工具显示不一致时的判断策略当不同工具给出矛盾信息时建议优先相信专业十六进制编辑器的数据检查多个CRC校验工具的结果是否一致尝试用脚本验证所有可能性5.3 性能优化技巧暴力破解宽高时可以应用以下优化根据图片内容合理猜测宽高范围优先尝试常见分辨率如800x600、1920x1080等使用多线程加速破解过程from concurrent.futures import ThreadPoolExecutor def parallel_crc_check(crc32key, max_dim10000, threads4): def check_range(start, end): for h in range(start, end): data b\x49\x48\x44\x52\x00\x00\x05\x1c struct.pack(i, h) b\x08\x06\x00\x00\x00 if binascii.crc32(data) 0xffffffff crc32key: return h return None with ThreadPoolExecutor(max_workersthreads) as executor: chunk_size max_dim // threads futures [] for i in range(threads): start i * chunk_size end (i 1) * chunk_size if i ! threads - 1 else max_dim futures.append(executor.submit(check_range, start, end)) for future in futures: result future.result() if result is not None: return result return None在实际CTF比赛中遇到图片显示异常时我通常会先用010Editor快速检查CRC状态这能节省大量盲目尝试的时间。记住有效的诊断比盲目的修复更重要——先确定问题所在再针对性解决这才是高手的高效解题之道。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2603646.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!