HackThisSite - Steganography Mission 8
Challenge
Thank you t_n83
Solution
Analysis
1 | curl -sL -b "$HTS_COOKIE" -o stego8.bmp \ |
1 | stego8.bmp: PC bitmap, Windows 3.x format, 157 x 97 x 24, image size 45784, |
一张 157×97 的 24 位 BMP,体积很小。直接打开只看到一幅白底图上印着一行字和一条下划线。
BMP 的隐写常见路径只有几条:尾部附加数据、头部声明尺寸和真实长度不符、调色板里的垃圾项。 先排除这几条常见路径:
1 | import struct |
1 | bfType b'BM' bfSize 45838 dataOffset 54 |
像素区正好 472 × 97 = 45784
字节,文件在像素之后没有任何多余数据(trailing=0); 24 bpp
的 BMP 没有调色板,palette
这条线也不用查。信息只能在像素值里。
分别统计 R、G、B 三个通道的取值分布:
1 | import numpy as np |
1 | R uniq = 26 top = [(14849, 255), (293, 0), (20, 240), (15, 124)] |
图像呈灰度外观,但通道统计显示:R 通道比 G、B 多出一批取值。进一步比对三个通道:
1 | import numpy as np |
1 | R!=G: 15 G!=B: 0 |
绝大多数像素满足 R == G == B(真正的灰度),只有
15 个像素例外,而且全部 集中在同一行
y=50、x 从 68 到 82
的一段连续像素上。这 15 个点就是全部秘密。
这 15 个像素的形态是
(R, 0, 0):绿、蓝被清零,红通道独自保留一个值。
把这一行原样打印出来:
1 | import numpy as np |
1 | 66 (255, 255, 255) |
这些值不构成图案,它们本身就是字节。
一串代码把上面几步串起来即可,提取结果:
1 | import numpy as np |