CTF之Misc-zip压缩包分析
本文为看雪论坛优秀文章
看雪论坛作者ID:wx_酸菜鱼
zip文件格式
1、压缩源文件数据区
[文件头+ 文件数据 + 数据描述符]
文件头结构、、、、、组成 长度文件头标记 4 bytes (0x04034b50)解压文件所需 pkware 版本 2 bytes全局方式位标记 2 bytes压缩方式 2 bytes最后修改文件时间 2 bytes最后修改文件日期 2 bytesCRC-32校验 4 bytes压缩后尺寸 4 bytes未压缩尺寸 4 bytes文件名长度 2 bytes扩展记录长度 2 bytes文件名 (不定长度)扩展字段 (不定长度)文件数据、、、、、数据描述符、、、、、CRC-32校验 4 bytes压缩后尺寸 4 bytes未压缩尺寸 4 bytes
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密) 头文件标记后2bytes
08 00:压缩方式
2、压缩源文件目录区
组成 长度目录中文件文件头标记 4 bytes (0x02014b50)压缩使用的 pkware 版本 2 bytes解压文件所需 pkware 版本 2 bytes全局方式位标记 2 bytes压缩方式 2 bytes最后修改文件时间 2 bytes最后修改文件日期 2 bytesCRC-32校验 4 bytes压缩后尺寸 4 bytes未压缩尺寸 4 bytes文件名长度 2 bytes扩展字段长度 2 bytes文件注释长度 2 bytes磁盘开始号 2 bytes内部文件属性 2 bytes外部文件属性 4 bytes局部头部偏移量 4 bytes文件名 (不定长度)扩展字段 (不定长度)文件注释 (不定长度)
3F 00:压缩使用的 pkware 版本
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密,伪加密的关键) 目录文件标记后4bytes
08 00:压缩方式
3、压缩源文件目录结束标志
组成 长度目录结束标记 4 bytes (0x02014b50)当前磁盘编号 2 bytes目录区开始磁盘编号 2 bytes本磁盘上纪录总数 2 bytes目录区中纪录总数 2 bytes目录区尺寸大小 4 bytes目录区对第一张磁盘的偏移量 4 bytesZIP 文件注释长度 2 bytesZIP 文件注释 (不定长度)
50 4B 05 06:目录结束标记
00 00:目录区开始磁盘编号
暴力破解就是爆破压缩包的密码。
fcrackzip -b -l 6-6 -c 1 -p 000000 passwd.zip-b 暴力破解-c 1 限制密码是数字-l 6-6 限制密码长度为6-p 000000 初始化破解起点
这里是504B01021400000008,将1400XX0008改成单数就形成了伪加密。将这里改成0009再来看一下再改回去就破解了伪加密。
伪加密,处理后解压出leve5
大致原理,一个需要解密的ZIP而且不知道密码,但幸运的是有ZIP包里一个已知文件,将已知文件进行ZIP加密后和待解密的ZIP里已知文件进行hex对比,两者的区别就是ZIP加密的三个key。
需要查看压缩算法是否一致,CRC校验值是否相同。
CRC32碰撞用于非常小的文件(6字节以上基本就别试了),就是通过CRC来反推文件内容。
而且CRC32是很容易碰撞的,所以就6字节而言,同一个CRC32可能对应着十几个字符串(纯可视字符)。
level6的压缩包,发现内部有三个长度为454的txt文件,想到crc爆破。
import stringimport binasciidic = string.ascii_letters+"_"+'0123456789'crc2=0xEED7E184crc1=0x9AEACC13crc3=0x289585AFdef aa(crc):for i in dic:for j in dic:for k in dic:for p in dic:for q in dic:st = i+j+k+p+qif crc == (binascii.crc32(str(st)) & 0xffffffff):print streturndef bb(crc):for i in dic:for j in dic:for k in dic:for p in dic:st = i+j+k+pif crc == (binascii.crc32(str(st)) & 0xffffffff):print streturnaa(crc1)bb(crc2)aa(crc3)
在注册页面看到三张图
import binasciiimport stringimport zipfileimport base64import syscrc = int(0xcb0d2242)i = 0aaa="0123456789"for a in aaa:for b in aaa:for c in aaa:for d in aaa:strings = "亲爱的员工888888,您自助申请的PT邀请服务已受理完成,邀请链接在附件压缩包中,欢迎下次使用。\n\n"+"申请编号:20201025"+a + b + c+ d +"\n"+"ByteCTF Secret PT Server"strings = strings.encode('utf-8')print(binascii.crc32(strings))if crc == ((binascii.crc32(strings))&0xFFFFFFFF):print(strings)sys.exit(1)else:print(i)i = i+1
得到http://182.92.4.49:30080/signup.php?type=invite&invitenumber=8128e1f98353335c9b935fec58f0be46
看雪ID:wx_酸菜鱼
https://bbs.pediy.com/user-home-865065.htm
看雪2022KCTF秋季赛官网:https://ctf.pediy.com/game-team_list-18-29.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!