7

MISC-zip压缩包的总结

 2 years ago
source link: https://qwzf.github.io/2019/04/06/MISC-zip%E5%8E%8B%E7%BC%A9%E5%8C%85%E7%9A%84%E6%80%BB%E7%BB%93/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

做了那么多的MISC压缩包的CTF题,是时候总结一下经验了。手撕压缩包走起!

1、伪加密

zip中有一位是标记文件是否加密的,如果更改一个未加密zip包的加密标记位,那么在打开压缩包时就会提示该文件是加密的。

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvN2JiNmYwNWUyNzBiZGZiZi5wbmc
aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvZGRmYTI0ZWFmNDhhYjNlNi5wbmc

把504B0304后的第3、4个byte改成0000还有
把504B0102后的第5、6个byte改成0000即可破解伪加密。

识别真假加密

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

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvOGU2OTVmZTcxYTk4Njk5Yy5wbmc

根据题目,这可能是一道伪加密题。把压缩包文件用winrar打开,看出来b.png进行了伪加密

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvZWI3YWI4MzNjYWNhYzFlYS5wbmc

把Blog的zip压缩包放进winhex,在最上面没发现伪加密标志位,所以我在最下面发现

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvOTQzZmNjOTI1ZGI0ZDcxZC5qcGc

把b.png的504B0102后第五位09改成00,即可破解伪加密,解压即可在b.png中得到flag!!

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvYzQ4ZmQ4NjgzZThmMzU4My5wbmc

2、明文攻击

明文攻击是一种较为高效的攻击手段,大致原理是当不知道一个zip的密码,但是有zip中的一个已知文件(文件大小要大于12Byte)时,因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以用已知文件来找加密密钥,利用密钥来解锁其他加密文件。

推荐一个工具:APCHPR (可进行爆破/明文/字典/掩码攻击)

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMjA5ZjVkM2U4MDQwNjg4Mi5wbmc

根据题目看出来这道题可能是明文攻击,下载之后得到zip压缩包,用winrar打开

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvYzg0OWNjMGU5YjFiMjM2Zi5wbmc

在zip文件里有个未加密的 提示.txt文件,在blingbling.zip有个加密的 提示.txt文件。所以这应该是明文攻击。把未加密的 提示.txt文件压缩成zip压缩包 当作明文。对blingbling.zip进行明文攻击,如下:

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvNDJiMTkwNDU0ODJhNzgwOS5wbmc

得到空白文档???的口令密码:

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvZWE4YjQ5ZDhiZjA4NWE0YS5wbmc

打开空白文档???,发现真的是空白的,想吐血。不过查了查百度发现,打开word文件,选择“选项”,然后选择“显示”

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMDE1MzI1NGIxZmQ4NDNiMy5wbmc

隐藏文字打印隐藏文件前打对勾,然后确定,然后打开空白文档???,就能看到flag了!!

3、crc32碰撞

CRC32:CRC本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。****

在产生CRC32时,源数据块的每一位都参与了运算,因此即使数据块中只有一位发生改变也会得到不同的CRC32值,利用这个原理我们可以直接爆破出加密文件的内容

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvODU2ZWRjYWJhY2Q0OWIwNS5wbmc

根据题目可知,这道题可能是crc32碰撞。下载该压缩包,用winrar打开

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMDcyZGY2ZWVhNTM2MzVjZC5wbmc

会发现4个加密的txt文件,有三个大小为6的,一个存放flag大小为102的。crc32碰撞,碰撞文件的大小一般不大于6,大于6的一般碰撞不出来。且位于同一压缩包的文件,文件密码相同。所以对1.txt 2.txt 3.txt进行crc32碰撞

还有一款很好用的6位的CRC32爆破

附上神器:https://github.com/theonlypwner/crc32
具体使用方法:

python crc32.py reverse 你的crc32密文
python复制代码

密文记得加上0x变成16进制,三个txt文件碰撞结果如下

1.txt

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvM2IyN2I1ZjJhNzJkOTE2Ni5wbmc

2.txt

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMjFkZmVlNGExZGU5NGIyZC5wbmc

3.txt

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvYjk2MjNlYTc0MmQwZTY0MS5wbmc

在碰撞的内容中,找有意义的字符。1.txt中”you_ar“ 2.txt中“e_the_“ 3.txt中未发现有意义的字符。做到这一步,再次想吐血。还好我用notepad++打开碰撞脚本,发现一组特殊之处

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMzI3ZDkzYWJmYTM5MGUxOC5wbmc

想着是不是因为脚本里缺少特殊字符,而3.txt里有特殊字符。所以碰撞不出3.txt的内容。加上特殊字符后,碰撞结果如下

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvYjhhMWJjZjA4YmZmYmZlOS5wbmc

找到3.txt中的有意义的字符了,好开心!!!3.txt中的有意义字符“best!!”,结合1.txt的“you_ar“ 2.txt的”e_the_“得到flag.txt的密码:“you_are_the_best!!“,输入密码打开后发现

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvZjVjNjM3NzZhODY4MDNmNS5wbmc

很明显是Base64加密的,所以Base64解密,得到

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvZGMzOTBjODg1MTdjZjNiNS5wbmc

看起来解密结果符合url编码,所以url解码,得到最终flag如下:

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMmRkZDBiNGQxMGQyMmZkYy5wbmc

4、爆破/字典/掩码攻击

把这三种归位一类是因为这三种方法在本质上都是逐个尝试,只不过待选密码的集合不同

  1. 爆破:顾名思义,逐个尝试选定集合中可以组成的所有密码,知道遇到正确密码

  2. 字典:字典攻击的效率比爆破稍高,因为字典中存储了常用的密码,因此就避免了爆破时把时间浪费在脸滚键盘类的密码上

  3. 掩码攻击:如果已知密码的某几位,如已知6位密码的第3位是a,那么可以构造 ??a??? 进行掩码攻击,掩码攻击的原理相当于构造了第3位为a的字典,因此掩码攻击的效率也比爆破高出不少

例:

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvNmVkMDY3MjY5NTRlYTAyZC5wbmc

用winrar打开发现一个加密文件

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMTcyZTQ0YWEyZjIyYWVhMy5wbmc

所以应该要暴力破解,把下载的压缩包放进ARCHPR(爆破工具)里,选择字典攻击(字典攻击比暴力攻击用时少),

得出文件密码口令

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvOGFkMTAxMjQ2YzFmY2YwMC5wbmc

输入密码,解压文件,得到一个文件夹。然后文件夹里有好几个文件夹,所以开启找可疑之处的历程

最终,我发现有个地方比较可疑

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvNDMxYWVhN2ZjNzBmNmI5MC5wbmc

看着比较像Base16加密,所以进行Base16解密,得到flag

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvZmM1OTAwY2NjYzM5Y2U2NC5wbmc

例1:

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvOWZhMGY1MjBlOGEyNjE1Yi5wbmc

很明显,这个题并没有给出有效提示(只给了提交格式)。下载后,用winrar打开发现一个zip.txt文件,打开后

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvNzY1NGRhNThiZjQ0MjMzMC5wbmc

根据504B0304可以看出这应该是一个压缩包的16进制编码,然后查询一下压缩包16进制编码格式,把不符合16进制编码的改成对应的16进制编码。改完后,把16进制编码粘贴在winhex里进行对压缩包的恢复

注意选择16进制粘贴格式

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvYmY1NWRjYmQ4MjY5MDJhZC5wbmc
aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvNTZjY2M3ZmQyYjk4NjAxZi5wbmc

然后保存,用winrar打开恢复后的压缩包,结果发现一个flag.txt文件竟然是加密的,再次想吐血!

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMTFkODRlZDgwZGVmZmUxYi5wbmc

也没给什么提示,想着是不是伪加密,所以我用winhex打开恢复后的压缩包,发现果然是伪加密

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvOTI4NmMxNTg5Mjk0NjQwYS5wbmc

把01改成00后保存,再次用winrar打开,发现flag.txt变成了未加密,开心!找到flag了!!

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMmFkZTFkMTYxZDVjYjc5Zi5wbmc

例2:

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvOTgwNTU0MTYxYmVhZDFjYy5wbmc

这个题给了提示,一个公式f(x)=(x-n)%26+97,看着有点像凯撒公式。下载后,用winrar打开压缩包,进入“皮”文件夹发现两个txt文件

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjI1OTE3,size_16,color_FFFFFF,t_70

打开两个txt文件

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMTQ2ZDVkOGRmY2YzZmYyMy5wbmc

key.txt应该就是凯撒加密的密文了,而提示.txt可能是密钥。然后,我开始理解题目提示的凯撒公式f(x)=(x-n)%26+97,我理解这是个加密公式,f(x)是密钥,x是明文,n是密文。然后我写出对应的解密公式str=((c1-97)+(key-97))%26+97str是明文,c1是密文,key是密钥。由于写这篇blog时,我还不会写python脚本,于是我写了个c语言的

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int j;
    char key[20];
    char c1[20]="yrsimmpzrbkcokd",c2[20]="zokkhuapoloaeku",c3[20]="xloobshxdbamnqn",str1[20],str2[20],str3[20];
    for(j=1;;j++)
    {
        printf("请输入密钥:");scanf("%s",key);
        printf("密文1:%s\n密文2:%s\n密文3:%s\n",c1,c2,c3);
        //printf("密文1:%s",c1);//scanf("%s",c1);
        //printf("密文2:%s",c2);//scanf("%s",c2);
       // printf("密文3:%s",c3);//scanf("%s",c3);
        printf("明文1:");
        for(int i=0;i<strlen(key);i++)
        {
            str1[i]=(c1[i]-97+key[i]-97)%26+97;
            printf("%c",str1[i]);
        }
        printf("\n");
        printf("明文2:");
        for(int i=0;i<strlen(key);i++)
        {
            str2[i]=(c2[i]-97+key[i]-97)%26+97;
            printf("%c",str2[i]);
        }
        printf("\n");
        printf("明文3:");
        for(int i=0;i<strlen(key);i++)
        {
            str3[i]=(c3[i]-97+key[i]-97)%26+97;
            printf("%c",str3[i]);
        }
        printf("\n\n");
        printf("a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z");
        printf("\n");
        printf("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");
        printf("\n");
        printf("26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1");
        printf("\n\n");
    }
    return 0;
}
c arduino复制代码

输入第一个密钥,运行结果如下

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMGNlMzFlNjA0NTQ1YTFlZi5wbmc

然后想到明文3前四个字母应该就是f、l、a、g,而密文3前四个字母是x、l、o、o。所以第二个密钥应该是f(x)=(l-l)%26+97=a;

第三个密钥应该是f(x)=(a-o)%26+97=m;第四个密钥应该是f(x)=(g-o)%26+97=s;

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvYmY0NzNlMmNiOTEzNzNkMy5wbmc

然后明文1第五个字母应该是t,密文1第五个字母是m。第五个密钥应该是f(x)=(t-m)%26+97=g+1=h;

明文-密文=正值,从前往后数,密钥=正值(即英文字母序号)+1;

明文-密文=负值,从后往前数,密钥=负值的绝对值(即26-英文字母序号);

找到密钥序号对应的字母

明文-密文=零,密钥=a;

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvMGZkYmQ0ZTY1YzE2Y2QzZS5wbmc

不断找寻密钥、明文、密文间的规则,最后得出全部密钥和最终flag

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvZmYyYzUwNWE4MWUzOGM3NC5wbmc

下面也有个别人写好得python脚本,果然写python脚本才更简洁、更容易。我要努力学python了!!

aHR0cDovL2kxLmZ1aW1nLmNvbS82OTAzNzQvOGU2NDc3N2QzNTUyN2VhOC5wbmc

以上便是我做CTF压缩包类型题的总结,总结许多收获也许多。小白进阶ing!!!


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [email protected]

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK