[ 刷题记录 ] CTFshow Misc 入门
2026-08-22 20:22:46

Misc1 读图

直接打开图片

ctfshow{22f1fb91fc4169f1c9411ce632a0ed8d}

Misc2 改后缀名

直接用记事本打开看到乱码。

不要直接把压缩包拖进010 不然是只读模式

打开bandzip 把txt文件拖进010 看到png文件头

另存为,把后缀名txt改成png,获得flag

ctfshow{6f66202f21ad22a2a19520cdd3f69e7b}

Misc3 读图(需要专门读bpg文件格式的软件)

下载软件honeyview(官网)直接打开图片

ctfshow{aade771916df7cde3009c0e631f9910d)

Misc4 改后缀名

类似于Misc2

1.txt010打开是png 改1.png

2.txt010打开是jpg 改2.jpg

3.txt010打开是bmp 改3.bmp

4.txt010打开是gif 改4.gif

5.txt010打开是tif 改5.tif

6.txt010打开是webp 改6.webp

这题直接把所有txt后缀都改成png也可以。因为很多软件是通过文件头判断真实格式,而不是只看后缀名,所以比如即使把 .webp 改成 .png,只要内容没变,能支持webp的软件照样能打开。

ctfshow{4314e2b15ad9a960e7d9d8fc2ff902da}

Misc5 010或Winhex末尾

010或者winhex打开看末尾

ctfshow{2a476b4011805f1a8e4b906c8f84083e}

Misc6 010或Winhex查找

010或Winhex ctrl+F 查找ctfshow

ctfshow{d5e937aefb091d38e70d927b80e1e2ea}

Misc7 同6

010或Winhex ctrl+F 查找ctfshow

ctfshow{c5e77c9c289275e3f307362e1ed86bb7}

Misc8 隐藏一张图片

法1 kali的Binwalk和foremost

ctrl+shift+ ++实现字体放大

ctrl+ -实现字体缩小

实现binwalk

**binwalk 文件地址**

binwalk/home/kali/Desktop/misc8.png

说明本身有一个.png图片 还藏了一个.png图片

**tips:**如果你不知道文件地址是什么

输入**find / -name "文件名.后缀名" 2>/dev/null**

第4行就是文件地址

用foremost分离

这时我还没下载foremost

sudo apt install foremost

**foremost -i 文件地址 -o 分离后文件地址**

之后就会在桌面上看到一个名为分离后文件名的文件

法二 010里操作 删掉显图片 留下隐图片

ctrl+F查找**89 50 4E 47**看到两个png头 说明有两张图片

删掉前面那一大段 只留下后面png打头的那段 另存为

ctfshow{1df0a9a3f709a2605803664b55783687)

Misc9 同6

010或Winhex ctrl+F 查找ctfshow

ctfshow{5c5e819508a3ab1fd823f11e83e93c75}

Misc10 binwalk分离

binwalk查看

文件是png图像 在偏移0x5660x10E5处发现Zlib压缩数据

随后采取binwalk -e分离

在桌面上获得分离后文件

打开10E5获得flag

我记得第一次做的时候有权限问题 就在后面加--run-as=root

ctfshow{353252424ac69cb64f643768851ac790}

为什么这题不能用foremost?

因为foremost仅识别具有标准文件头和尾的完整文件类型如zip,rar等,而Zlib只是一种通用压缩流,没有标准的文件结构标识,因此foremost无法将其视为独立文件进行提取

Misc11两套IDAT数据

用tweakpng打开

两个IDAT块 说明一个图片信息盖住了另一个图片信息 图片默认显示第一个 于是删除第一个也就是长度为2931的IDAT块即可

ctfshow{44620176948fa759d3eeafeac99f1ce9}

Misc12 IDAT隐写

tweakpng打开 一个一个删无用IDAT块 删8个即可

Misc13 010末尾留单数

010里看到形似flag的内容

1
2
3
a = 'ct¹f…s†hªoKw°{!aeS6¥eT446xc%4Ý8ïf«73•9b‚7ºeEb|2Td~1:däeñ6úeõ412fT8ñ329éal}'
for i in range(0,len(a),2):
print(a[i],end='')

直接硬看也可以

ctfshow{ae6e46c48f739b7eb2d1de6e412f839a}

Misc14 手动提取嵌入图片*

binwalk 文件地址查看

实际上可以看出这个jpg是一个包含多个嵌入文件的复合文件

偏移0*0(0)一个JPEG图像(EXIF标准)

偏移0*C(12)一个TIFF图像 (大端序)

偏移0*691(1681)另一个TIFF图像(大端序)

偏移0*837(2103)另一个JPEG图像(JFIF标准1.01)

意味着原文件misc14.jpg隐藏了其他数据或文件 需要提取嵌入文件

**binwalk -e 文件地址**

这将会在当前目录下创建一个名为_misc14.jpg.extracted的文件夹,其中包含提取出的文件

**foremost -i 文件地址 -o foremost _output**

依旧没有得到提取文件

根据提示说

尝试手动提取第二个偏移量为2103的JPEG

1.**dd if=文件地址 of=新文件名.文件后缀 bs=1 skip=2103**这一步是提取

2.ls -la 新文件名.jpg检查提取的文件 确认文件已创建且大小不等于0

3.file 新文件名.jpg验证文件类型(熟练以后这两步可以去掉)

4.**xdg-open 新文件名.jpg**

输出指令后两秒进入图片extracted.jpg

如果按序提取每一个文件

第一个JPEG 0

dd if=文件地址 of=新文件名2.jpg bs=1 skip=0

第一个TIFF 12

dd if=文件地址 of=新文件名3.tiff bs=1 skip=12 count=1669

(1681-12=1669)

第二个TIFF 1681

dd if=文件地址 of=新文件名4.tiff bs=1 skip=1681 count=422

2103-1681=422

第二个JPEG 2103

dd if=文件地址 of=新文件名5.jpg bs=1 skip=2103

Misc15同6 7 9

Misc16 同10

**binwalk -e 文件地址**

在桌面上获得一个叫_misc16.png-0.extracted的文件

打开DD4获得flag

Misc17 (tweakpng/zsteg)+binwalk

如果直接binwalk -e /home/kali/Desktop/misc17.png

则会得到一个打不开的文件

法1 tweakpng打包所有IDAT

另存为

然后binwalk -e 文件地址即可获得flag

法2

zsteg /home/kali/Desktop/misc17.png

接下来看了三五个WP还没看出来怎么做 或者说我在kali的操作一直无法获得flag??????

Misc18属性拼接

Misc19 exiftool

法1 010

010 ctrl+f ctfshow

法2 strings

strings 文件地址

法3 用线上exif查看工具

https://exif.tuchong.com/

Misc20 谐音梗

Misc21 exiftool+base16

什么是 EXIF?
EXIF 是可交换图像文件格式的缩写。它是一组“元数据”,即“关于数据的数据”。当您用数码相机或智能手机拍照时,相机会自动将大量信息记录到图片文件中,这些信息就是 EXIF。

常见的 EXIF 信息包括:

相机型号和制造商

拍摄时间和日期

快门速度、光圈、ISO 感光度

焦距

闪光灯是否开启

GPS 坐标(照片的拍摄地点)

缩略图(用于快速预览)

┌──(kali㉿kali)-[~]

└─$ exiftool /home/kali/Desktop/misc21.jpg

ExifTool Version Number : 13.25

File Name : misc21.jpg

Directory : /home/kali/Desktop

File Size : 14 kB

File Modification Date/Time : 2021:03:24 12:37:58-04:00

File Access Date/Time : 2025:11:15 05:35:09-05:00

File Inode Change Date/Time : 2025:11:15 05:35:09-05:00

File Permissions : -rw——-

File Type : JPEG

File Type Extension : jpg

MIME Type : image/jpeg

JFIF Version : 1.01

Resolution Unit : inches

Exif Byte Order : Big-endian (Motorola, MM)

X Resolution : 3902939465

Y Resolution : 2371618619

Page Name : https://ctf.show/

X Position : 1082452817

Y Position : 2980145261

Target Printer : ctfshow{}

Pixel Units : 1

Pixels Per Unit X : 0

Pixels Per Unit Y : 0

Exif Version : 0232

Components Configuration : Y, Cb, Cr, -

Security Classification : Top Secret

Flashpix Version : 0100

Color Space : Uncalibrated

Serial Number : 686578285826597329

Image Width : 900

Image Height : 150

Encoding Process : Baseline DCT, Huffman coding

Bits Per Sample : 8

Color Components : 3

Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)

Image Size : 900x150

Megapixels : 0.135

X&Y里的明显都是十进制数 试转化为十六进制数

拼接即可

Misc22 缩略图隐写

kali exiftool /home/kali/Desktop/misc22.jpg

了解到是和thumbnail隐写有关(缩略图隐写)

为了方便相机和操作系统(如Windows资源管理器、手机相册)快速预览,相机或软件会在EXIF数据区自动生成并嵌入一张小的、低分辨率的缩略图。这张缩略图本身也是一个完整的、但尺寸很小的JPEG图片

提取方法

1.软件MagicEXIF 打开后直接看到缩略图

2.kali

exiftool -b -ThumbnailImage /home/kali/Desktop/misc22.jpg > thumbnail.jpg保存后的缩略图就是thumbnail.jpg

3.010搜索jpeg文件头FF D8发现两个 删去前面那个 获得缩略图

4.随波逐流一把梭 放进去即获得缩略图

Misc23 exiftool+时间戳

kali

exiftool /home/kali/Desktop/misc23.psd

与时间相关的这串

转成时间戳

转化方式

1.在线转化

https://tool.lu/timestamp/

以此类推

2.cyberchef 有点麻烦 要改时间的格式

法12后面进行hex转化

3.python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import datetime

time_strings = [
'1997:09:22 02:17:02+08:00',
'2055:07:15 12:14:48+08:00',
'2038:05:05 16:50:45+08:00',
'1984:08:03 18:41:46+08:00'
]

result = 'ctfshow{'

for time_str in time_strings:
dt = datetime.datetime.strptime(time_str, '%Y:%m:%d %H:%M:%S%z')
timestamp = int(dt.timestamp())
result += hex(timestamp)[2:]

result += '}'
print(result)

Misc24宽高隐写

https://blog.csdn.net/weixin_52450702/article/details/124767308?spm=1001.2014.3001.5501

大端序和小端序

同样一个32字节的十六进制整数0x12345678

大端序存储为12 34 56 78小端序存储为78 56 34 12

PNG

前8字节固定为89 50 4E 47 0D 0A 1A 0A对应ASCII‰PNG....

空8字节 后面4字节为宽度 再后面4字节为高度

大端序00 00 03 84就是384To Base16就是180

JPG

文件头FF D8

搜索起始标志:两个字节 **FF C0**

FF C0后面再数3个字节 后面2字节就是高度 再后面2字节就是宽度

BMP

文件头42 4D对应ASCIIBM

kuanfao

该题 图片大小675056字节 去掉头文件54字节 大约是675000字节

每个像素占3字节 于是有675000/3=225000像素

又已知宽度是900像素

则高度实际为225000/900=250像素 此处高度值被设置成150像素 自然看不到flag

250 16进制下(也就是Base16)是FA

把原先的96(150的十六进制)改成FA再另存为即可

这里的宽度900十六进制也就是384 表示为00 00 84 03

Misc25 同24

区别在于 png文件格式的高度在89 50 4E 47 0D 0A 1A 0A的后面第四块的四个字节

https://www.ip33.com/crc.html

CRC(循环冗余校验)在线计算网站

图片的12-28可以进行crc计算

计算结果与28-32进行对比 有区别就说明该图片crc校验有问题

这里用一个py宽高爆破脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import binascii
import struct

crcbp = open("misc25.png", "rb").read() #打开图片
crc32frombp = int(crcbp[29:33].hex(),16) #读取图片中的CRC校验值
print(crc32frombp)

for i in range(4000): #宽度1-4000进行枚举
for j in range(4000): #高度1-4000进行枚举
data = crcbp[12:16] + \
struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
# print(crc32)
if(crc32 == crc32frombp): #计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
print(i, j)
print('hex:', hex(i), hex(j))
exit(0)

宽900 高250 hex:0x384``0xfa

看了所有的WP

还可以用tweakpng改

总结一下看图片比例的几个方法

1.右击图片属性

2.exiftool /home/kali/Desktop/misc25.png

3.tweakpng FileNew→点一下IHDR块即可(这个方法可直接修改 而且tweakpng只能改png文件诶诶 能薅)

Misc26 crc宽高爆破脚本

依旧使用crc爆破脚本

注意要么把脚本的misc25改成26 然后ctrl+s保存

要么把图片名改成misc25

爆破出来图片实际高度为606个像素点 十六进制是25E或者直接在tweakpng改成606就好了(本来我想着本题也可以在tweakpng里把高度改的尽可能大 直到我复原了图片 这个TRUE HEIGHT(HEX)就是防蒙啊哈哈哈哈哈哈哈)

ctfshow{94aef125e087a7ccf2e28e742efd704c}

Misc27 jpg宽高隐写

Misc28 gif宽高隐写

gif格式

一个GIF文件一般包含多个图片。之前的图片渲染模式一般是将多个图片绘制到一个大的虚拟画布上,而现在一般将这些图片集用于实现动画。

头部:六个字节:47 49 46 38 39 61前三位是标志,后三位是版本

逻辑屏幕描述符‎
紧跟在头部后面,那么这个gif的画布宽度03 AC(十进制为940像素点) 画布高度01 96(十进制为406像素点)

虽然这张图我也没看懂,,,但是原地看到就查了一下懂了嗯嗯

由此就是96 00为宽度 ctrl+F 查找96 00就是两帧的高度 都改成FF 00即可

Misc29

同上题 但是这次帧数比较多 用stegsolve或者在线gif提取工具查看

Misc30

bmp文件结构

文件头 14字节

信息头 40字节

图像数据

42 4D BM 是BMP文件标识

50 87 06 00 00 00 00 00

36 00 00 00

28 00 00 00

84 03 00 00宽度

96 00 00 00高度

改成950的十六进制也就是3b6

宽度原本是84 03 00 00

小端储存应为B6 03 00 00

另存为

Misc31

文件头共53字节

(487256-54)/3/150=1082.6711111111

RGM每个像素由3个字节组成

实际高度为150

1082转十六进制是43a也就是04 3A因此是3A 04 00 00

Misc32 crc爆破脚本

依旧爆破脚本

Misc33 crc爆破脚本

Misc34 运行png宽度修改脚本

此脚本用于修改宽度 每修改一个就保存一个 然后肉眼扫描找到flag

1
2
3
4
5
6
7
8
9
10
11
import struct

filename = "misc34.png"#1.文件名酌情改
with open(filename, 'rb') as f:
data = f.read()#将整个文件读取到内存中
for i in range(901,1200):#2.从901-1199循环 因为从题干了解到宽度一定大于900 其他题酌情改长度
name = str(i) + ".png"#生成新的文件名 比如说"901.png""902.png"
f1 = open(name,"wb")# 以二进制写入模式打开新文件
new = data[:16]+struct.pack('>i',i)+data[20:]#假设 PNG 的宽度字段位于字节偏移 16~20(这是标准 PNG 的 IHDR 块中 width 的位置)
f1.write(new)
f1.close()
1
2
3
4
5
6
7
8
9
10
11
import struct

filename = "misc34.png"#文件名酌情改
with open(filename, 'rb') as f:
data = f.read()#将整个文件读取到内存中
for i in range(901,1200):#从901-1199循环 因为从题干了解到宽度一定大于900
name = str(i) + ".png"#生成新的文件名 比如说"901.png""902.png"
f1 = open(name,"wb")# 以二进制写入模式打开新文件
new = data[:20]+struct.pack('>i',i)+data[24:]
f1.write(new)
f1.close()

#Misc35 先修改高度 再运行jpg宽度修改脚本

先运行jpg宽度修改脚本 结果所有图片里愣是看不到一点flag 说明问题出在高度

先在010修改高度到600 再进行宽度修改

1
2
3
4
5
6
7
8
9
10
import struct

filename = "misc35.jpg"
with open(filename, 'rb') as f:
data = f.read()
for i in range(901, 1200):
name = str(i) + ".jpg"
with open(name, "wb") as f1:
new = data[:14] + struct.pack('>H', i) + data[16:]
f1.write(new)

没做出来?

Misc36 先修改高度 再运行gif宽度修改脚本

先修改高度到300也就是12c也就是2c 01

1
2
3
4
5
6
7
8
9
10
import struct
filename = "misc36.gif"
with open(filename, 'rb') as f:
data = f.read()
for i in range(920,951):
name = str(i) + ".gif"
f1 = open(name,"wb")
new = data[:38]+struct.pack('>h',i)[::-1]+data[40:]
f1.write(new)
f1.close()

Misc37 gif+读取动图

法1

https://remeins.com/index/app/gif2jpg

线上gif提取工具 获得三段flag

法2

stegsolve 帧浏览器

法3

ahtam of师傅的wp 因为我还没处理出来010的模板 下次用这个方法

010+修改时间 首先用010查看,发现有45个图,点看第一个图片持续时间DelayTime为10,将其和下面的变量TransparentColorIndex的值一起搜索发现有40结果,将其中时间修改后可以确定包含第一个flag的图片,而总的图为45,所以基本确定剩余5个图包含flag,用上述同样的方法将包含flag的图时间改大就能获得最终flag。

Misc38 APNG格式+读取动图

法1

Honeyview打开 一帧一帧看

法2如何判定是APNG格式

①010里在第一个IDAT块前面看到acTL(61 63 54 4C)还有除了第一帧的每一帧前面看到一个fcTL块

确定是APNG的文件格式和gif格式相似

②文件直接拖入HoneyView,或右键点击文件,选择“使用HoneyView打开”。若文件是.png但是包含动画内容呈现出gif动图的形态,在HoneyView中会自动播放动画效果,呈现动态画面,那就可确定是.apng文件。

接下来的方法可以和Misc37完全相同

Misc39 帧延迟隐写

题干说 flag就像水,忽快忽慢地流

打开gif文件 发现gif的帧延迟不寻常 正常gif动画的帧延迟通常是统一的 比如说每帧10厘秒 或者有合理的变化

kali命令行

identify -format "%T " /home/kali/Desktop/misc39.gif > /home/kali/Desktop/1.txt

这条命令的作用是使用 ImageMagick 工具中的 identify 命令,从 GIF 文件中提取每一帧的延迟时间(以厘秒为单位),并将结果输出到一个文本文件中

大量重复的3637交替出现 非常规律 属于一种人为的设置而非自然动画

提示我们 信息可能被编码在帧延迟中(一种隐写手段)

可以看作一个二进制序列 把37看作136看作0得到的序列就是

(此处处理可以ctrl+f replace)

长度为287

287/7=41 刚好整除 暗示使用7-bit ASCII编码(传统情况是8位)

1
2
3
4
5
s="11000111110100110011011100111101000110111111101111111011011010101100100111000011000101100101100110110011001110010111001011010111001101100010011011111000101100101011001001101100111000110010001110010110110011001111000010111001110010111000101100011110000101100000110100011010101110011111101"
flag=""
for i in range(41): #287//7
flag += chr(int(s[7*i:7*(i+1)],2))
print(flag)

脚本和cyberchef二选一

Misc41F001

根据提示F001(而且010能看出很多F0 01)

在010Ctrl+F搜索F0 01根据形状读出flag

Misc42 IDAT_LENGTH隐写

提示说 flag有多长?2cm……不好意思打错了,41位

坑:flag 藏在 PNG 的 IDAT 块 Length 字段里,41 个 Length 就是 flag 的 41 个字符,把 Length 值(229, 152, 191…)当 ASCII 码还原出 flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import struct
import sys

def main():
if len(sys.argv) != 2:
return

with open(sys.argv[1], 'rb') as f:
if f.read(8) != b'\x89PNG\r\n\x1a\n':
return

while True:
length_bytes = f.read(4)
if len(length_bytes) < 4:
break
length = struct.unpack('>I', length_bytes)[0]
chunk_type = f.read(4)
if len(chunk_type) < 4:
break
if chunk_type == b'IDAT':
print(length)
f.seek(length + 4, 1)

if __name__ == '__main__':
main()

使用cyberchef的From Decimal从十进制数组还原回原始字符串(分隔符是Line feed)(这里用Magic也可以嗯嗯)

1
2
3
4
5
6
a="99,116,102,115,104,111,119,123,48,55,56,99,98,100,48,102,57,99,56,100,51,102,50,49,53,56,101,55,48,53,50,57,102,56,57,49,51,99,54,53,125"
c=a.split(',')
flag=""
for i in range(0,len(c)):
flag+=chr(int(c[i]))
print(flag)

还真是41位呢

#Misc43 还没搞出来嗯嗯

一直弹出框 说IDAT 数据块的 CRC 校验值不正确(实际是什么什么,应该是什么什么)每次还都不一样诶诶

Misc45

提示说 有时候也需要换一种思维格式

一般说话都是 思维模式 这里却是思维格式 暗示改格式 改成罕见的bmp格式

windows自带的画图工具打开 另存为BMP格式

(这时候我尝试了一百种线上工具 好傻 png转bmp格式 我下载下来是.jpg格式)

拉到kali做binwalk

binwalk -eM /home/kali/Desktop/misc45.bmp

获得flag

关于与binwalk有关的命令行

binwalk

binwalk -e 文件地址提取识别出的内容(单层)

binwalk -eM 文件地址递归提取所有嵌套内容(多层)

后面两者都会自动提取 提取内容放在_文件名.extracted里

Misc46 GIF 帧偏移隐写

法1

提示说 你见过扶乩吗

打开gif文件后 发现图片在小范围内不断位移 考虑提取偏移地址

identify /home/kali/Desktop/misc46.gif >misc46.txt

跑一个py脚本提取这个偏移量

1
2
3
4
5
6
7
8
arr=[]
with open('46.txt','r') as file:
for i in file.readlines():
content_list=i.split(' ')
arr.append(content_list[3][8:].replace('+',' '))
with open('46_point.txt','w') as result:
for i in arr:
result.write(i+'\n')

在kali里下一个工具叫gnuplot

sudo agt-get install gnuplot

Gnuplot 是一个功能强大的命令行驱动的绘图工具,用于绘制二维和三维的数据图形。

它常用于科学计算、数据分析、数学函数可视化等场景。

示例用途:将网络扫描结果、日志数据等可视化。

注意:Gnuplot 本身不是渗透测试工具,而是一个通用的数据可视化工具,但在安全研究中有时会用来分析数据(如暴力破解尝试次数随时间变化等)。

先下载gnuplot

**sudo apt-get install gnuplot**

再运行gnuplot进行偏移轨迹的绘制

**gnuplot> plot '/home/kali/Desktop/46_point.txt'**

初见雏形了可是还是好难看 用画图工具压缩一下宽高看看 这样稍微好一点

到现在我终于明白题干的意思

什么是“扶乩”?

扶乩(fú jī),又称“扶鸾”、“降笔”,是中国民间一种古老的通灵占卜术:由两人扶着一个 Y 形或丁字形的木架(乩笔),在沙盘或纸上自动写出“神明”的指示文字,写出的文字常被称为“乩文”。

在本题中,这个神明是一个不断移动的小图片GIF,而乩文就是偏移轨迹。

所以,这里的扶乩 其实是:通过分析 GIF 图片每一帧的位置偏移,还原出隐藏的信息也就是乩文

一开始我扣掉了txt文件的第一行就是两个0结果kali里显示了一堆奇怪的换行符 无法绘图

于是我又查询了kali使用如何去除这些字符 如下

kali使用

显示不可见字符

cat -A /home/kali/Desktop/46_point.txt

安装dos2unix

sudo apt install dos2unix

dos2unix /home/kali/Desktop/46_point.txt

再次检查

cat -A /home/kali/Desktop/46_point.txt

还有这是我不小心破坏了文件格式以后做出的两个图

法2

好像是更优方法

pip install pillow matplotlib

报错

这个错误实际上是kali系统为了防止用户用pip直接污染系统python环境 不允许我用pip随意安装第三方包 于是选择用apt安装

sudo apt update

sudo apt install -y python3-pil python3-matplotlib

跑一下这个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from PIL import Image
import matplotlib.pyplot as plt
f = open('misc46.txt')
pp = []
while 1:
c = f.readline()
if c:
s = eval(c.split('+')[1]+','+c.split('+')[2][:2])
pp.append(s)
print(s)
# print(c)
else:
break

img = Image.new('RGB',(400,70),(255,255,255))
for i in pp:
new = Image.new('RGB',(1,1),(0,0,0))
img.paste(new,i)
plt.imshow(img)
plt.show()

Misc47

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import struct
from PIL import Image
import matplotlib.pyplot as plt
f = open('misc47.png','rb')
c = f.read()
c = c[c.index(bytes.fromhex('6663544C00000001')):]
pp = []
for i in range(1,1124,2):
start = c.index(bytes.fromhex('6663544C0000')+struct.pack('>h',i))
# start = c.index(bytes.fromhex('6663544C000000'+hex(i)[2:]))
# print(start)
fc = c[start:start+30]
print(fc[18:20],fc[22:24])
print(struct.unpack('>h',fc[18:20])+struct.unpack('>h',fc[22:24]))
pp.append(struct.unpack('>h',fc[18:20])+struct.unpack('>h',fc[22:24]))
# print(fc.index(b'\xb6'),fc.index(b'\x34'))
# print(c[:100])
img = Image.new('RGB',(400,70),(255,255,255))
for i in pp:
new = Image.new('RGB',(1,1),(0,0,0))
img.paste(new,i)
plt.imshow(img)
plt.show()

Misc50 stegsolve

Misc53

法1zsteg指令

zsteg /home/kali/Desktop/misc53.png

法二 stegsolve里操作Data Extracted LSB

Misc54

Stegsolve Extract Data的使用

Extract Preview窗口的作用是

从原始二进制数据中提取出不同颜色通道的位平面(bit planes)

允许用户选择提取顺序 位序 颜色通道顺序等参数

预览提取结果 并可保存为文本或二进制格式

Row&Column

Row是按行提取 逐行读取像素数据

Column是按列提取 逐列读取像素数据

这个设置影响数据提取的顺序 在LSB隐写里面 数据可能是按行或者按列存储的 需要正确匹配

MSB&LSB

MSB是高位优先 从最高有效位开始读取 比如一个字节0x8A=**1**000101**0**MSB是第一个1

LSB是低位优先 从最低有效位开始读取 同样是字节0x8ALSB是最后一个0

隐写中 LSB最常用 因为通常把信息藏在最低位 不会影响视觉效果

Bit Plane Order

Bit Plane Order也就是位平面顺序

这是指颜色通道的排列顺序 每个像素有R G B三个通道 可能还有Alpha 而每个通道又可以拆成多个位平面 如8位→8个bit

RGB就是R→G→B的顺序 组合方式不同

标准图像格式通常是BGR(OpenCV)或者RGB(Web图像)

Alpha Channel

可以选择是否启用Alpha通道的位平面 勾选alpha 0就是只提取alpha通道的最低位

Red Green Blue Channels的位选择

每个颜色都有八位(0-7)对应一个字节

Misc55

法1 zsteg

**zsteg -a** **/home/kali/Desktop/misc55.png**

-a表示all 对文件所有可能的隐写方式的扫描 包括LSB RGB Yx 其他等等

这段红色说明 里面隐藏了一个zip压缩包

**zsteg -e** **b1,rgb,lsb,Yx** **/home/kali/Desktop/misc55.png** **>****/horm/kali/Desktop/hidden.zip**

这个命令行用于提取zip压缩包

解压即可获得flag

Misc56

R4、R2、R1、G4、G2、G1这几个左上角有隐写痕迹

注意这题是MSB不是LSB

上一页
2026-08-22 20:22:46
下一页