1.前言:

参加某国赛去划水,遇到了好多大佬,还遇到了自己收藏夹里面的大佬本人,哇激动的赶紧要了个好友位,要不是比赛时间太赶,说不定我就能在那跟大佬面基聊聊天。本次比赛发现大佬就是大佬强,在前三小时的解题赛的时候开局半小时,我选择题都没写完,大佬连CTF题都解出来了。TQL,然后回去之后自己复现下CTF题,发现大佬太强了。完全是自己用01拼出来的压缩包。接下从零开始手撕压缩包。

2.正文:

题目名称:MISC600

题目描述:宇宙的一切的答案就是32

题目附件:链接: https://pan.baidu.com/s/1mJ2ozhGFi_eydAzhMtLCxg 提取码: we4a

打开rar文件里面有个32.jpg,日常BINWALK 发现一个32.txt内容如下

GUYDIQRQGMYDIMCBGAYDAOJQGAYDAMBQGQ7DIOJQIE7DON7FHBBEENKGGQYTEMBQGAYDAMBQGYYDAMBQGAYDANJQGAYDAMBQGY6DERJXGQ6TQNZUGE6TCNRVGE5EIQZXGJCTIOKEIZBDQRCCGMYTMMZRII7UIQKFIM7DERRZGA7TANCCGA6TAOBXIU5EEQRVIY7DCMRQGAYDAMBQGA6DAMBQGAYDANJQGRBDAMZQGQYECMBQGA5TAMBQGAYDANJTGQ5TAQJUG4BTQNZUIFAUCNJRGIYDAMBQGAYDANRQGAYDAMBQGA7TAMBQGAYDANSDGJCTONBXHA6TIMJXGE6DKMJYIRBTOMSFGQ5UIRSCHBCEEMRWGFBECQJSGRBTMQJWINBDGQRVGA7EEMBXGA5EGOBXGRAUCQJVGEZDAMBQGAYDAMBWGAYDAMBQGA7TANCCGAZTANBQIEYDAMBZGAYDAMBQGAZTINRSGBATINZUGVCDMMBQIMYTCMRQGAYDAMBQGA6DAMBQGAYDAMBVGAYDAMBQGA6DCMSFG57DOOBXGQYTOMJWGUYTQRCDG5ZEKNBZIRDEEOCEII7DCNCBGAZTEQJSGU6UERJSIY5TKMBUIIYDOMBYGQ7UINRQGBBTCMJSGAYDAMBQGAYDMMBQGAYDAMBVGA7EEMBTGA7DAQJQGAYDSMBQGAYDAMBXIQ7DSMCBGQ6TMNBSINBECRKFGEZDAMBQGAYDAMBWGAYDAMBQGAYDKMBQGAYDAMBWG5ZEKNZUG55DONBRG5YTMNJRHBCEGNZSIU7DSRCGII5EIQRQHAYECMBWGZDEMMBSIZDEKQZVGUYDIQRQG5YDQNRUGJBUEQKFIUYTEMBQGAYDAMBQGYYDAMBQGAYDKMBUIIYDCMBSGE7DAMBQIEYDAMBZGAYDAMBQGA7DINBZGBATINZXIU5EEQRVIY7DCMRQGAYDAMBQGA6DAMBQGAYDAMBVGAYDAMBQGAYDAMBQGAYDAMBQGEYDAMRQGAYDAMBQGAYDAMBQGAYDAMBWGYZEKNZUG55DONBVGA7EEMBRGAZDCNBQGAYECMBQGA5TAMBQGAYDANJTGQ5TAQJUG4BTQNZUIFAUCNJRGIYDAMBQGAYDANRQGAYDAMBQGA7TAMBQGAYDAMBQGAYDAMBQGAYDCMBQGIYDAMBQGAYDANBVGAYDAMBQGA6EGMSFG57DOOBXGQ7TANCCGAYTAMRRGQYDAMCBGAYDAOJQGAYDAMBQGM7DMMRQIE7DONBVIQ6DAMCDGEYTEMBQGAYDAMBQGYYDAMBQGAYDANJQGAYDAMBQGAYDAMBQGAYDAMBRGAYDEMBQGAYDAMBQHBATAMBQGAYDANRRGJCTONBXHA6TINJQGRBDAMJQGIYTIMBQGBATAMBQHEYDAMBQGAYDORBUHEYECNBXGY7DEQ7CIFCUKMJSGAYDAMBQGAYDMMBQGAYDAMBQGUYDAMBQGAYDAMBQGAYDAMBQGAYTAMBSGAYDAMBQGAYEGRRQGAYDAMBQGY6TERJXGQ6TQNZUGUYDIQRQGUYDMMBQGAYDAMBQGAYDIMBQGA7DAMCDIMYDAMBQGAYDCNBQGEYDAMBQGAYDAMA=

仔细看字符串范围1.全是大写,然后没有8,9,确定编码BASE32PYTHON BASE32解密看到字符串如下

504B03040A00090000004>490A>77\xe58B

B5F41200000006000000050000006<2E

74=8741=1651:DC72E49DFB8DB31631B

?DAEC>2F90?04B0=087E:BB5F>120000

000<000000504B03040A000;00000053

4;0A47\x03874AAA512000000060000000?

0000006C2E7478=4171<518DC72E4;DF

B8DB261BAA24C6A6CB3B50>B070:C874

AAA51200000006000000?04B03040A00

0900000034620A4745D600C112000000

0<00000005000000<12E7~7874171651

8DC7rE49DFB8DB>14A032A25=BE2F;50

4B07084?D600C1120000000600000050

\>B030>0A00090000007D>90A4=642CBA

EE12000000060000000500000067rE74

7z7417q6518DC72E>9DFB:DB080A066F

F02FFEC5504B07p8642CBAEE12000000

06000000504B01021>000A0009000000

\>4490A477E:BB5F>120000000<000000

05000000000000000100200000000000

0000662E747z7450>B010214000A000;

000000534;0A47\x03874AAA51200000006

0000000?000000000000000100200000

0045000000<C2E7~7874?04B01021400

0A00090000003>620A>745D<00C11200

00000600000005000000000000000100

200000008A000000612E7478=4504B01

0214000A00090000007D490A476>2C\xe2A

EE120000000600000005000000000000

00010020000000CF0000006=2E74=874

504B05060000000004000>00CC000000

看到504b0304相信大家都看出来是压缩包了吧,仔细看发现里面一堆混淆字符串emem比赛的时候我就是做到这里的,然后就回家补习知识了。

3.预备知识:

首先zip压缩包是由多个文件实体(File Entry)和多个目录源数据(Central Directory)以及一个目录结束标识(End of central directory record)组成。举个栗子:我们新建个flag.txt文件内容为xiaomeiqiu007,然后压缩成flag.zip。用winhex打开下,我稍微标记一下。

红色部分为:文件实体(File Entry)

主要是记录文件压缩后的主要内容通常以504b0304标识开头,每一被压缩的文件对应一个文件实体。例如本次压缩的flag.txt对应第一个文件实体(红色的部分)。文件实体中存储着当前被压缩文件的名字,文件修改时间,压缩方式,是否加密等信息。从旁边解码中我们也能看到,文件的名字flag.txt,以及文件的内容xiaomeiqiu007

蓝色部分为:目录源数据(Central Directory)

主要记录文件目录相关信息,如文件注释,大小,文件名等等…。由文件头(File Header)组成,通常是以504b0102标识开头

灰色部分:目录源数据结束标识(End of central directory record)

主要记录压缩包开始分卷号开始的偏移量,主要决定文件的目录结构,以及压缩包的相关信息,以504b0607开头(只有一个)

并且他们是有对应的关系的,压缩包中的一个文件实体对应一个文件头。目录源数据(Central Directory)是由多个文件头(File header)组成,在。其中的关系基本如下。

4.压缩包各部分详细介绍。

1.文件实体(File Entry)

文件实体通常又包括两部分:文件实体头(File Entry Header),数据描述(Data descriptor)两部分组成

1.1文件实体头(File Entry Header)

文件实体头部通常包含着文件的主要信息,包括文件的名称,文件的大小,文件的内容,文件的校验值,或者其他的等等。以504b0304开始 对应的编码如下。注意:图中所有关于十六进制都是从高位到低位写的,winhex中正好相反,所以图中0x04034b50,在winhex中显示为50 4b 03 04

拿个压缩包尝试看下,新建文件"1",然后在里面写进内容dasdasdasdasdadas然后添加到压缩文件。用WINHEX打开得到如图,我们从分析文件实体部分开始(504b0304)一直分析到目录源数据(504b0102)。

504b0304文件实体的固定值,0a00解压缩版本,0000标志(通常伪加密是在这),0000压缩方式,1096文件的最后修改时间,594d文件的最后修改日期。84e45592文件的CRC 32值 14000000压缩后的打小,14000000压缩前的大小,0100文件名称的长度(实际压缩读写的时候是按照0001来读取的),所以长度就是1,拓展长度为0000,文件名称为31(ascii对应为1)6461736461736461736461736461736461646173为拓展字段也就是压缩过的数据,这里因为我压缩的是纯文本而且并没有加密,我们直接看到其中的内容为可以直接显示dasdasdasdasddadas

1.2数据描述符(Data descriptor)

用于表示文件压缩结束,只有在文件实体中通用标记字段的第3bit位为1时才会出现。一般zip上没有这个数据描述符,对应的编码格式如下。

2.目录源数据

目录源数据通常由多个文件头(File Header)组成。主要记录被压缩文件的目录结构,以及被压缩文件的属性,包括文件长度,压缩之后的长度,文件注释等。一个文件实体与一个文件头相对应。

2.1 文件头(File Header):

通常以504b0102标识开头。对应的编码如下

还是拿刚才那个压缩包我们接着分析他的目录源数据从504b0102开始。504b0102目录源数据的固定值,3F00压缩版本,0A00解压缩版本,0000标志,0000压缩方式,1096文件的最后修改时间,594d文件的最后修改时期,84e45592文件的CRC32校验值,14000000文件压缩后的大小,14000000文件的压缩前的大小,0100文件的名称长度,拓展字段长度2400等等就不再一一写了,一直到504b0506

3.目录结束标识

在目录源数据结束后,用于标记目录数据的结束,每个压缩文件有且只有一个。对应的编码格式如下

​ 到这里压缩包的知识我们就看的看不多了,我们做个小小的总结发现压缩包的编码其实部分是一一对应的,比如我们添加标注的这些信息(标红)的这些信息,在文件实体中和在目录源数据中他们是一一对应的。我们可以通过其中之一推出另外一个。这样我们就可以根据这些对应关系将混淆的这些编码去掉。思路出来了我们回头做CTF题目。

5.题目解析

首先我们先找出所有的文件实体,搜索504b0304然后整理换行起码看着舒服,因为504b0304也可能被混淆接着我尝试搜4b0304果然找到了。为了确认是不是文件实体,我们核对下后面的压缩方式等信息,之后确认将?替换成5

修复之后发现三个文件实体504b0304,那对应的最少应该有三个目录源数据,然后搜索找找有没有跟504b0102很像的组合。找到了50>b0102140000a000;如下图。发现跟目录源数据504b0102的头很像,仔细核对后面的信息确认猜测,>替换成4,同时将;替换成9

替换之后我们重新整理下文件将文件实体,目录源数据分别整理出来,得到如下效果图

现在整体一看整个压缩包大致有个样子,四个文件实体,四个目录源数据,一个目录结束标识。仔细看下每个文件实体都有对应的文件描述504b0708,根据文件描述的文件头编码表,我们将相应的混淆替换掉。将=替换为7,将替换为8,将p替换成0

替换完成后仔细观察下好像文件标识没办法再替换了,那我们接着往下推利用crc校验值,文件名等来推,根据第一个文件实体对应的文件描述,我们可以根据CRC32校验值来将一些字符替换掉。如下图。将\xe58替换为E8

同理第二个文件实体对应的文件描述的CRC32位校验值也应该是一样的,我们将第二个实体对应的字符串替换掉,如下图。将0x038 替换成C8

同理第四个文件实体的CRC32校验值与文件描述,以及第四个目录源数据对应CRC32位校验值也应该是一样,将文件目录源数据50b0102混淆字符串替换掉,如下图。将\xe2A替换为 BA

根据同样的原理利用第三个目录源数据的CRC32位校验值混淆字符串替换掉。如下图。将<替换成6。

我们接着从第一个文件实体往后看,发现第一,二个文件实体混淆字符串已经被替换没了。那我我们就看看文件叫什么名字吧,先看看文件名称长度,对照着顶部文件实体表,发现文件名称长度为0005。文件的名称为662e747874,转码一下发现f.txt,相信嗅觉灵敏的小伙伴肯定觉得不一般,猜想会不会压缩包里面是f.txt,l.txt,a.txt,g.txt。大致一看确实存在这种可能,因为确实有四个文件实体。用同样的方法查看第二个文件名称,确实6C2E747874就是l.txt,基本可以确定后面两个文件的文件名称,然后将四个文件名称在文件实体504b0304,文件描述504b0708,目录源数据504b0102对应位置替换,如下图。把~替换为4,将r替换为2,将z替换成8,最后根据拓展长度将q替换成1

到这里我们把所有的混淆替换掉了。这里贴出来最后去过混淆的字符串。

504B03040A000900000044490A477E8BB5F4120000000600000005000000662E7478741716518DC72E49DFB8DB31631B5DAEC42F90504B07087E8BB5F41200000006000000504B03040A000900000053490A47C874AAA51200000006000000050000006C2E7478741716518DC72E49DFB8DB261BAA24C6A6CB3B504B0708C874AAA51200000006000000504B03040A000900000034620A4745D600C1120000000600000005000000612E7478741716518DC72E49DFB8DB414A032A257BE2F9504B070845D600C11200000006000000504B03040A00090000007D490A47642CBAEE120000000600000005000000672E7478741716518DC72E49DFB8DB080A066FF02FFEC5504B0708642CBAEE1200000006000000504B010214000A000900000044490A477E8BB5F41200000006000000050000000000000001002000000000000000662E747874504B010214000A000900000053490A47C874AAA512000000060000000500000000000000010020000000450000006C2E747874504B010214000A000900000034620A4745D600C1120000000600000005000000000000000100200000008A000000612E747874504B010214000A00090000007D490A47642CBAEE12000000060000000500000000000000010020000000CF000000672E747874504B05060000000004000400CC000000

思路也有了修复出来压缩包。打开f.txt,l.txt,a.txt,g.txt。但是相信细心的小伙伴在复原的时候都会发现,每个文件实体对应的标志都是0900,这就意味着压缩包是加密的。我们试试,在WINHEX打开一个新文件,然后刚才还原的字符串粘贴为HEX。保存为233.zip。用360打开发现,确实存在密码,四个文件。如下图所示

想着暴力破解,无果,大佬给了个提示crc32,瞬间觉得自己嗅觉太差。因为题目都写着宇宙的一切答案32。然后用WINRAR打开想直接找CRC32校验值,为毛只有一个文件…。难道我修复错了。

仔细想想不可能。360都能解压,那问题可能是出在目录结束标识那504b0607,因为他记录着目录的偏移量,只有找到目录源数据504b0102的偏移量,WINRAR才能读出来整个文件的目录结构。找到504b0506,对照表,找到文件偏移量对应位置,发现刚好没有…23333。那我们就给他补充一个,首先找到第一个目录源数据504b0102算算前面一共552个16进制,那也就是227字节,转化为16进制114,那就应该填充的字符为14010000,最后补上。重新保存下。打开就没问题。然后就crc32碰撞出里面的内容。这里要说下,GITHUBCRC32.py是不包括特殊字符的,(刚开始我怎么弄,就是找不出来可疑字符的原因)。我们需要手动补充下特殊字符,编辑crc32.py,然后添加你认为可能出现的字符串。如图

碰撞出来的结果为:cr4ck_ crc32_ _is_s0_ e4sy_

答案是将这四个字符拼接。小菜初次发文,有问题请大佬轻喷。

源链接

Hacking more

...