Featured image of post CTF-misc 做题日志 0x00 版

CTF-misc 做题日志 0x00 版

在做题日志 0x00 版,存在部分谬误待修正,如有错误请指出。

图片隐写

一张图片 png,本质就是一个文件,也就是一串字节,比如我们用记事本来打开一张图片:

image

可以看到,记事本翻译出了一串乱码,这是为什么呢,因为记录图片信息的字符在 0~255 (0xff)之间,而记事本的翻译方式就是 ASCII 码,自然会有一些乱码和不可见字符被翻译出来。

那么我们可以使用 010 Editor 这个工具,它会忠诚地把这些都表示成 hex 码。

那么正常的 PNG 图片格式大概如下:

1
2
3
4
5
6
7
8
9
┌───────────────┐
│   PNG Header  │
├───────────────┤
│     IHDR      │
├───────────────┤
│     IDAT      │
├───────────────┤
│     IEND      │
└───────────────┘

PNG Header :89 50 4E 47 0D 0A 1A 0A(0x50 → P,0x4E → N,0x47 → G)

INED:49 45 4E 44(0x49 → I,其他同理)

但是我们可以这样隐藏信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
┌───────────────┐
│   PNG Header  │
├───────────────┤
│     IHDR      │
├───────────────┤
│     IDAT      │
├───────────────┤
│     IEND      │
├───────────────┤
│               │
│    ZIP文件    │
│               │
└───────────────┘

图片查看器在 IEND 这里就截止,这样我们就可以隐藏信息了。

[BUUCTF-MISC] 二维码

题目链接

把图片放进这个 010 Editor 里面,容易发现这个 IEND 后面隐藏的信息:

image

我选中的蓝色部分就是 PNG 部分。

可以看到有效信息,标灰色的地方 50 4B 03 04 14 00 09 00 翻译出 PK ...其实就是 ZIP 文件头(50 4B 03 04

还有 4number.txt,也就是说这个 PNG 后面藏了 ZIP,ZIP 里面有一个 4number.txt。

我们也可以用 kali 里的 binwalk 工具,自动查找有没有已知的文件格式:

image

使用 binwalk -e 可以自动解析剥离内部文件,也可以再 010 Editor 中选中相关部分,右键选择 Save Selection 将其保存为相关文件。

随后我们发现这个压缩文件有密码,根据内部文件 4number.txt 合理猜测,该文件密码为四位数字,进行穷举,使用工具 fcrackzip。

fcrackzip 工具

fcrackzip是一款用于破解zip类型压缩文件密码的工具,主要有暴力破解字典破解两大功能。

暴力破解 -b(brute force),可选字符集 -c

  • -c 1:字符集为 0~9。
  • -c a:字符集为 a~z。
  • -c A:字符集为 A~Z。
  • -c !:常见特殊字符。

可选长度 -l,如 -l 4~6 指长度在 4~6 位的密码。

字典攻击 -D,可以在有限的可能的密码中进行爆破,如存在某密码文本薄 passwd.txt,可以用 fcrackzip -D -p passwd.txt -u secret.zip 来爆破文件。

总之,如 fcrackzip -b -c a1 -l 1-6 -u flag.zip,fcrackzip 是一个好用的爆破工具。

常见的 Header

 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
26
27
28
29
PNG
89 50 4E 47 0D 0A 1A 0A

JPG
FF D8 FF

GIF
47 49 46 38

ZIP
50 4B 03 04

RAR
52 61 72 21

7z
37 7A BC AF 27 1C

PDF
25 50 44 46

ELF
7F 45 4C 46

Windows EXE
4D 5A

GZIP
1F 8B

PNG 文件结构与宽高修改

现在拿下图,深入学习 PNG 的图片结构:

image

可以看到,IHDR 前有四个字节是 IHDR 信息,对于该图是 00 00 00 0D,这代表了该图的 IDAT 数据部分的长度 Length。

比如该图或者常见图,都是 Length (4 bytes) + Type (4 bytes) + Data (n bytes) + CRC (4 bytes) 的结构,那么该图的 Length 是 0xD = 13 bytes,type = IDAT,自 IDAT 往后数 13 个字节,就是 CRC,也就是 B8 1F 82 96(010 中标紫的部分)。

接下来深入 data 部分,一般来讲,data 部分由 Width (4 bytes) + Height (4 bytes) +