MISC-zip壓縮包的總結


MISC-zip壓縮包的總結

做了那麼多的MISC壓縮包的CTF題,是時候總結一下經驗了。手撕壓縮包走起!

1、僞加密

zip中有一位是標記文件是否加密的,如果更改一個未加密zip包的加密標記位,那麼在打開壓縮包時就會提示該文件是加密的。

重點部分

把504B0304後的第3、4個byte改成0000還有
把504B0102後的第5、6個byte改成0000即可破解僞加密。

識別真假加密

無加密
壓縮源文件數據區的全局加密應當爲00 00
且壓縮源文件目錄區的全局方式位標記應當爲00 00
假加密
壓縮源文件數據區的全局加密應當爲00 00
且壓縮源文件目錄區的全局方式位標記應當爲09 00
真加密
壓縮源文件數據區的全局加密應當爲09 00

例:

題目下載

根據題目,這可能是一道僞加密題。把壓縮包文件用winrar打開,看出來b.png進行了僞加密

把Blog的zip壓縮包放進winhex,在最上面沒發現僞加密標誌位,所以我在最下面發現

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

2、明文攻擊

明文攻擊是一種較爲高效的攻擊手段,大致原理是當不知道一個zip的密碼,但是有zip中的一個已知文件(文件大小要大於12Byte)時,因爲同一個zip壓縮包裏的所有文件都是使用同一個加密密鑰來加密的,所以可以用已知文件來找加密密鑰,利用密鑰來解鎖其他加密文件。

推薦一個工具:APCHPR (可進行爆破/明文/字典/掩碼攻擊)

例:

題目下載

根據題目看出來這道題可能是明文攻擊,下載之後得到zip壓縮包,用winrar打開

在zip文件裏有個未加密的 提示.txt文件,在blingbling.zip有個加密的 提示.txt文件。所以這應該是明文攻擊。把未加密的 提示.txt文件壓縮成zip壓縮包 當作明文。對blingbling.zip進行明文攻擊,如下:

得到**空白文檔???**的口令密碼:

打開空白文檔???,發現真的是空白的,想吐血。不過查了查百度發現,打開word文件,選擇“選項”,然後選擇“顯示”

隱藏文字打印隱藏文件前打對勾,然後確定,然後打開空白文檔???,就能看到flag了!!

3、crc32碰撞

CRC32:CRC本身是“冗餘校驗碼”的意思,CRC32則表示會產生一個32bit(8位十六進制數)的校驗值。****

在產生CRC32時,源數據塊的每一位都參與了運算,因此即使數據塊中只有一位發生改變也會得到不同的CRC32值,利用這個原理我們可以直接爆破出加密文件的內容

例:

題目下載

根據題目可知,這道題可能是crc32碰撞。下載該壓縮包,用winrar打開

會發現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密文

密文記得加上0x變成16進制,三個txt文件碰撞結果如下

1.txt

2.txt

3.txt

在碰撞的內容中,找有意義的字符。1.txt中"you_ar" 2.txt中“e_the_" 3.txt中未發現有意義的字符。做到這一步,再次想吐血。還好我用notepad++打開碰撞腳本,發現一組特殊之處

想着是不是因爲腳本里缺少特殊字符,而3.txt裏有特殊字符。所以碰撞不出3.txt的內容。加上特殊字符後,碰撞結果如下

找到3.txt中的有意義的字符了,好開心!!!3.txt中的有意義字符“best!!”,結合1.txt的“you_ar" 2.txt的”e_the_“得到flag.txt的密碼:“you_are_the_best!!”,輸入密碼打開後發現

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

看起來解密結果符合url編碼,所以url解碼,得到最終flag如下:

4、爆破/字典/掩碼攻擊

把這三種歸位一類是因爲這三種方法在本質上都是逐個嘗試,只不過待選密碼的集合不同

  1. 爆破:顧名思義,逐個嘗試選定集合中可以組成的所有密碼,知道遇到正確密碼

  2. 字典:字典攻擊的效率比爆破稍高,因爲字典中存儲了常用的密碼,因此就避免了爆破時把時間浪費在臉滾鍵盤類的密碼上

  3. 掩碼攻擊:如果已知密碼的某幾位,如已知6位密碼的第3位是a,那麼可以構造 ??a??? 進行掩碼攻擊,掩碼攻擊的原理相當於構造了第3位爲a的字典,因此掩碼攻擊的效率也比爆破高出不少

例:

題目下載

用winrar打開發現一個加密文件

所以應該要暴力破解,把下載的壓縮包放進ARCHPR(爆破工具)裏,選擇字典攻擊(字典攻擊比暴力攻擊用時少),

得出文件密碼口令

輸入密碼,解壓文件,得到一個文件夾。然後文件夾裏有好幾個文件夾,所以開啓找可疑之處的歷程

最終,我發現有個地方比較可疑

看着比較像Base16加密,所以進行Base16解密,得到flag

5、雜類

例1:

題目下載

很明顯,這個題並沒有給出有效提示(只給了提交格式)。下載後,用winrar打開發現一個zip.txt文件,打開後

根據504B0304可以看出這應該是一個壓縮包的16進制編碼,然後查詢一下壓縮包16進制編碼格式,把不符合16進制編碼的改成對應的16進制編碼。改完後,把16進制編碼粘貼在winhex裏進行對壓縮包的恢復

注意選擇16進制粘貼格式

然後保存,用winrar打開恢復後的壓縮包,結果發現一個flag.txt文件竟然是加密的,再次想吐血!

也沒給什麼提示,想着是不是僞加密,所以我用winhex打開恢復後的壓縮包,發現果然是僞加密

把01改成00後保存,再次用winrar打開,發現flag.txt變成了未加密,開心!找到flag了!!

例2:

題目下載

這個題給了提示,一個公式f(x)=(x-n)%26+97,看着有點像凱撒公式。下載後,用winrar打開壓縮包,進入“皮”文件夾發現兩個txt文件

[外鏈圖片轉存失敗(img-BfScdxNr-1563265524323)(http://i1.fuimg.com/690374/5a1c93aa0a869757.png)]

打開兩個txt文件

key.txt應該就是凱撒加密的密文了,而提示.txt可能是密鑰。然後,我開始理解題目提示的凱撒公式f(x)=(x-n)%26+97,我理解這是個加密公式,f(x)是密鑰,x是明文,n是密文。然後我寫出對應的解密公式str=((c1-97)+(key-97))%26+97,***str是明文,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;
}

輸入第一個密鑰,運行結果如下

然後想到明文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;

然後明文1第五個字母應該是t,密文1第五個字母是m。第五個密鑰應該是f(x)=(t-m)%26+97=g+1=h;

注意:

明文-密文=正值,從前往後數,密鑰=正值(即英文字母序號)+1;

明文-密文=負值,從後往前數,密鑰=負值的絕對值(即26-英文字母序號);

找到密鑰序號對應的字母

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

不斷找尋密鑰、明文、密文間的規則,最後得出全部密鑰和最終flag

下面也有個別人寫好得python腳本,果然寫python腳本才更簡潔、更容易。我要努力學python了!!

以上便是我做CTF壓縮包類型題的總結,總結許多收穫也許多。小白進階ing!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章