笔记参考

https://blog.csdn.net/qq_45894840/article/details/128346180

https://secgxx.com/ctf/wiki/ctf-misc-archive/

省流前言

本笔记主要是针对图片类隐写和压缩包类题目进行深入研究总结,包括部分题目的复现,部分内容可能与前一章相似,同时也会包含更多的详细内容

  • exif隐写

前置知识补充

  • 遇到图片隐写题,可以先丢到https://aperisolve.fr/这个一键梭哈网站解析一下
  • 常见的图片类型有:png、jpg、gif、bmp、webp、tif(后面补充)
文件类型文件头特征值
JPEGFFD8FFimage-20241202150612891
PNG89504E47.PNG…
GIF47494638GIF89a
TIFF49492A00
Windows Bitmap424DBM
文件类型文件头特征值
JPEGFFD8FFimage-20241202150612891
PNG89504E47.PNG…
GIF47494638GIF89a
TIFF49492A00
Windows Bitmap424DBM
文件类型文件头特征值
JPEGFFD8FFimage-20241202150612891
PNG89504E47.PNG…
GIF47494638GIF89a
TIFF49492A00
Windows Bitmap424DBM
WEBP

| WEBP | | |

| WEBP | | |

……随时补充

泛用思路

  • 图片分离或拼接
  • 查看图片的详细信息(右键属性)
  • 用winhex或010分析文件头尾
  • 图片分离或拼接
  • 分析图片的exif信息 PNG文件的文件头由一个8字节的PNG文件标识域和3个以上的后续数据块,如IHDR、IDAT、IEND等组成
  • binwalk或者foremost 其标识如下:
  • 图片分离或拼接
189 50 4E 47 0D 0A 1A 0A   +数据块+数据块+数据块
189:用于检测传输系统是否支持8位的字符编码,用以减少将文本文件被错误的识别成PNG文件的机会,反之亦然
250 4E 47:PNG每个字母对应的ASCII,让用户可以使用文本编辑器查看时,识别出是PNG文件
30D 0A:DOS风格的换行符,用于DOS-Unix数据的换行符转换
41A:在DOS命令行下,用于阻止文件显示的文件结束符
50A:Unix风格的换行符,用于Unix-DOS换行符的转换

可能遇到的隐写情况为:

  • 文件格式修改(把PNG文件的后缀改成其他的文件)
  • 文件格式倒转(文件的Hex值倒转排列,写脚本复原)
  • 文件头缺失(用工具补齐)
  • 修改图片宽高

PNG文件中,每个数据块都由四个部分组成,分别为:

1长度(Length):指定数据块中数据区域的长度,长度不可超过(2^31-1)个字节
2数据块类型码(Chunk Type Code):数据块类型码由ASCII字母(A-Z和a-z)组成的"数据块符号"
3数据块数据(Chunk Data):存储数据块类型码指定的数据
4循环冗余检测(CRC):存储用来检测是否文件传输有误的循环冗余码

修改对应的宽高位的数据即可

image-20241203181824352

  • CRC值爆破**(比较复杂,后续深入了解)**

在遇到图片隐写题目时,原有的图片可能会被修改其宽高,从而导致图片里面的内容无法正常展示,我们可以通过CRC爆破判断他的宽高值是否被修改

通过010或者kali中的pngcheck可以检查图片的CRC32值是否校验错误,确定错误后,即可对其进行修改

简单的宽高隐写,可以通过直接修改宽高值后,显示flag;如果没有办法直接显示,则需要撰写脚本进行爆破,这里贴一个网上大佬写的爆破脚本,可以同时爆破出图片的宽高

 1import struct
 2import zlib
 3
 4def hexStr2bytes(s):
 5    b = b""
 6    for i in range(0,len(s),2):
 7        temp = s[i:i+2]
 8        b +=struct.pack("B",int(temp,16))
 9    return b
10
11str1="49484452"
12str2="0806000000"
13bytes1=hexStr2bytes(str1)
14bytes2=hexStr2bytes(str2)
15wid,hei = 1918,864
16
17crc32 = "0x7dc73f7f"    #填写正确的crc值,可以用pngcheck查看
18
19for w in range(wid,wid+2000):
20    for h in range(hei,hei+2000):
21        width = hex(w)[2:].rjust(8,'0')
22        height = hex(h)[2:].rjust(8,'0')
23        bytes_temp=hexStr2bytes(width+height)
24        if eval(hex(zlib.crc32(bytes1+bytes_temp+bytes2))) == eval(crc32):
25            print(hex(w),hex(h))

得到宽高后,用010进行修改,然后再进一步分析即可。

  • 文件提取(用binwalk、foremost等工具提取)

  • JPEG 是有损压缩格式,将像素信息用 JPEG 保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在 0 至 100 之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择 70 或 80 就足够了
  • JPEG 没有透明度信息 PNG文件的文件头由一个8字节的PNG文件标识域和3个以上的后续数据块,如IHDR、IDAT、IEND等组成 JPEG文件的文件头标识如下:
1FF D8 FF

另外其文件尾标识为:

FF D9

189 50 4E 47 0D 0A 1A 0A   +数据块+数据块+数据块

可能遇到的隐写情况为: 89:用于检测传输系统是否支持8位的字符编码,用以减少将文本文件被错误的识别成PNG文件的机会,反之亦然

  • 修改图片宽高 50 4E 47:PNG每个字母对应的ASCII,让用户可以使用文本编辑器查看时,识别出是PNG文件 修改对应的宽高位的数据即可 0D 0A:DOS风格的换行符,用于DOS-Unix数据的换行符转换 image-20241203182058198 1A:在DOS命令行下,用于阻止文件显示的文件结束符 0A:Unix风格的换行符,用于Unix-DOS换行符的转换
1
2
3### BMP隐写
4
5BMP 文件格式能够存储单色和彩色的二维数字图像,具有各种颜色深度,并且可以选择使用数据压缩、alpha 通道和颜色配置文件
6
7其文件头标识如下:

42 4D

1
2BMP文件头标识的后四位表示的是BMP的图片大小,示例如下

8E 26 2C 00

1
2由于个人计算机都是以小端序,所以数据要从右往左写
3
4所以其大小实则应为

0x002c268e == 2893454(Byte) == 2.75M

 1
 2
 3
 4可能遇到的隐写情况为:
 5
 6+ 修改图片宽高
 7
 8![在这里插入图片描述](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/7470546f59f54af8987afc4c238a64af.png)
 9
10
11
12
13
14### EXIF信息
15
16拍摄图片时,exif会记录数码照片的属性信息和拍摄数据,可以通过查看图片属性中的详细信息看到部分exif信息
17
18kali中可以使用exiftool查看更详细的exif数据

exiftool xxx.jpg

 1
 2
 3
 4可能遇到的题型:
 5
 6+ OSINT(社工,查看图片经纬度)
 7+ 
 8
 9
10
11
12
13### GIF隐写
14
15GIF的文件头标识如下:

47 49 46 38 39 61

 1
 2
 3
 4可能遇到的题型如下:
 5
 6+ GIF帧分离+拼接
 7
 8这类题型需要用到imagemagick工具
 9
10```shell
11sudo apt install imagemagick

对于得到的gif,对它进行帧分离操作

1convert xxx.gif xxx.png		#逐帧分割图片

最后将得到的图片集群拼成一张图片

1montage xxx*.png -tile x1 -geometry +0+0 xxx.png	#合并图片
  • GIF图像特征

有些gif图每帧间存在规律,可能每一帧的时间间隔隐藏了信息

可以用identify工具识别他的间隔

1identify -format "%T" xxx.gif

最后将得到的值进行处理

  • 逐帧查看

使用stegsolve工具进行逐帧分析

在这里插入图片描述

盲水印

显然这就是一种肉眼不可见的水印

需要使用bwm工具进行解析

1bwm decode xxx.png xxx_with_wm.png yyy.png

LSB隐写

简单来说就是人眼无法区分所有的颜色,通过修改LSB(最低有效位),在改变少量数据达到隐藏信息的情况下,让人眼无法察觉到前后的变化,已达到隐写的目的,如下图所示。

在这里插入图片描述

针对这类隐写,可能遇到以下类型:

  • 工具分析(利用stegsolve)

  • 数据隐藏(利用kali的lsb工具)

示例如下

1lsb extract secret.png flag.txt  7his_1s_p4s5w0rd
2//extract:提取,后面为需要提取信息的图片和输出的文件名,以及key值

字符串提取

有些题目会往图片里添加一些字符串,可以直接使用kali的strings工具提取

1strings xxx.jpg

可能遇到的隐写情况为:

  • 文件格式修改(把PNG文件的后缀改成其他的文件)
  • 文件格式倒转(文件的Hex值倒转排列,写脚本复原)
  • 文件头缺失(用工具补齐)
  • 修改图片宽高

PNG文件中,每个数据块都由四个部分组成,分别为:

1长度(Length):指定数据块中数据区域的长度,长度不可超过(2^31-1)个字节
2数据块类型码(Chunk Type Code):数据块类型码由ASCII字母(A-Z和a-z)组成的"数据块符号"
3数据块数据(Chunk Data):存储数据块类型码指定的数据
4循环冗余检测(CRC):存储用来检测是否文件传输有误的循环冗余码

修改对应的宽高位的数据即可

image-20241203181824352

  • CRC值爆破**(比较复杂,后续深入了解)**

在遇到图片隐写题目时,原有的图片可能会被修改其宽高,从而导致图片里面的内容无法正常展示,我们可以通过CRC爆破判断他的宽高值是否被修改

通过010或者kali中的pngcheck可以检查图片的CRC32值是否校验错误,确定错误后,即可对其进行修改

简单的宽高隐写,可以通过直接修改宽高值后,显示flag;如果没有办法直接显示,则需要撰写脚本进行爆破,这里贴一个网上大佬写的爆破脚本,可以同时爆破出图片的宽高

 1import struct
 2import zlib
 3
 4def hexStr2bytes(s):
 5    b = b""
 6    for i in range(0,len(s),2):
 7        temp = s[i:i+2]
 8        b +=struct.pack("B",int(temp,16))
 9    return b
10
11str1="49484452"
12str2="0806000000"
13bytes1=hexStr2bytes(str1)
14bytes2=hexStr2bytes(str2)
15wid,hei = 1918,864
16
17crc32 = "0x7dc73f7f"
18
19for w in range(wid,wid+2000):
20    for h in range(hei,hei+2000):
21        width = hex(w)[2:].rjust(8,'0')
22        height = hex(h)[2:].rjust(8,'0')
23        bytes_temp=hexStr2bytes(width+height)
24![image-20241130115330754](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241130115330754.png)
25            print(hex(w),hex(h))

得到宽高后,用010进行修改,然后再进一步分析即可。

  • 文件提取(用binwalk、foremost等工具提取)

PNG

  • JPEG 是有损压缩格式,将像素信息用 JPEG 保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在 0 至 100 之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择 70 或 80 就足够了
  • JPEG 没有透明度信息 PNG文件的文件头由一个8字节的PNG文件标识域和3个以上的后续数据块,如IHDR、IDAT、IEND等组成 image-20241130115629091
1FF D8 FF

另外其文件尾标识为:

FF D9

189 50 4E 47 0D 0A 1A 0A   +数据块+数据块+数据块

可能遇到的隐写情况为: image-20241130121302377

  • 修改图片宽高 50 4E 47:PNG每个字母对应的ASCII,让用户可以使用文本编辑器查看时,识别出是PNG文件 修改对应的宽高位的数据即可 0D 0A:DOS风格的换行符,用于DOS-Unix数据的换行符转换 image-20241203182058198 1A:在DOS命令行下,用于阻止文件显示的文件结束符 0A:Unix风格的换行符,用于Unix-DOS换行符的转换
1
2
3### BMP隐写
4
5BMP 文件格式能够存储单色和彩色的二维数字图像,具有各种颜色深度,并且可以选择使用数据压缩、alpha 通道和颜色配置文件
6
7其文件头标识如下:

42 4D

1
2BMP文件头标识的后四位表示的是BMP的图片大小,示例如下

8E 26 2C 00

1
2由于个人计算机都是以小端序,所以数据要从右往左写
3![image-20241130122539996](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241130122539996.png)
4所以其大小实则应为

0x002c268e == 2893454(Byte) == 2.75M

 1
 2
 3
 4可能遇到的隐写情况为:
 5
 6+ 修改图片宽高
 7
 8![image-20241130133641690](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241130133641690.png)
 9
10
11
12
13
14### EXIF信息
15
16拍摄图片时,exif会记录数码照片的属性信息和拍摄数据,可以通过查看图片属性中的详细信息看到部分exif信息
17
18kali中可以使用exiftool查看更详细的exif数据

image-20241130133915594

 1
 2
 3
 4可能遇到的题型:
 5
 6+ OSINT(社工,查看图片经纬度)
 7+ 
 8
 9
10
11
12![image-20241130133950651](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241130133950651.png)
13### GIF隐写
14
15GIF的文件头标识如下:

47 49 46 38 39 61

 1
 2
 3
 4可能遇到的题型如下:
 5
 6+ GIF帧分离+拼接
 7
 8这类题型需要用到imagemagick工具
 9
10```shell
11sudo apt install imagemagick

对于得到的gif,对它进行帧分离操作

1convert xxx.gif xxx.png		#逐帧分割图片

最后将得到的图片集群拼成一张图片

1montage xxx*.png -tile x1 -geometry +0+0 xxx.png	#合并图片
  • GIF图像特征

有些gif图每帧间存在规律,可能每一帧的时间间隔隐藏了信息

可以用identify工具识别他的间隔

1identify -format "%T" xxx.gif

最后将得到的值进行处理

  • 逐帧查看

image-20241130151942880

在这里插入图片描述

盲水印

显然这就是一种肉眼不可见的水印

需要使用bwm工具进行解析

1bwm decode xxx.png xxx_with_wm.png yyy.png

LSB隐写

简单来说就是人眼无法区分所有的颜色,通过修改LSB(最低有效位),在改变少量数据达到隐藏信息的情况下,让人眼无法察觉到前后的变化,已达到隐写的目的,如下图所示。

在这里插入图片描述

针对这类隐写,可能遇到以下类型:

  • 工具分析(利用stegsolve)

  • 数据隐藏(利用kali的lsb工具)

image-20241203183026788

1lsb extract secret.png flag.txt  7his_1s_p4s5w0rd
2//extract:提取,后面为需要提取信息的图片和输出的文件名,以及key值

字符串提取

有些题目会往图片里添加一些字符串,可以直接使用kali的strings工具提取

1strings xxx.jpg

image-20241130153237257

可能遇到的隐写情况为:

  • 文件格式修改(把PNG文件的后缀改成其他的文件)
  • 文件格式倒转(文件的Hex值倒转排列,写脚本复原)
  • 文件头缺失(用工具补齐)
  • 修改图片宽高

PNG文件中,每个数据块都由四个部分组成,分别为:

1长度(Length):指定数据块中数据区域的长度,长度不可超过(2^31-1)个字节
2数据块类型码(Chunk Type Code):数据块类型码由ASCII字母(A-Z和a-z)组成的"数据块符号"
3数据块数据(Chunk Data):存储数据块类型码指定的数据
4循环冗余检测(CRC):存储用来检测是否文件传输有误的循环冗余码

修改对应的宽高位的数据即可

image-20241124145639083

  • CRC值爆破**(比较复杂,后续深入了解)**

image-20241130155554405 在遇到图片隐写题目时,原有的图片可能会被修改其宽高,从而导致图片里面的内容无法正常展示,我们可以通过CRC爆破判断他的宽高值是否被修改

简单的宽高隐写,可以通过直接修改宽高值后,显示flag;如果没有办法直接显示,则需要撰写脚本进行爆破,这里贴一个网上大佬写的爆破脚本,可以同时爆破出图片的宽高

 1import struct
 2import zlib
 3
 4def hexStr2bytes(s):
 5    b = b""
 6    for i in range(0,len(s),2):
 7        temp = s[i:i+2]
 8        b +=struct.pack("B",int(temp,16))
 9    return b
10
11str1="49484452"
12str2="0806000000"
13bytes1=hexStr2bytes(str1)
14bytes2=hexStr2bytes(str2)
15wid,hei = 1918,864
16
17crc32 = "0x7dc73f7f"
18
19for w in range(wid,wid+2000):
20    for h in range(hei,hei+2000):
21        width = hex(w)[2:].rjust(8,'0')
22        height = hex(h)[2:].rjust(8,'0')
23        bytes_temp=hexStr2bytes(width+height)
24![image-20241130115330754](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241130115330754.png)
25            print(hex(w),hex(h))

得到宽高后,用010进行修改,然后再进一步分析即可。

  • 文件提取(用binwalk、foremost等工具提取)

JPG

  • JPEG 是有损压缩格式,将像素信息用 JPEG 保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在 0 至 100 之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择 70 或 80 就足够了
  • JPEG 没有透明度信息

image-20241130115629091

1FF D8 FF

另外其文件尾标识为:

1FF D9

可能遇到的隐写情况为: image-20241130121302377

  • 修改图片宽高

修改对应的宽高位的数据即可

image-20241124150633539

BMP隐写

BMP 文件格式能够存储单色和彩色的二维数字图像,具有各种颜色深度,并且可以选择使用数据压缩、alpha 通道和颜色配置文件

其文件头标识如下:

142 4D

BMP文件头标识的后四位表示的是BMP的图片大小,示例如下

18E 26 2C 00

由于个人计算机都是以小端序,所以数据要从右往左写 image-20241130122539996 所以其大小实则应为

10x002c268e == 2893454(Byte) == 2.75M

可能遇到的隐写情况为:

  • 修改图片宽高

image-20241130133641690

EXIF信息

拍摄图片时,exif会记录数码照片的属性信息和拍摄数据,可以通过查看图片属性中的详细信息看到部分exif信息

在kali中可以使用exiftool查看更详细的exif数据

1![image-20241130133915594](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241130133915594.png)

例题复现

例题复现主要是对培训或者平时遇到的一些题目进行分析和复现,并进行相应的记录和知识点总结

图片类

ctfshow - misc入门 - misc2

解题过程

附件得到一个txt文本,打开发现显然是个PNG图片,修改后缀为png即可得到flag

image-20241202155038866

image-20241202155115008

复现

将图片后缀改成txt即可

ctfshow - 菜狗杯 - 损坏的压缩包

解题过程

得到的压缩包打开发现显示如下,丢去winhex看看,发现其实是个PNG图片,改一下后缀即可得到flag

image-20241202155507436

image-20241202155750722

image-20241202155814157

复现

将flag图片的后缀改成zip即可

ctfshow - misc入门 - misc10

解题过程

得到一张图片,简单分析发现啥也没有,试着用binwalk分析分离一下,可以发现有两个2zlib文件,

image-20241126171244428

image-20241126171353951

简单看看他们的内容,可以在第一个文件里发现flag

image-20241126171420449

复现

ctfshow - misc入门 - misc8

解题过程

下载附件,得到图片,然后老样子:详细信息,winhex分析,但是都没有找到明显的信息。想到题目里面给了提示:flag在图片文件中图片文件中,因此猜测是不是图片里藏了别的文件

image-20241125210853557

用binwalk对其进行分析,发现有两张png图片

image-20241125210923403

用foremost分离文件,得到两张png图片,其中一张即为flag

image-20241125204553341

复现

ctfshow - misc入门 - misc18

解题过程

打开图片后,发现啥也没有

image-20241202161544769

简单看看图片的属性,便可发现flag别切割成了多个部分,放在多个属性中(也可以用exiftool查看)

image-20241202161639382

整合后即可得到完整的flag

复现

直接修改图片属性里的详细信息即可

ctfshow - misc入门 -misc5

解题过程

得到一张图片,打开啥也没有,属性也没有什么信息,丢去winhex里分析一下

image-20241202163050737

然后可以在数据末尾发现flag

image-20241202163137322

复现

将图片丢进winhex里进行处理,然后将flag插入图片的数据末尾即可

ctfshow-misc入门-misc11

解题过程

打开图片发现啥也没有,属性,winhex中也不能看到明显的信息,用tweakpng打开发现存在两个IDAT块,删掉第一个后保存即可得到flag

image-20241202164321735

image-20241202164337002

复现

用tweakpng在flag图片的基础上,插入一个隐藏图片的IDAT块即可;或者用winhex或010插入数据应该也可以

ctfshow - misc入门 - misc25

解题过程

打开图片没有任何信息,属性也没有信息,用winhex进行分析

image-20241202170405720

尝试修改图片高度,保存后发现flag(有些图片修改后可能无法正常显示,此时需要CRC32爆破)

image-20241202170457651

image-20241202170542107

复现

用winhex或者010修改flag图片的高度即可

ctfshow-misc入门-misc50

解题过程

打开图片 发现啥信息都没有,不过图片长得很怪,很多噪点(不知道是不是某种特征) ,丢给stegsolve分析一下,

image-20241202170924395

翻页后可以发现flag

image-20241202171059829

image-20241202171131627

image-20241202171107972

或者丢去aperisolve直接梭哈

image-20241202171154539

复现

好像是用python写隐写脚本,没研究的太明白

ctfshow - misc入门 - misc53

解题过程

得到一张图片,看不到任何信息,属性也没有内容,winhex也找不到任何有效信息

image-20241202190848185

丢到stegsolve中查看,翻页发现也没有任何的信息,尝试修改颜色通道信息后,可得到flag

image-20241202191812040

复现

应该也是通过写脚本实现

攻防世界 - misc - misc_pic_again

解题过程

得到一张图片,没有任何明显的信息,丢给stegsolve处理,修改颜色通道,可以发现藏有一个压缩包,保存后解压

image-20241202193004237

解压后得到一个文件,在文件中可以找到flag

image-20241202193039002

复现

写脚本

ctfshow - misc入门 - misc37

解题过程

得到一张gif图,查看后可以发现里面隐约藏了内容,直接分离gif里的每一帧,拼凑起来就可以得到flag

image-20241202193350205

复现

用flag做一张gif图就好了

攻防世界 - misc - a_good_idea

解题过程

得到一张图片,用binwalk分离可以得到两张图片

image-20241202195841944

用stegsolve合并两张图片,先todo再to,然后可以发现藏有一个二维码

image-20241202195914466

扫码后得到flag

image-20241202195930967

复现

用copy将图片和一个zip合并,zip里放两张图片,至于两张图片怎么弄不知道

压缩包类

攻防世界 - misc - János-the-Ripper

解题过程

解压得到一个misc100文件,丢进winhex可以发现是个zip,修改后缀后,发现解压需要密码

image-20241202200402513

直接用ARCHPR爆破,得到密码后解压即可得到flag

image-20241202200330800

复现

将flag文档加密压缩后,去掉后缀即可

ctfshow-萌新-萌新 隐写2

解题过程

打开压缩包发现要密码,根据题目提示可以猜测压缩包密码格式应该是199?????,因此我们可以进行掩码攻击(其实这个格式感觉不用也行)

image-20241202201314620

爆破后即可得到flag

image-20241203181554251

复现

加密压缩即可

可能遇到的题型:

  • OSINT(社工,查看图片经纬度)

image-20241130133950651

GIF隐写

GIF的文件头标识如下:

147 49 46 38 39 61

可能遇到的题型如下:

  • GIF帧分离+拼接

这类题型需要用到imagemagick工具

1sudo apt install imagemagick

对于得到的gif,对它进行帧分离操作

1convert xxx.gif xxx.png		#逐帧分割图片

最后将得到的图片集群拼成一张图片

1montage xxx*.png -tile x1 -geometry +0+0 xxx.png	#合并图片
  • GIF图像特征

有些gif图每帧间存在规律,可能每一帧的时间间隔隐藏了信息

可以用identify工具识别他的间隔

1identify -format "%T" xxx.gif

最后将得到的值进行处理

  • 逐帧查看

image-20241130151942880

在这里插入图片描述

盲水印

显然这就是一种肉眼不可见的水印

需要使用bwm工具进行解析

1bwm decode xxx.png xxx_with_wm.png yyy.png

LSB隐写

简单来说就是人眼无法区分所有的颜色,通过修改LSB(最低有效位),在改变少量数据达到隐藏信息的情况下,让人眼无法察觉到前后的变化,已达到隐写的目的,如下图所示。

在这里插入图片描述

针对这类隐写,可能遇到以下类型:

  • 工具分析(利用stegsolve)

  • 数据隐藏(利用kali的lsb工具)

image-20241203183026788

1lsb extract secret.png flag.txt  7his_1s_p4s5w0rd
2//extract:提取,后面为需要提取信息的图片和输出的文件名,以及key值

字符串提取

有些题目会往图片里添加一些字符串,可以直接使用kali的strings工具提取

1strings xxx.jpg

image-20241130153237257

压缩包

前言

压缩包也是CTF中十分常见的考点,几乎什么题目里面都可以涉及到压缩包的处理

而它的主要出题方向是:

  • 伪加密
  • 明文攻击
  • CRC爆破
  • 暴力破解
  • ……

前置知识补充

  • 压缩包的密码可以是中英文字符、数字和符号,没有思路时可以直接纯数字/字母暴力爆破一下

ZIP结构

image-20241130155554405

文件格式

  1
  2| 压缩源文件数据区                                | 核心目录          | 目录结束                        |
  3| :---------------------------------------------- | :---------------- | :------------------------------ |
  4| local file header + file data + data descriptor | central directory | end of central directory record |
  5
  6
  7
  8**注:以下表格内除了专门标注出固定值的,其他内容的HEX数据会根据压缩包的不同而不同**
  9
 10##### 压缩源文件数据区
 11
 12| HEX 数据        | 描述                                                         | 010Editor 模板数据          |
 13| :-------------- | :----------------------------------------------------------- | :-------------------------- |
 14| **50 4B 03 04** | local file header,zip 文件头标记,**固定值**,记录了该压缩文件的信息,解码得到的文本为 PK 开头 | char frSignature[4]         |
 15| 14 00           | 解压文件所需 pkware 版本                                     | ushort frVersion            |
 16| 00 00           | 全局方式位标记(有无加密),头文件标记后 2bytes              | ushort frFlags              |
 17| 08 00           | 压缩方式                                                     | enum COMPTYPE frCompression |
 18| C7 4D           | 最后修改文件时间                                             | DOSTIME frFileTime          |
 19| BF 54           | 最后修改文件日期                                             | DOSDATE frFileDate          |
 20| 74 04 44 4A     | CRC-32 校验                                                  | uint frCrc                  |
 21| 5F A4 05 00     | 压缩后尺寸                                                   |                             |
 22| 74 BF 05 00     | 未压缩尺寸                                                   |                             |
 23| 11 00           | 文件名长度                                                   |                             |
 24| 1D 00           | 扩展记录长度                                                 |                             |
 25
 26![image-20241130115330754](C:\Users\hp\Desktop\培训\misc\第一次培训图片\image-20241130115330754.png)
 27
 28##### 压缩源文件目录区
 29
 30| HEX 数据        | 描述                                              | 010Editor 模板数据          |
 31| --------------- | ------------------------------------------------- | --------------------------- |
 32| **50 4B 01 02** | 目录中文件文件头标记,**固定值**                  | char deSignature[4]         |
 33| 14 00           | 压缩使用的 pkware 版本                            | ushort deVersionMadeBy      |
 34| 14 00           | 解压文件所需 pkware 版本                          | ushort deVersionToExtract   |
 35| 00 00           | 全局方式位标记(有无加密),目录文件标记后 4bytes | ushort frFlags              |
 36| 08 00           | 压缩方式                                          | enum COMPTYPE frCompression |
 37| C7 4D           | 最后修改文件时间                                  | DOSTIME frFileTime          |
 38| BF 54           | 最后修改文件日期                                  | DOSDATE frFileDate          |
 39| 74 04 44 4A     | CRC-32 校验                                       | uint frCrc                  |
 40| 5F A4 05 00     | 压缩后尺寸                                        |                             |
 41| 74 BF 05 00     | 未压缩尺寸                                        |                             |
 42| 11 00           | 文件名长度                                        |                             |
 43| 41 00           | 扩展字段长度                                      |                             |
 44| 00 00           | 文件注释长度                                      |                             |
 45| 00 00           | 磁盘开始号                                        |                             |
 46| 00 00           | 内部文件属性                                      |                             |
 47| 20 00 00 00     | 外部文件属性                                      |                             |
 48| 00 00 00 00     | 局部头部偏移量                                    |                             |
 49
 50![image-20241130115629091](C:\Users\hp\Desktop\培训\misc\第一次培训图片\image-20241130115629091.png)
 51
 52##### 压缩源文件目录结束标志
 53
 54| HEX数据         | 描述                                                         | 010Editor模板数据        |
 55| --------------- | ------------------------------------------------------------ | ------------------------ |
 56| **50 4B 05 06** | 目录结束标记,**固定值,**用于标记压缩的目录数据的结束。每个压缩文件必须有且只有一个结束标志 | char elSignature[4]      |
 57| 00 00           | 当前磁盘编号                                                 | ushort elDiskNumber      |
 58| 00 00           | 目录区开始磁盘编号                                           | ushort elStartDiskNumber |
 59| 16 00           | 本磁盘上纪录总数                                             |                          |
 60| 16 00           | 目录区中纪录总数                                             |                          |
 61| 97 0D 00 00     | 目录区尺寸大小                                               |                          |
 62| 91 DE B0 01     | 目录区对第一张磁盘的偏移量                                   |                          |
 63| 00 00           | ZIP 文件注释长度                                             |                          |
 64
 65![image-20241130121302377](C:\Users\hp\Desktop\培训\misc\第一次培训图片\image-20241130121302377.png)
 66
 67
 68
 69### RAR结构
 70
 71#### 文件格式
 72
 73RAR 文件主要由标记块,压缩文件头块,文件头块,结尾块组成。
 74
 75其每一块大致分为以下几个字段:
 76
 77| 名称       | 大小 | 描述                  |
 78| :--------- | :--- | :-------------------- |
 79| HEAD_CRC   | 2    | 全部块或块部分的CRC   |
 80| HEAD_TYPE  | 1    | 块类型                |
 81| HEAD_FLAGS | 2    | 阻止标志              |
 82| HEAD_SIZE  | 2    | 块大小                |
 83| ADD_SIZE   | 4    | 可选字段 - 添加块大小 |
 84
 85
 86
 87##### 文件头标识
 88
 89| HEX 数据             | 描述                            | 010Editor 模板数据 |
 90| -------------------- | ------------------------------- | ------------------ |
 91| 52 61 72 21 1A 07 00 | rar 文件头标记,文本为 **Rar!** |                    |
 92
 93![image-20241130122539996](C:\Users\hp\Desktop\培训\misc\第一次培训图片\image-20241130122539996.png)
 94
 95
 96
 97##### Main block
 98
 99| HEX 数据    | 描述              | 010Editor 模板数据       |
100| ----------- | ----------------- | ------------------------ |
101| 25 CB 7C FD | 全部块的 CRC32  | uint32 HEAD_CRC          |
102| 0C          | 块大小            | struct uleb128 HeadSize  |
103| 01          | 块类型            | struct uleb128 HeadType  |
104| 05          | 阻止标志          | struct uleb128 HeadFlags |
105
106![image-20241130133641690](C:\Users\hp\Desktop\培训\misc\第一次培训图片\image-20241130133641690.png)
107
108
109
110##### 文件头(File Header)
111
112| HEX 数据    | 描述              | 010Editor 模板数据      |
113| ----------- | ----------------- | ----------------------- |
114| 5C 8B D2 90 | 单独块的 CRC32  | uint32 HEAD_CRC         |
115| 3D          | 块大小            | struct uleb128 HeadSize |
116| 02          | 块类型            | struct uleb128 HeadType |
117| 03          | 阻止标志          | struct uleb128 HeadFlag |
118
119![image-20241130133915594](C:\Users\hp\Desktop\培训\misc\第一次培训图片\image-20241130133915594.png)
120
121
122## 例题复现
123
124例题复现主要是对培训或者平时遇到的一些题目进行分析和复现,并进行相应的记录和知识点总结
125
126
127
128### 图片类
129
130#### ctfshow - misc入门 - misc2
131
132##### 解题过程
133
134附件得到一个txt文本,打开发现显然是个PNG图片,修改后缀为png即可得到flag
135
136![image-20241202155038866](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202155038866.png)
137
138![image-20241202155115008](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202155115008.png)
139
140
141
142##### 复现
143
144将图片后缀改成txt即可
145
146
147
148#### ctfshow - 菜狗杯 - 损坏的压缩包
149
150##### 解题过程
151
152得到的压缩包打开发现显示如下,丢去winhex看看,发现其实是个PNG图片,改一下后缀即可得到flag
153
154![image-20241202155507436](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202155507436.png)
155
156![image-20241202155750722](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202155750722.png)
157
158![image-20241202155814157](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202155814157.png)
159
160
161
162##### 复现
163
164flag图片的后缀改成zip即可
165
166
167
168
169
170#### ctfshow - misc入门 - misc10
171
172##### 解题过程
173
174得到一张图片,简单分析发现啥也没有,试着用binwalk分析分离一下,可以发现有两个2zlib文件
175
176![image-20241126171244428](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241126171244428.png)
177
178![image-20241126171353951](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241126171353951.png)
179
180简单看看他们的内容,可以在第一个文件里发现flag
181
182![image-20241126171420449](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241126171420449.png)
183
184
185
186
187
188##### 复现
189
190
191
192
193
194
195
196#### ctfshow - misc入门 - misc8
197
198##### 解题过程
199
200下载附件,得到图片,然后老样子:详细信息,winhex分析,但是都没有找到明显的信息。想到题目里面给了提示:**`flag在图片文件中图片文件中`**,因此猜测是不是图片里藏了别的文件
201
202![image-20241125210853557](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241125210853557.png)
203
204binwalk对其进行分析,发现有两张png图片
205
206![image-20241125210923403](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241125210923403.png)
207
208foremost分离文件,得到两张png图片,其中一张即为flag
209
210![image-20241125204553341](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241125204553341.png)
211
212
213
214##### 复现
215
216
217
218
219
220#### ctfshow - misc入门 - misc18
221
222##### 解题过程
223
224打开图片后,发现啥也没有
225
226![image-20241202161544769](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202161544769.png)
227
228简单看看图片的属性,便可发现flag别切割成了多个部分,放在多个属性中(也可以用exiftool查看
229
230![image-20241202161639382](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202161639382.png)
231
232整合后即可得到完整的flag
233
234
235
236##### 复现
237
238直接修改图片属性里的详细信息即可
239
240
241
242
243
244#### ctfshow - misc入门 -misc5
245
246##### 解题过程
247
248得到一张图片,打开啥也没有,属性也没有什么信息,丢去winhex里分析一下
249
250![image-20241202163050737](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202163050737.png)
251
252然后可以在数据末尾发现flag
253
254![image-20241202163137322](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202163137322.png)
255
256
257
258##### 复现
259
260将图片丢进winhex里进行处理,然后将flag插入图片的数据末尾即可
261
262
263
264
265
266#### ctfshow-misc入门-misc11
267
268##### 解题过程
269
270打开图片发现啥也没有,属性,winhex中也不能看到明显的信息,用tweakpng打开发现存在两个IDAT块,删掉第一个后保存即可得到flag
271
272![](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202164146394.png)
273
274![image-20241202164321735](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202164321735.png)
275
276![image-20241202164337002](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202164337002.png)
277
278
279
280##### 复现
281
282tweakpng在flag图片的基础上,插入一个隐藏图片的IDAT块即可;或者用winhex或010插入数据应该也可以
283
284
285
286#### ctfshow - misc入门 - misc25
287
288##### 解题过程
289
290打开图片没有任何信息,属性也没有信息,用winhex进行分析
291
292![image-20241202170405720](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202170405720.png)
293
294尝试修改图片高度,保存后发现flag(有些图片修改后可能无法正常显示,此时需要CRC32爆破
295
296![image-20241202170457651](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202170457651.png)
297
298![image-20241202170542107](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202170542107.png)
299
300
301
302##### 复现
303
304winhex或者010修改flag图片的高度即可
305
306
307
308#### ctfshow-misc入门-misc50
309
310##### 解题过程
311
312打开图片 发现啥信息都没有,不过图片长得很怪,很多噪点(不知道是不是某种特征)  ,丢给stegsolve分析一下
313
314![image-20241202170924395](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202170924395.png)
315
316翻页后可以发现flag
317
318![image-20241202171059829](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202171059829.png)
319
320![image-20241202171131627](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202171131627.png)
321
322![image-20241202171107972](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202171107972.png)
323
324或者丢去aperisolve直接梭哈
325
326![image-20241202171154539](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202171154539.png)
327
328
329
330##### 复现
331
332好像是用python写隐写脚本,没研究的太明白
333
334
335
336#### ctfshow - misc入门 - misc53
337
338##### 解题过程
339
340得到一张图片,看不到任何信息,属性也没有内容,winhex也找不到任何有效信息
341
342![image-20241202190848185](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202190848185.png)
343
344丢到stegsolve中查看,翻页发现也没有任何的信息,尝试修改颜色通道信息后,可得到flag
345
346![image-20241202191812040](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202191812040.png)
347
348
349
350##### 复现
351
352应该也是通过写脚本实现
353
354
355
356#### 攻防世界 - misc - misc_pic_again
357
358##### 解题过程
359
360得到一张图片,没有任何明显的信息,丢给stegsolve处理,修改颜色通道,可以发现藏有一个压缩包,保存后解压
361
362![image-20241202193004237](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202193004237.png)
363
364解压后得到一个文件,在文件中可以找到flag
365
366![image-20241202193039002](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202193039002.png)
367
368
369
370##### 复现
371
372写脚本
373
374
375
376
377
378#### ctfshow - misc入门 - misc37
379
380##### 解题过程
381
382得到一张gif图,查看后可以发现里面隐约藏了内容,直接分离gif里的每一帧,拼凑起来就可以得到flag
383
384![image-20241202193350205](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202193350205.png)
385
386
387
388##### 复现
389
390flag做一张gif图就好了
391
392
393
394#### 攻防世界 - misc - a_good_idea
395
396##### 解题过程
397
398得到一张图片,用binwalk分离可以得到两张图片
399
400![image-20241202195841944](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202195841944.png)
401
402stegsolve合并两张图片,先todo再to,然后可以发现藏有一个二维码
403
404![image-20241202195914466](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202195914466.png)
405
406扫码后得到flag
407
408![image-20241202195930967](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202195930967.png)
409
410
411
412##### 复现
413
414copy将图片和一个zip合并zip里放两张图片,至于两张图片怎么弄不知道
415
416
417
418
419
420### 压缩包类
421
422#### 攻防世界 - misc - János-the-Ripper
423
424##### 解题过程
425
426解压得到一个misc100文件,丢进winhex可以发现是个zip,修改后缀后,发现解压需要密码
427
428![image-20241202200402513](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202200402513.png)
429
430直接用ARCHPR爆破,得到密码后解压即可得到flag
431
432![image-20241202200330800](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202200330800.png)
433
434
435
436##### 复现
437
438flag文档加密压缩后,去掉后缀即可
439
440
441
442#### ctfshow-萌新-萌新 隐写2
443
444##### 解题过程
445
446打开压缩包发现要密码,根据题目提示可以猜测压缩包密码格式应该是199?????,因此我们可以进行掩码攻击(其实这个格式感觉不用也行)
447
448![image-20241202201314620](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241202201314620.png)
449
450爆破后即可得到flag
451
452![image-20241203181554251](https://raw.githubusercontent.com/2hi5hu/md_image/main/img/image-20241203181554251.png)
453
454
455
456##### 复现
457
458加密压缩即可
459
460
461
462
463
464
465
466
467
468
469##### 结尾块(Terminator)
470
471| HEX 数据    | 描述            | 010Editor 模板数据      |
472| ----------- | --------------- | ----------------------- |
473| 1D 77 56 51 | 固定的 CRC32  | uint32 HEAD_CRC         |
474| 03          | 块大小          | struct uleb128 HeadSize |
475| 05          | 块类型          | struct uleb128 HeadType |
476| 04 00       | 阻止标志        | struct uleb128 HeadFlag |
477
478![image-20241130133950651](C:\Users\hp\Desktop\培训\misc\第一次培训图片\image-20241130133950651.png)
479
480
481
482### 7z结构
483
484#### 文件格式
485
4867z格式的压缩包对应的文件头为

37 7A BC AF 27 1C

 1
 2
 3
 4
 5
 6
 7
 8
 9
10### 爆破
11
12爆破,顾名思义就是在得不到任何已知条件或者已知条件非常有限的情况下,暴力估测我们所需要的密码是多少(就是遍历所有可能),适合密码较为容易或者知道密码范围/格式,包括字典爆破、掩码攻击等
13
14
15
16压缩包密码爆破中常常用到的工具有:
17
18+ ARCHPR
19+ fcrackzip
20+ hashcat
21+ Ziprello
22
23
24
25#### 暴力破解
26
27**以ARCHPR进行爆破为例**
28
29作为最普通的密码攻击手段,ARCHPR允许在范围选项卡中,选择暴力破解的字符集:
30
31其中ARCHPR中的所有特殊符号如下
32
33```bash
34!@#$%^&*()_+-=<>,./?[]{}~:;`'|"\

此外,我们还可以自定义字符集:通过勾选用户定义,然后点击右边的”自定义字符集”选项

image-20241130151942880

如你所见,在给定的字符集中,只囊括了ASCII可打印字符,如果 .zip 的密码是中文的话,那就必须选择”自定义字符集”,并且勾选转换为OEM编码;否则密码会”Not Found”

  • 在长度选项卡中,设置密码长度:
  • 在范围选项卡的右边,可以看到:开始于、结束于

还需要知道,ARCHPR在暴力破解密码的时候,采用了特定的破解顺序:

  • 大小字母 A - Z
  • 空格
  • 小写字母 a - z
  • 数字 0 - 9
  • 特殊字符 !@#$ … 也就是说,暴力破解密码的顺序大致为:
1"AAA" -> "AAB" -> "AAC" -> ... -> "AAZ" -> "AA " -> "AAa" -> "AAb" -> ... -> "AAz" -> "AA0" -> "AA1" -> ... -> "AA9" -> "AA!" -> "AA@"

上图的”开始于”有2个作用:

当你知道密码长度为5,并且第一个字符为 k,你可以在”开始于”设置kAAAA,那么ARCHPR将跳过AAAAAkAAAA的前一个的暴力破解,节省时间 如果破解密码的时间太长,ARCHPR会每隔5分钟自动保存密码(在自动保存选项卡中可以选择),如果某次暴力破解被迫中断,那么可以通过查看最后一次保存的密码,并设置”开始于”,直接从上次爆破的地方继续开始爆破 “结束于”的作用类似

容易遇到的问题

  • 在尝试用ARCHPR进行暴力破解时,可能会显示

img

这是因为zip的压缩算法是有版本的,ARCHPR不支持较高版本的ZIP,这时候可以选择更换爆破工具,如fcrackzip

掩码攻击

同样以ARCHPR为例

掩码攻击属于局部暴力破解,本质上就是我们知道了密码的一部分后,我们可以通过使用?代替不知道的部分,针对性的进行爆破,从而大大减少爆破时间

要注意的是,掩码攻击是固定长度的

如果密码本身含有?,可以再高级选项中修改掩码符号

image-20241130153237257

字典爆破

字典爆破比暴力破解而言更为的迅速智能,其本质就是准备了大量的常用密码,利用这些常用密码去进行遍历爆破,因此一份好的字典是非常重要的

1Github上有许多开源的现成爆破字典:
2https://github.com/rootphantomer/Blasting_dictionary

在ARCHPR中,字典爆破提供了三个特别选项:

  • 智能变化

简单来说就是,以password这个密码为例,他会将其进行各种程度的变化,大小写变换之类的

  • 尝试所有可能得大小s写组合

与智能变化类似,以password为例,ARCHPR会逐渐将每一个字母转换为大写,只到变成PASSWORD

  • 转换为OEM编码

当字典元素不只有包含拉丁字母时,这个选项才会生效

image-20241130155554405

注释

往往在压缩包的注释中,也可能藏有一些提示信息或是隐藏信息,比如隐藏了摩斯电码,对注释进行反色或是利用tab和空格制造摩斯电码等

伪加密

ZIP

原理

在上文 ZIP 结构中的 压缩源文件数据区压缩源文件目录区 中,我们强调了一个叫做全局方式位标记 (General purpose bit flag)2 字节,不同比特位有着不同的含义。

 1Bit 0: If set, indicates that the file is encrypted.				#设置后表示该文件已加密
 2
 3(For Method 6 - Imploding)
 4Bit 1: If the compression method used was type 6,					#
 5     Imploding, then this bit, if set, indicates
 6     an 8K sliding dictionary was used.  If clear,
 7     then a 4K sliding dictionary was used.
 8...
 9Bit 6: Strong encryption.  If this bit is set, you should			 #
10     set the version needed to extract value to at least
11     50 and you must also set bit 0.  If AES encryption
12     is used, the version needed to extract value must
13     be at least 51.
14...

通常全局方式位标记为 2 bytes 长度,第一字节数字为偶数表示无加密,例如:00,02,04 等;为奇数表示有加密,例如 01,03,09 等。

是否加密全局方式位标记数据解释
无加密源文件数据区和源文件目录区中均为00 00
伪加密源文件数据区应为09 00,源文件目录区应为00 00或者01 00
真加密源文件数据区应为09 00,源文件目录区应为09 00

修改伪加密的方法:

  • 16 进制下修改通用位标记,改为00 00
  • binwalk -e 无视伪加密,直接分离文件
  • Mac OS 及部分 Linux(如 Kali )系统中,可以直接打开伪加密的 ZIP 压缩包
  • 直接使用检测伪加密的小工具 ZipCenOp.jar修复
1java -jar ZipCenOp.jar r screct.zip
2
3注意:ZipCenOp.zip 对正常加密的 .zip 压缩包会直接修改所有加密位为偶数,虽然会让ZIP压缩软件显示”未加密”,但往往 .zip 文件也损坏了,得到”CRC校验错误”的结果
  • 有时候用 WinRar 的修复功能(此方法有时有奇效,不仅针对伪加密)

RAR

原理

没搞懂

明文攻击

明文攻击,顾名思义,需要我们有一部分已知信息去对未知的内容进行爆破,而其中又分为

  • 已知所有明文(或三段密钥)
  • 已知部分明文
原理
  • .zip 传统加密算法本质上是伪随机数流明文进行异或,产生这个伪随机流需要用到3个32 bits的key;找到这3个key,就能解开加密的文件
  • 压缩软件用这3个key加密压缩包中的所有文件,当我们得到已加密压缩包中的任意一个文件,如果我们用同样的压缩方法进行无密码的压缩,得到的无密码 .zip 和有密码的 .zip 进行比较,分析两个文件的不同点,就能得到3个key了
  • 用相同的压缩方法将该明文压缩成 .zip在拥有2个 .zip 文件后,由于新的 .zip 和原本的 .zip 用同样的压缩方法放置入了至少1个相同的文件,那么就能够根据新的 .zip 爆破出压缩密码
  • 明文需大于12 bytes
工具

明文攻击中常用的工具如下

  • ARCHPR
  • bkcrack

CRC32爆破

原理

CRC 本身是「冗余校验码」的意思,CRC32 则表示会产生一个 32 bit ( 8 位十六进制数)的校验值。由于 CRC32 产生校验值时源数据块的每一个 bit (位)都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的 CRC32 值。

CRC32 校验码出现在很多文件中比如 png 文件,同样 zip 中也有 CRC32 校验码。值得注意的是 zip 中的 CRC32 是未加密文件的校验值。

这也就导致了基于 CRC32 的攻击手法。

  • 小文件(一般比赛中大多为 4 字节左右)
  • 加密的密码很长

我们不去爆破压缩包的密码,而是直接去爆破源文件的内容(一般都是可见的字符串),从而获取想要的信息。

通常来说需要搓一些脚本来进行CRC32爆破,也可以用一些现成的脚本,如:

1https://github.com/theonlypwner/crc32

例题复现

例题复现主要是对培训或者平时遇到的一些题目进行分析和复现,并进行相应的记录和知识点总结

图片类

ctfshow - misc入门 - misc2

解题过程

附件得到一个txt文本,打开发现显然是个PNG图片,修改后缀为png即可得到flag

image-20241202155038866

image-20241202155115008

复现

将图片后缀改成txt即可

ctfshow - 菜狗杯 - 损坏的压缩包

解题过程

得到的压缩包打开发现显示如下,丢去winhex看看,发现其实是个PNG图片,改一下后缀即可得到flag

image-20241202155507436

image-20241202155750722

image-20241202155814157

复现

将flag图片的后缀改成zip即可

ctfshow - misc入门 - misc10

解题过程

得到一张图片,简单分析发现啥也没有,试着用binwalk分析分离一下,可以发现有两个2zlib文件,

image-20241126171244428

image-20241126171353951

简单看看他们的内容,可以在第一个文件里发现flag

image-20241126171420449

复现

ctfshow - misc入门 - misc8

解题过程

下载附件,得到图片,然后老样子:详细信息,winhex分析,但是都没有找到明显的信息。想到题目里面给了提示:flag在图片文件中图片文件中,因此猜测是不是图片里藏了别的文件

image-20241125210853557

用binwalk对其进行分析,发现有两张png图片

image-20241125210923403

用foremost分离文件,得到两张png图片,其中一张即为flag

image-20241125204553341

复现

ctfshow - misc入门 - misc18

解题过程

打开图片后,发现啥也没有

image-20241202161544769

简单看看图片的属性,便可发现flag别切割成了多个部分,放在多个属性中(也可以用exiftool查看)

image-20241202161639382

整合后即可得到完整的flag

复现

直接修改图片属性里的详细信息即可

ctfshow - misc入门 -misc5

解题过程

得到一张图片,打开啥也没有,属性也没有什么信息,丢去winhex里分析一下

image-20241202163050737

然后可以在数据末尾发现flag

image-20241202163137322

复现

将图片丢进winhex里进行处理,然后将flag插入图片的数据末尾即可

ctfshow-misc入门-misc11

解题过程

打开图片发现啥也没有,属性,winhex中也不能看到明显的信息,用tweakpng打开发现存在两个IDAT块,删掉第一个后保存即可得到flag

image-20241202164321735

image-20241202164337002

复现

用tweakpng在flag图片的基础上,插入一个隐藏图片的IDAT块即可;或者用winhex或010插入数据应该也可以

ctfshow - misc入门 - misc25

解题过程

打开图片没有任何信息,属性也没有信息,用winhex进行分析

image-20241202170405720

尝试修改图片高度,保存后发现flag(有些图片修改后可能无法正常显示,此时需要CRC32爆破)

image-20241202170457651

image-20241202170542107

复现

用winhex或者010修改flag图片的高度即可

ctfshow-misc入门-misc50

解题过程

打开图片 发现啥信息都没有,不过图片长得很怪,很多噪点(不知道是不是某种特征) ,丢给stegsolve分析一下,

image-20241202170924395

翻页后可以发现flag

image-20241202171059829

image-20241202171131627

image-20241202171107972

或者丢去aperisolve直接梭哈

image-20241202171154539

复现

好像是用python写隐写脚本,没研究的太明白

ctfshow - misc入门 - misc53

解题过程

得到一张图片,看不到任何信息,属性也没有内容,winhex也找不到任何有效信息

image-20241202190848185

丢到stegsolve中查看,翻页发现也没有任何的信息,尝试修改颜色通道信息后,可得到flag

image-20241202191812040

复现

应该也是通过写脚本实现

攻防世界 - misc - misc_pic_again

解题过程

得到一张图片,没有任何明显的信息,丢给stegsolve处理,修改颜色通道,可以发现藏有一个压缩包,保存后解压

image-20241202193004237

解压后得到一个文件,在文件中可以找到flag

image-20241202193039002

复现

写脚本

ctfshow - misc入门 - misc37

解题过程

得到一张gif图,查看后可以发现里面隐约藏了内容,直接分离gif里的每一帧,拼凑起来就可以得到flag

image-20241202193350205

复现

用flag做一张gif图就好了

攻防世界 - misc - a_good_idea

解题过程

得到一张图片,用binwalk分离可以得到两张图片

image-20241202195841944

用stegsolve合并两张图片,先todo再to,然后可以发现藏有一个二维码

image-20241202195914466

扫码后得到flag

image-20241202195930967

复现

用copy将图片和一个zip合并,zip里放两张图片,至于两张图片怎么弄不知道

压缩包类

攻防世界 - misc - János-the-Ripper

解题过程

解压得到一个misc100文件,丢进winhex可以发现是个zip,修改后缀后,发现解压需要密码

image-20241202200402513

直接用ARCHPR爆破,得到密码后解压即可得到flag

image-20241202200330800

复现

将flag文档加密压缩后,去掉后缀即可

ctfshow-萌新-萌新 隐写2

解题过程

打开压缩包发现要密码,根据题目提示可以猜测压缩包密码格式应该是199?????,因此我们可以进行掩码攻击(其实这个格式感觉不用也行)

image-20241202201314620

爆破后即可得到flag

image-20241202201448020

复现

加密压缩即可