当前位置: 首页 > article >正文

CTF新手必看:用Python脚本修复被篡改的PNG图片宽高(附CRC校验原理详解)

CTF实战Python脚本修复PNG图片宽高与CRC校验原理全解析当你第一次在CTF比赛中遇到一张无法正常显示的PNG图片时可能会感到困惑。这张图片看起来像是被故意破坏了但其中很可能隐藏着关键的Flag信息。本文将带你深入理解PNG文件结构掌握CRC校验原理并手把手教你编写Python脚本来自动修复被篡改的图片宽高参数。1. PNG文件结构与CRC校验基础PNGPortable Network Graphics文件由多个数据块chunks组成每个数据块都有特定的结构和功能。理解这些结构是修复损坏图片的第一步。一个典型的PNG文件包含以下关键数据块文件头签名8字节的固定值89 50 4E 47 0D 0A 1A 0A用于标识PNG文件IHDR块包含图像的基本信息宽、高、位深、颜色类型等IDAT块存储实际的图像数据IEND块标记文件结束其中IHDR块是我们关注的重点它的结构如下字段长度(字节)说明宽度4大端存储的图像宽度高度4大端存储的图像高度位深1每个通道的位数如8颜色类型10灰度、2RGB、3调色板、4灰度alpha、6RGBalpha压缩方法1通常为0deflate压缩滤波方法1通常为0自适应滤波隔行扫描10非隔行或1Adam7隔行每个数据块包括IHDR都有一个CRC校验码它是根据数据块类型和数据内容计算得出的32位循环冗余校验值。CRC校验的核心作用是确保数据在传输或存储过程中没有被意外或故意修改。提示在CTF比赛中出题人常常会修改IHDR中的宽高值但不更新CRC校验码导致图片无法正常显示。这正是我们需要修复的情况。2. CRC校验原理深度解析CRCCyclic Redundancy Check校验是一种广泛使用的错误检测技术它基于多项式除法原理。理解CRC的计算方式对于编写修复脚本至关重要。CRC校验的基本特点计算速度快适合硬件实现对突发错误有很好的检测能力校验码长度固定PNG使用CRC-32即32位校验码CRC-32的计算过程可以概括为初始化一个32位的寄存器为全10xFFFFFFFF对每个输入字节与寄存器高位进行异或对寄存器进行8次移位操作根据最低位决定是否与多项式0xEDB88320异或处理完所有数据后对寄存器值取反在Python中我们可以直接使用binascii.crc32函数来计算CRC值import binascii data bIHDR struct.pack(i, width) struct.pack(i, height) b\x08\x02\x00\x00\x00 crc32 binascii.crc32(data) 0xffffffff注意 0xffffffff操作是为了确保结果是无符号32位整数避免Python自动转换为负数。3. 手动分析与修复损坏的PNG让我们通过一个实际案例来学习如何手动分析并修复被篡改的PNG文件。假设我们有一个名为corrupted.png的文件无法正常显示。步骤1使用十六进制编辑器查看文件推荐工具010 EditorWindows/MacBlessLinuxxxd命令行工具使用010 Editor打开文件我们可以看到类似如下的结构00000000: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 .PNG........IHDR 00000010: 00 00 03 84 00 00 00 96 08 02 00 00 00 76 EC 1E .............v.. 00000020: 40 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00 ....sRGB.......关键字段解析0000000C-0000000FIHDR数据块长度13字节即0x0000000D00000010-00000013IHDR标识IHDR00000014-00000017宽度0x00000384 900像素00000018-0000001B高度0x00000096 150像素0000001C-0000001FCRC校验码0x76EC1E40步骤2验证CRC校验码计算IHDR数据块的CRC值并与文件中存储的校验码比较import binascii # IHDR数据块内容不包括长度和类型字段 ihdr_data b\x49\x48\x44\x52\x00\x00\x03\x84\x00\x00\x00\x96\x08\x02\x00\x00\x00 calculated_crc binascii.crc32(ihdr_data) 0xffffffff stored_crc 0x76EC1E40 print(f计算CRC: {hex(calculated_crc)}) print(f存储CRC: {hex(stored_crc)}) print(f是否匹配: {calculated_crc stored_crc})如果输出显示不匹配说明宽高参数可能被篡改。4. 自动化修复Python爆破脚本编写手动修改宽高并验证CRC效率低下我们可以编写Python脚本自动爆破正确的宽高值。以下是完整的脚本实现import binascii import struct def fix_png_dimensions(filename): # 读取PNG文件 with open(filename, rb) as f: png_data f.read() # 提取IHDR数据块中的CRC校验码大端序 ihdr_crc png_data[29:33] stored_crc struct.unpack(I, ihdr_crc)[0] # IHDR数据块固定部分 chunk_type png_data[12:16] # IHDR chunk_rest png_data[24:29] # 位深、颜色类型等 print(f开始爆破CRC: {hex(stored_crc)}...) # 尝试可能的宽高组合 for width in range(1, 2000): for height in range(1, 2000): # 构造IHDR数据块内容 data chunk_type struct.pack(i, width) struct.pack(i, height) chunk_rest # 计算CRC calculated_crc binascii.crc32(data) 0xffffffff if calculated_crc stored_crc: print(f找到匹配的宽高: {width}x{height}) print(f宽度(hex): {hex(width)}) print(f高度(hex): {hex(height)}) # 修复文件 fixed_data png_data[:16] struct.pack(i, width) struct.pack(i, height) png_data[24:] with open(fixed.png, wb) as f: f.write(fixed_data) print(已生成修复后的文件: fixed.png) return print(未找到匹配的宽高组合) # 使用示例 fix_png_dimensions(corrupted.png)脚本优化技巧并行计算对于大范围搜索可以使用多进程加速智能范围根据图片内容猜测可能的宽高比例缩小搜索范围增量搜索先以较大步长搜索找到大致范围后再精细搜索from multiprocessing import Pool def check_dimensions(args): width, height, chunk_type, chunk_rest, stored_crc args data chunk_type struct.pack(i, width) struct.pack(i, height) chunk_rest calculated_crc binascii.crc32(data) 0xffffffff return (width, height) if calculated_crc stored_crc else None def parallel_fix_png(filename): with open(filename, rb) as f: png_data f.read() stored_crc struct.unpack(I, png_data[29:33])[0] chunk_type png_data[12:16] chunk_rest png_data[24:29] # 创建参数列表 params [(w, h, chunk_type, chunk_rest, stored_crc) for w in range(1, 2000) for h in range(1, 2000)] with Pool() as pool: results pool.map(check_dimensions, params) for result in results: if result: print(f匹配的宽高: {result[0]}x{result[1]}) return5. 实战案例与进阶技巧让我们通过几个实际CTF题目来巩固所学知识。案例1基础CRC修复给定一个损坏的PNG文件已知CRC校验码为0xEC9CCBC6但宽高被修改。使用我们的脚本可以在几秒内找到正确的宽高组合如900x606。案例2GIF文件中的CRC修复有些CTF题目会使用GIF文件原理类似但需要注意GIF文件由多个图像块组成每个都有自己的逻辑屏幕描述符需要修复的可能是某个帧的宽高工具推荐gifsplit可以将GIF分解为单帧def fix_gif_dimensions(gif_file): # 分解GIF为单帧 subprocess.run([gifsplit, gif_file]) # 对每帧应用PNG修复技术 for frame in glob.glob(frame_*.gif): fix_png_dimensions(frame)案例3结合LSB隐写的综合题目有时CRC修复只是第一步修复后的图片可能还包含LSB隐写先修复PNG宽高使图片正常显示使用StegSolve工具分析LSB隐写提取隐藏信息获取最终Flagfrom PIL import Image import numpy as np def extract_lsb(image_path): img Image.open(image_path) pixels np.array(img) # 提取每个颜色通道的最低位 lsb (pixels 1) * 255 lsb_img Image.fromarray(lsb.astype(uint8)) lsb_img.save(lsb_extracted.png)性能优化技巧使用Cython或Numba加速CRC计算对已知比例的图片如1:1、4:3、16:9优先搜索缓存中间计算结果避免重复计算# 使用Numba加速的CRC计算 from numba import jit jit(nopythonTrue) def crc32_numba(data, crc0xffffffff): for byte in data: crc ^ byte 24 for _ in range(8): if crc 0x80000000: crc (crc 1) ^ 0x04C11DB7 else: crc 1 return crc 0xffffffff掌握这些技术后你将能够应对大多数CTF比赛中与PNG文件修复相关的挑战。记住理解原理比记住工具更重要这将帮助你在遇到变种题目时能够灵活应对。

相关文章:

CTF新手必看:用Python脚本修复被篡改的PNG图片宽高(附CRC校验原理详解)

CTF实战:Python脚本修复PNG图片宽高与CRC校验原理全解析 当你第一次在CTF比赛中遇到一张无法正常显示的PNG图片时,可能会感到困惑。这张图片看起来像是被故意破坏了,但其中很可能隐藏着关键的Flag信息。本文将带你深入理解PNG文件结构&#x…...

【NotebookLM数据可视化黄金法则】:20年AI工具实战总结的7大避坑指南

更多请点击: https://intelliparadigm.com 第一章:NotebookLM数据可视化的核心价值与适用边界 NotebookLM 是 Google 推出的基于用户上传文档构建语义理解模型的实验性工具,其原生不支持传统图表渲染,但可通过导出结构化数据并联…...

Vue项目打印凭证纸保姆级教程:用JS动态注入@media print样式,告别全局污染

Vue项目动态打印方案实战:精准控制凭证纸与A4布局的JS样式注入技术 在财务系统和ERP开发中,打印功能往往是最容易被忽视却最影响用户体验的环节。传统Vue项目中直接使用media print会遇到一个致命问题——当同一个页面需要支持A4报表和76mm130mm凭证纸两…...

手把手教你用C语言写一个Linux文件监控工具:基于fanotify的实战教程

从零构建Linux文件监控工具:fanotify深度实践指南 1. 为什么选择fanotify而非inotify? 在Linux系统监控领域,inotify曾是文件监控的事实标准,但它在现代安全需求面前逐渐显露出局限性。fanotify作为内核2.6.36引入的增强机制&…...

网盘直链解析工具:本地化下载解决方案完全指南

网盘直链解析工具:本地化下载解决方案完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / …...

Dreamweaver CS6:从零到一构建你的第一个响应式网站

1. 为什么选择Dreamweaver CS6做响应式网站 十年前我刚入行时,Dreamweaver CS6就是我的第一个网页设计工具。那时候它已经支持可视化拖拽和代码编辑双模式,特别适合像我这样刚接触前端的新手。现在虽然新版本层出不穷,但CS6依然有三大不可替代…...

3分钟掌握WechatDecrypt:微信聊天记录解密的终极解决方案

3分钟掌握WechatDecrypt:微信聊天记录解密的终极解决方案 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因更换手机而丢失珍贵的微信聊天记录?或者不小心删除了重要的商务…...

怎样高效配置LXMusic开源音源:专业级音乐播放的3大进阶策略

怎样高效配置LXMusic开源音源:专业级音乐播放的3大进阶策略 【免费下载链接】LXMusic音源 lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/guoyue2010/lxmusic- 在数字音乐时代,高效的音乐播放器配置成…...

【Vivado】从零到一:深入解析Clock IP核的配置与实战应用

1. 初识Vivado Clock IP核:你的数字电路"心跳发生器" 想象一下,数字电路就像一个人体,而时钟信号就是维持生命的心跳。在FPGA设计中,Clock IP核就是专门负责生成这种"心跳"的智能模块。我第一次接触Vivado的C…...

如何在macOS上畅玩Windows游戏和应用:Whisky完整实战指南

如何在macOS上畅玩Windows游戏和应用:Whisky完整实战指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 还在为Mac电脑无法运行Windows专属软件而烦恼吗?是否…...

别只看版本号!思科show version命令里这5个隐藏信息,排错时超有用

思科show version命令的5个排错黄金线索:工程师实战指南 当网络设备突然抽风时,大多数工程师的第一反应是查看日志或运行诊断命令。但有个被严重低估的宝藏命令——show version,它输出的信息远不止版本号那么简单。想象一下,你凌…...

电子发票格式兼容难题?开源Ofd2Pdf三步实现高效自动化转换

电子发票格式兼容难题?开源Ofd2Pdf三步实现高效自动化转换 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf OFD转PDF是处理电子发票、政府公文和电子证照的核心需求,Ofd2Pdf作为…...

别再为Java3D安装头疼了!手把手教你用IDEA 2023.3搞定Java 3D 1.5.1环境(附完整测试代码)

从零构建Java 3D开发环境:IntelliJ IDEA 2023.3终极配置指南 第一次接触Java 3D的开发者在配置环境时往往会遇到各种"玄学问题"——明明按照教程操作却始终报错,或者运行示例代码时出现诡异的黑屏。本文将彻底解决这些痛点,带你用最…...

Bebas Neue字体完全指南:从入门到精通的终极探索之旅

Bebas Neue字体完全指南:从入门到精通的终极探索之旅 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 还在为设计项目寻找一款既专业又完全免费的字体而烦恼吗?Bebas Neue作为一款采用SIL …...

STM32驱动ATK-4.3寸屏避坑指南:用FSMC模拟8080时序,告别花屏和卡顿

STM32驱动ATK-4.3寸屏实战:FSMC模拟8080时序的深度优化 当你在STM32项目中使用ATK-4.3寸TFTLCD时,是否遇到过屏幕闪烁、显示错位或者刷新率低下的问题?这些常见痛点往往源于对NT35510驱动器时序理解不够深入或FSMC配置不当。本文将带你从硬件…...

LTspice高级玩法:用行为电压源模拟传感器信号,测试你的嵌入式算法

LTspice高级玩法:用行为电压源模拟传感器信号,测试你的嵌入式算法 在嵌入式系统开发中,传感器算法的验证往往是一个令人头疼的问题。真实的物理传感器不仅成本高昂,而且受环境因素影响大,重复测试困难。想象一下&#…...

保姆级教程:在华为2288H V5服务器上搞定Ubuntu 18.04系统安装与RAID 5配置

华为2288H V5服务器Ubuntu 18.04系统安装与RAID 5配置全流程指南 对于刚接触企业级服务器的运维新手来说,华为2288H V5这类高端服务器的初始配置往往令人望而生畏。不同于普通PC的即插即用,服务器配置涉及RAID阵列构建、远程管理工具使用、操作系统定制…...

从ESC社交胸牌看无线Mesh网络在物联网与开源硬件中的实践

1. 项目概述:一枚会“社交”的会议胸牌如果你参加过一些技术峰会,对那种别在胸前的纸质或塑料名牌肯定不陌生。它们的功能通常只有一个:告诉别人你是谁。但在2016年的波士顿嵌入式系统大会(ESC)上,主办方玩…...

告别IP焦虑:用luci-app-aliddns打造永不离线的智能家居网络

告别IP焦虑:用luci-app-aliddns打造永不离线的智能家居网络 【免费下载链接】luci-app-aliddns OpenWrt/LEDE LuCI for AliDDNS 项目地址: https://gitcode.com/gh_mirrors/lu/luci-app-aliddns 你是否曾因为IP地址变动而无法远程访问家里的NAS?是…...

3分钟掌握Navicat密码找回:免费开源工具的终极使用指南

3分钟掌握Navicat密码找回:免费开源工具的终极使用指南 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 你是否曾经因为忘记Navicat保存的数据…...

开源项目chatgpt-artifacts:为ChatGPT实现Claude式并排视图,支持多模型部署

1. 项目概述:将Claude的Artifacts功能带到ChatGPT 如果你和我一样,既是ChatGPT的重度用户,又对Anthropic的Claude 3.5 Sonnet新推出的Artifacts功能眼馋不已,那么这个项目绝对值得你花时间折腾一下。简单来说, chatg…...

LLM-Hub:快速搭建AI应用原型的开源集成平台实践指南

1. 项目概述:一个面向开发者的LLM应用集成与实验平台最近在折腾大语言模型应用开发的朋友,估计都遇到过类似的烦恼:想快速验证一个想法,结果光是把模型跑起来、搭个简单的Web界面、处理一下上下文长度限制,就得花上大半…...

从冷冰冰播报到“会呼吸的语音”:ElevenLabs非正式情绪语音落地4大行业案例(客服话术/有声书/AI陪伴/短视频配音),含真实AB测试CTR提升27%数据

更多请点击: https://intelliparadigm.com 第一章:从冷冰冰播报到“会呼吸的语音”:ElevenLabs非正式情绪语音的技术跃迁 传统TTS系统常陷入语调扁平、节奏机械、情感缺失的困境——即便输入“我太开心了!”,输出也如…...

OpenTester:轻量级网络与服务测试工具集实战指南

1. 项目概述与核心价值最近在折腾一些开源项目,特别是涉及到网络连通性、服务状态探测这类基础但至关重要的功能时,总是需要一套趁手的工具。自己写脚本吧,功能单一,复用性差;用现成的商业工具,又觉得不够透…...

XRZero-G0:机器人灵巧操作数据采集的创新解决方案

1. XRZero-G0:机器人灵巧操作的数据采集革命在机器人灵巧操作领域,高质量演示数据的获取一直是制约技术发展的关键瓶颈。传统的主从遥操作(Master-Slave Teleoperation)虽然能提供精确的本体感受数据,但存在硬件成本高…...

书匠策AI:一个让你“毕业不秃头“的论文神器,到底藏了什么黑科技?

各位同学,先做个灵魂拷问:你有没有在凌晨三点对着空白的Word文档,大脑一片空白,感觉自己不是在写论文,而是在跟一堵墙对视? 别慌,今天给你们安利一个我最近挖掘到的"论文外挂"——书…...

NotebookLM知识库搭建,为什么83%的企业6个月内弃用?——基于17家客户POC数据的失效根因与重建框架

更多请点击: https://intelliparadigm.com 第一章:NotebookLM企业知识库搭建 NotebookLM 是 Google 推出的基于用户自有文档的 AI 助手,其核心能力在于对上传资料进行语义理解与上下文追问。在企业场景中,它可作为轻量级、隐私优…...

基于光栅的光谱学单色仪

光谱学--对光的光谱(波长)组成的研究--仍然是光学的一个重要研究领域。采用衍射元件的色散行为来分离不同方向的入射光的不同光谱成分的多色器或单色器由于其易于使用和可调整性,经常被选择用于这项任务,。。在高速物理光学建模和…...

别再只调包了!深入OpenCV底层:我是如何用‘土办法’手动提取特征实现水果分类的

从调包到造轮子:OpenCV手工特征工程实战水果分类 当所有人都在讨论如何用YOLOv8实现99%准确率时,我却在思考:如果回到没有预训练模型的时代,我们该如何用最基础的图像处理技术解决分类问题?这就像在自动驾驶时代重新学…...

在OpenClaw项目中配置Taotoken作为OpenAI兼容后端的详细方法

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在OpenClaw项目中配置Taotoken作为OpenAI兼容后端的详细方法 对于使用OpenClaw这类智能体框架的开发者而言,将后端大模…...