misc-图片隐写
PNG
PNG图片特点
首先,先了解下png图片在010editor的呈现
PNG文件格式是一个8字节的标识以及其他后续数据块(IHDR)
这里我们看下前八个字节
1 | 89 50 4E 47 0D 0A 1A 0A |
方法
修改文件格式
所以判断PNG文件格式时,直接将其拖进010editor看前八个字节就好了,是的话改个后缀
倒转文件byte
有的时候打开010editor,发现整个文件的内容全部逆置了,那需要一个小脚本修复一下就好了
1 | a = open('flag.jpg','rb') #以二进制形式读取方式(rb)打开图片 |
添加文件头数据
有的时候文件打不开,放到010editor分析发现头部8字节消失了,写入一下就好了
宽高修改
windows系统对IHDR的检测不严格,修改了宽高不用修改crc,linux要
宽:IHDR后四个字节
高:宽后四个字节
windows平台正常修改就好了
linux还没搞过~~
从图片中提取文件
binwalk
1 | binwalk 1.png #查看图片里面有没有藏文件 |
foremost
1 | foremost 1.png #会生成一个txt文本显示内容,但是伪加密好想要自己修改 |
JPG
JPG图片特点
首先就是标识了
1 | FF D8 FF |
然后就是高宽了:在FF C0后面的7个字节
1 | 00 11 08 01 2C 01 91 |
EXIF信息
在windows操作系统中,查看图片属性的详细信息会显示一堆关键信息,有时候甚至还会藏着经纬度
在ubuntu中我们可以使用查看关键信息
1 | exiftool cat.jpg |
有的时候配合base64编码有特效
1 | echo ",,," | base64 -d |
BMP图片隐写
这个文件格式比较少见,可以无损压缩
文件的标识是前两个字节42 4D
头数据后四位对应图片的内存大小,但要注意计算机是小端序,要从后往左读取
这里贴一张 2×2像素、24位位图(Windows DIB头BITMAPINFOHEADER)像素格式为RGB24的示例
| 偏移(六边形) | 规模(字节) | 十六进制值 | 价值 | 描述 |
|---|---|---|---|---|
| BMP头部 | ||||
| 00 | 2 | 42 4D | “BM” | ID场(42h,4Dh) |
| 02 | 4 | 46 00 00 00 | 70字节(54+16) | BMP文件大小(54字节头+16字节数据) |
| 06 | 2 | 00 00 | 未使用球员 | 应用特定 |
| 08 | 2 | 00 00 | 未使用球员 | 应用特定 |
| 0A | 4 | 36 00 00 00 | 54字节(14+40) | 偏移量,像素数组(位图数据)所在位置 |
| DIB 头部 | ||||
| 0E | 4 | 28 00 00 00 | 40字节 | DIB头部的字节数(从此点开始) |
| 12 | 4 | 02 00 00 00 | 2像素(从左到右排列) | 位图宽度(像素单位) |
| 16 | 4 | 02 00 00 00 | 2 像素(从下到高) | 位图的高度(像素单位)。从下到上像素顺序为正。 |
| 1A | 2 | 01 00 | 1架飞机 | 使用的彩色平面数量 |
| 1C | 2 | 18 00 | 24位 | 每像素的位数 |
| 1E | 4 | 00 00 00 00 | 0 | BI_RGB,不使用像素阵列压缩 |
| 22 | 4 | 10 00 00 00 | 16字节 | 原始位图数据的大小(包括填充) |
| 26 | 4 | 13 0B 00 00 | 水平分辨率为2835像素/米 | 图像的打印分辨率为 72 DPI ×39.3701英寸每米,可获得2834.6472 |
| 2A | 4 | 13 0B 00 00 | 2835像素/米垂直 | |
| 2E | 4 | 00 00 00 00 | 0 颜色 | 调色板中的颜色数量 |
| 32 | 4 | 00 00 00 00 | 0 重要颜色 | 0表示所有颜色都很重要 |
| 像素数组起始(位图数据) | ||||
| 36 | 3 | 00 00 FF | 0 0 255 | 红色,像素 (x=0, y=1) |
| 39 | 3 | FF FF FF | 255 255 255 | 白色,像素 (x=1, y=1) |
| 3C | 2 | 00 00 | 0 0 | 4字节对齐的填充(可以是除零以外的数值) |
| 3E | 3 | FF 00 00 | 255 0 0 | 蓝色,像素 (x=0, y=0) |
| 41 | 3 | 00 FF 00 | 0 255 0 | 绿色,像素 (x=1, y=0) |
| 44 | 2 | 00 00 | 0 0 | 4字节对齐的填充(可以是除零以外的数值) |
以下是一个4×2像素、32位位图的示例,alpha通道(Windows DIB头BITMAPV4HEADER)不透明度值,像素格式为ARGB32。
| 偏移(六边形) | 规模(字节) | 十六进制值 | 价值 | 描述 |
|---|---|---|---|---|
| BMP头部 | ||||
| 00 | 2 | 42 4D | “BM” | ID场(42h,4Dh) |
| 02 | 4 | 9A 00 00 00 | 154字节(122+32) | BMP文件大小 |
| 06 | 2 | 00 00 | 未使用球员 | 应用特定 |
| 08 | 2 | 00 00 | 未使用球员 | 应用特定 |
| 0A | 4 | 7A 00 00 00 00 | 122字节(14+108) | 偏移量,像素数组(位图数据)所在位置 |
| DIB 头部 | ||||
| 0E | 4 | 6C 00 00 00 00 | 108字节 | DIB头部的字节数(从此点开始) |
| 12 | 4 | 04 00 00 00 | 4像素(从左到右排列) | 位图宽度(像素单位) |
| 16 | 4 | 02 00 00 00 | 2 像素(从下到高) | 位图的高度(像素单位) |
| 1A | 2 | 01 00 | 1架飞机 | 使用的彩色平面数量 |
| 1C | 2 | 20 00 | 32位 | 每像素的位数 |
| 1E | 4 | 03 00 00 00 | 3 | BI_BITFIELDS,没有使用像素阵列压缩 |
| 22 | 4 | 20 00 00 00 | 32字节 | 原始位图数据的大小(包括填充) |
| 26 | 4 | 13 0B 00 00 | 水平分辨率为2835像素/米 | 图像的打印分辨率为 72 DPI ×39.3701英寸每米,为2834.6472英寸 |
| 2A | 4 | 13 0B 00 00 | 2835像素/米垂直 | |
| 2E | 4 | 00 00 00 00 | 0 颜色 | 调色板中的颜色数量 |
| 32 | 4 | 00 00 00 00 | 0 重要颜色 | 0表示所有颜色都很重要 |
| 36 | 4 | 00 00 FF 00 | 00FF0000 大端序 | 红色信道位掩码(有效,因为指定了BI_BITFIELDS) |
| 3A | 4 | 00 FF 00 00 | 大端序中的0000FF00 | 绿色通道位掩码(有效,因为指定了 Green BI_BITFIELDS) |
| 3E | 4 | FF 00 00 00 | 大端序中的000000FF | 蓝色通道位掩码(有效,因为指定了BI_BITFIELDS) |
| 42 | 4 | 00 00 00 FF | FF000000大端序 | 阿尔法通道位掩膜 |
| 46 | 4 | 20 6E 69 57 | 小端”Win “ |
LCS_WINDOWS_COLOR_SPACE |
| 4A | 36 | 00…00 | CIEXYZ三重色彩空间端点 | 未用于LCS的“”或“”Win ``sRGB“ |
| 6E | 4 | 00 00 00 00 | 0 红伽马 | 未用于LCS的“”或“”Win ``sRGB“ |
| 72 | 4 | 00 00 00 00 | 0 绿色伽马 | 未用于LCS的“”或“”Win ``sRGB“ |
| 76 | 4 | 00 00 00 00 | 0 蓝色伽马 | 未用于LCS的“”或“”Win ``sRGB“ |
| 像素数组的起始(位图数据) | ||||
| 7A | 4 | FF 00 00 7F | 255 0 0 127 | 蓝色(Alpha:127),像素(x=0,y=1) |
| 7E | 4 | 00 FF 00 7F | 0 255 0 127 | 绿色(Alpha:127),像素(x=1,y=1) |
| 82 | 4 | 00 00 FF 7F | 0 0 255 127 | 红色(Alpha:127),像素(x=2,y=1) |
| 86 | 4 | FF FF FF 7F | 255 255 255 127 | 白色(Alpha:127),像素(x=3,y=1) |
| 8A | 4 | FF 00 00 FF | 255 0 0 255 | 蓝色(Alpha:255),像素(x=0,y=0) |
| 8E | 4 | 00 FF 00 FF | 0 255 0 255 | 绿色(Alpha:255),像素(x=1,y=0) |
| 92 | 4 | 00 00 FF FF | 0 0 255 255 | 红色(Alpha:255),像素(x=2,y=0) |
| 96 | 4 | FF FF | 255 255 255 255 | 白色(α:255),像素(x=3,y=0) |
GIF
这个是动图
GIF图片特点
1 | 47 49 46 38 39 61 |
方法
帧分离+拼接
图片很细,那么可以尝试分离每一帧然后拼接试试看
1 | convert glance.gif flag.png #分离,有几帧就有几张图片 |
GIF图像格式和特征
扔进010editor看下头数据,看情况修改,然后打开后发现现实的看不出来是动图,那么擦测一下他可能是有规律的
识别规律
1 | identify -format "%T" flag.gif |
会得到一串数字,这里将我网上看到的一个案例是将10改为1,20改为0,但我没做过,不知道反过来行不行
进制转换网址 https://www.rapidtables.com/convert/number/ascii-hex-bin-dec-converter.html
GIF图像每一帧查看
用stegsolve的analyse的frame browser
盲水印
就是会将水印以一种肉眼看不见的方式写,但是会有独特的标识
1 | bwm decode hui.png hui_with_wm.png flag.png |
LSB隐写
第一种就是通过stregsolve修改rgb来搞
第二种就是010editor查找特殊字符分析
查看文件里的字符
1 | string 文件名 |
通用方法
010editor
查找flag文本/视图-模板结果可能可以发现一个unknownPadding
分辨文件
