图片解题思路
在CTF杂项中,图片解题思路通常围绕隐写术、文件结构分析、元数据挖掘等方向展开,以下是一些常见方法及工具:
一、基础检查与初步分析
- 文件类型确认
使用file命令或十六进制编辑器(如010 Editor)检查文件头,确认是否为真实图片格式。若文件头损坏,需手动修复或进一步分析。 - 元数据(EXIF)分析
通过exiftool查看图片的元数据,如注释、作者、创建时间等。注释字段可能包含Base64编码的字符串或提示信息。 - 文件分离与嵌入内容提取
使用binwalk或foremost工具检测文件内嵌的其他文件(如ZIP、RAR),并自动分离提取。若图片尾部附加了压缩包,需提取后解压,可能需密码爆破。
二、隐写分析
- 最低有效位(LSB)隐写
利用stegsolve工具逐通道分析位平面,或使用zsteg自动检测LSB隐写并提取数据。也可通过Python脚本提取像素的最低有效位,转换为ASCII字符。 - 颜色通道分离与差异分析
使用stegsolve或图像编辑软件(如GIMP、Photoshop)分离RGB通道,观察异常色块或图案。例如,某个通道可能隐藏二维码片段或文本信息。 - 异或、叠加与反色操作
对像素值进行异或、反色等操作,可能还原隐藏的内容。例如,对像素RGB值与特定数值异或(如0xFF)后,隐藏信息可能显现。
三、文件结构解析
- PNG数据块(Chunks)分析
使用pngcheck检查PNG文件的数据块完整性及异常。关键数据块如IHDR(定义宽高、位深等)、IDAT(存储压缩后的图像数据)可能隐藏信息。若IHDR宽高篡改,需修复CRC校验后显示隐藏区域。 - 数据块提取与重组
使用十六进制编辑器定位IDAT块,提取Zlib压缩数据并解压,可能包含Flag或加密内容。
四、高级技巧
- 频域隐写(DCT/FFT)
使用stegsolve的FFT功能或Python库(如NumPy、SciPy)分析频域中的异常图案,可能隐藏信息。 - 盲水印提取
使用openstego等工具提取盲水印,对比两张相似图片的差异信息。 - 二维码/条形码修复
使用在线工具(如Online Barcode Reader)或Python库(如pyzbar、OpenCV)修复受损的二维码或条形码,扫描获取Flag。
五、工具推荐
· 隐写分析:stegsolve、zsteg、steghide
· 文件分离:binwalk(kali)、foremost(kali)
· 十六进制编辑:010 Editor、HxD
· 元数据提取:exiftool(kali)
· 图像处理:GIMP、Photoshop、OpenCV
PNG图像浏览工具:TweakPNG
总结:图片解题需结合多维度分析,从基础检查到高级隐写技术,灵活运用工具和脚本。若遇到复杂问题,可尝试组合多种方法,或通过团队协作分工解决。
misc8
┌──(kali㉿kali)-[~]
└─$ binwalk misc8.png DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 PNG image, 900 x 150, 8-bit/color RGBA, non-interlaced
91 0x5B Zlib compressed data, compressed
3892 0xF34 PNG image, 900 x 150, 8-bit/color RGB, non-interlaced
3954 0xF72 Zlib compressed data, default compression┌──(kali㉿kali)-[~]
└─$ foremost misc8.png
Processing: misc8.png
|*|┌──(kali㉿kali)-[~]
└─$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 Desktop flag.txt misc8.png output py┌──(kali㉿kali)-[~]
└─$ ls output/png
00000000.png 00000007.png
binwalk分析文件,发现有两张图片
也可以用dd提取图片
dd if ="文件路径" of="输出文件" skip=从哪个字节开始 bs=1
也可以用binwalk命令提取文件
binwalk -e 要分解的文件名 //-e分解出压缩包
binwalk -D=jpeg/文件类型/ 要分解的文件名 //-D或者–dd 分解某种类型的文件
bmp文件格式
主要规则:(以24位bmp为例)
- 文件实际大小 头信息+像素+(win的垃圾数)
- 头信息 54字节
- 像素 24位(三字节)为:RGB 一个颜色共三个字节
- win的垃圾数:(Windows默认的扫描的最小单位是4字节,要求数据对齐)
在win中创建的.bmp文件,如果宽不能被4整除(影响行数据)(高没有影响),
则会在每一'行末尾'填充随机数,使得能被4整除;
例:像素大小:201100->存储大小:(201*3)100=603*100(不能被4整除)
是win将自动每行填充一个字节:603->604
使用事项:
- 读取时,先跳过54字节的头信息
- 读取颜色时,注意RGB的顺序读取
- 读取颜色时,应当按行读取,防止读入垃圾数(不应当偷懒整块读取)
(或者,传输的文件宽必须能被4整除)
.bmp文件概念
(.bmp)不是非常常见的图片格式,文件太大,不方便压缩,很多网络操作并不支持使用(还是太大了)
但是,(.bmp)文件格式清晰且简单,图像数据完整且直接以二进制显示,非常适合设备操作和相关学习
(.bmp)(全称:bitmap)是win中的标准图像文件格式,可分为两类:
(DDB)设备相关位图(Device Dependent Bitmap)//适用特定设备的图像处理
(DIB)设备无关位图(Device Independent Bitmap)//适用跨设备共享和传输的图像处理
两者在设备中使用都很广
(.bmp)图像深度可以选择:
1bit(单色)/2bit(4色,CGA)/4bit(16色,VGA)/16bit(增强色)/24bit(真彩色,RGB)/256bit等
24bit(三字节)//以RGB顺序排列,各占一个字节,通过三色调成任意一色
文件头(头信息)
文件头包括:bmp文件头和位图信息头(14 + 40 = 54)
-
bmp文件头(bmp file header):14字节
bfType: 2字节,文件类型//0x4D42->ASCII:BM//一般不变
bfSize: 4字节,文件大小//0x0004B436->308278bit->54byte+301KBbfReserved1: 2字节,保留位,必须设为0
bfReserved1: 2字节,保留位,必须设为0bfOffBits: 4字节,从头到位图数据的偏移(图片信息开始位置)
-
位图信息图(bitmap information):40字节
biSize: 4字节,信息头大小//0x00000028->40//一般不变
biWidth: 4字节,像素单位的宽
biHeight: 4字节,像素单位的高(数据为正->倒立/数据为负->正向)biPlanes: 2字节,颜色平面数//0x0001->1//一般不变
biBitCount: 2字节,比特数/像素数(色彩深度),//24bit例:0x0018->24biCompression:4字节,图像的压缩类型,0(BI_RGB)表示不压缩//一般不变
biSizeImages:4字节,原始位图数据的大小,当用(BI_RGB)格式时,可以设置为0
biXPelsPerMeter: 4字节,横向分辨率
biXPelsPerMeter: 4字节,纵向分辨率biClrUsed: 4字节,颜色索引数,从biBitCount计算,可以设置为0(不表示没有颜色)//24bit->0xFFFFFF种色
biClrimportant: 4字节,重要颜色索引数,可以设置为0(每种颜色都重要)
BMP(位图)是Windows操作系统中广泛使用的一种图像文件格式。由于其不经过压缩,BMP文件往往体积较大。本文将详细介绍如何计算BMP文件的大小。 总结来说,BMP文件的大小取决于其分辨率、颜色深度以及是否包含调色板。具体计算方法如下:
- 单位像素字节数:根据颜色深度计算。例如,1位(黑白)为1字节,8位(256色)为1字节,24位(真彩色)为3字节。
- 总像素字节数:将单位像素字节数乘以图像的宽度和高度。
- 调色板大小:若图像含有调色板,一般为1024字节(256*4),其中4字节表示一个调色板项的颜色信息。
- 文件头大小:BMP文件头一般为54字节。 详细计算步骤:
- 确定图像的宽度和高度,记为Width和Height。
- 确定颜色深度,记为BitsPerPixel(bpp)。
- 根据颜色深度计算单位像素字节数:BytesPerPixel = bpp / 8。
- 计算总像素字节数:TotalBytes = Width * Height * BytesPerPixel。