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、爆破/字典/掩碼攻擊
把這三種歸位一類是因爲這三種方法在本質上都是逐個嘗試,只不過待選密碼的集合不同
-
爆破:顧名思義,逐個嘗試選定集合中可以組成的所有密碼,知道遇到正確密碼
-
字典:字典攻擊的效率比爆破稍高,因爲字典中存儲了常用的密碼,因此就避免了爆破時把時間浪費在臉滾鍵盤類的密碼上
-
掩碼攻擊:如果已知密碼的某幾位,如已知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!!!