咕了这么久准备开始慢慢总结一下misc吧

CTF常见的压缩文件破解

​ 这个应该算是misc里面的基础了,因为一言不合就会让你破解一个zip=。=,以下是一些基础的攻击手段:

  1. 爆破
  2. 掩码爆破
  3. 字典爆破
  4. 明文攻击
  5. 伪加密
  6. CRC32碰撞

PS:可以下载Advanced Archive Password Recovery,几乎所有的攻击方式都有

爆破

image-20200313162108171.png

​ 最简单的爆破,也就是一个一个密码去尝试解密,但是一般在没有提示的情况下,先爆破到8~9位数字,然后加上字母大小写,总时长如果7分钟内没有出现密码,那就不是这种解题方式了

掩码爆破

image-20200313162527888.png

​ 这种的也是爆破,但是比起上面的爆破多了一个范围,因为已经确定了一部分的密码,但是怎么知道是不是掩码爆破就得看看自己的信息收集了,一般的信息可以在zip文件的描述,即使用WinRAR打开,或是二进制末位

字典爆破

image-20200313162848105.png

​ 这种爆破手段的强弱决定于你的密码字典,一般都是尝试很常见的弱密码,爆破时长推荐和上面的最简单的爆破时间一样,现有的弱口令字典可以使用kali的rockyou.txt

明文攻击

image-20200313163221015.png

​ 明文攻击大致原理就是有一个需要解密的ZIP而且不知道密码,但幸运的是有ZIP包里一个已知文件,将已知文件进行ZIP加密后和待解密的ZIP里已知文件进行hex对比,两者的区别就是ZIP加密的三个key。但是这种方式需要注意的是压缩方式一定得一样,不然的话会出现很多奇怪的错误。

伪加密

​ 要知道伪加密我们首先得知道zip的结构是什么:

压缩源文件数据区:
50 4B 03 04:这是头文件标记(0x04034b50)
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密)
08 00:压缩方式
5A 7E:最后修改文件时间
F7 46:最后修改文件日期
16 B5 80 14:CRC-32校验(1480B516)
19 00 00 00:压缩后尺寸(25)
17 00 00 00:未压缩尺寸(23)
07 00:文件名长度
00 00:扩展记录长度

压缩源文件目录区:
50 4B 01 02:目录中文件文件头标记(0x02014b50)
3F 00:压缩使用的 pkware 版本
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了)
08 00:压缩方式
5A 7E:最后修改文件时间
F7 46:最后修改文件日期
16 B5 80 14:CRC-32校验(1480B516)
19 00 00 00:压缩后尺寸(25)
17 00 00 00:未压缩尺寸(23)
07 00:文件名长度
24 00:扩展字段长度
00 00:文件注释长度
00 00:磁盘开始号
00 00:内部文件属性
20 00 00 00:外部文件属性
00 00 00 00:局部头部偏移量

压缩源文件目录结束标志:
50 4B 05 06:目录结束标记
00 00:当前磁盘编号
00 00:目录区开始磁盘编号
01 00:本磁盘上纪录总数
01 00:目录区中纪录总数
59 00 00 00:目录区尺寸大小
3E 00 00 00:目录区对第一张磁盘的偏移量
00 00:ZIP 文件注释长度

​ 这里我们可以看见有个全局方式位标记这个来标记是否加密,若你选择一个没有加密的zip,将其标记强行换为加密的话就会出现伪加密的情况,但是。。伪加密也还是未加密,现在市面上大部分的解压软件,如7z等都可以直接绕过来解压。这个标志符可以这么看:

无加密
压缩源文件数据区的全局加密应当为00 00  (504B0304两个bytes之后)
且压缩源文件目录区的全局方式位标记应当为00 00(504B0304四个bytes之后)

假加密
压缩源文件数据区的全局加密应当为00 00 
且压缩源文件目录区的全局方式位标记应当为09 00

真加密
压缩源文件数据区的全局加密应当为09 00 
且压缩源文件目录区的全局方式位标记应当为09 00 

​ 遇到这种题一般都是7z直接解压一把梭,也很难见了(虽然上周抗疫公开赛才出一道233)

CRC32碰撞

​ 这一种方式的话只能知道zip里恰加密文件很小的情况,一般为几个数字。这种方式原理是每个文件都有唯一的CRC32值,即便数据中一个bit发生变化,也会导致CRC32值不同。若是知道一段数据的长度和CRC32值,便可穷举数据,与其CRC32对照,以此达到暴力猜解的目的。

​ 这里直接贴上脚本:

from zlib import crc32
import random

char='0123456789'

def crc32_f(data):
    return hex(crc32(data)&0xffffffff)[2:10]

length=input('length:')
crc32_=raw_input('crc32:').lower()

while True:
    text=''
    for i in range(length):
        text+=char[random.randint(0,len(char)-1)]
    if crc32_f(text)==crc32_:
        raw_input('find it:'+text)
        exit

​ 以上便是CTF种所有常见的压缩包类型的解决方式了,以后还会更新其他misc类型的解析~