ctf做題總結一
上個周做了一道MISC題和兩道Crypto題。感覺還是總結一下比較好,畢竟做題時查了很多大佬的博客和一些知識點。
1、Crypto-哈夫曼樹和哈夫曼編碼
剛看到這道題時我毫無頭緒。畢竟在寫這篇博客時,還沒有學過數據結構。而哈夫曼樹是數據結構裏的一個重要部分。於是我便在百度上搜索有關哈夫曼樹和哈夫曼編碼的知識。。。。。。。。
哈夫曼樹
哈夫曼最大的目的是爲了解決當你遠距離通信(電報)的數據傳輸的最優化問題
路徑:樹中一個結點到另一個結點之間的分支序列構成兩個結點間的路徑
路徑長度:路徑上的分支數目
樹的路徑長度:樹根到每個結點的路徑長度的和
結點帶權路徑長度:結點到樹根的路徑長度與結點的權的乘積
樹的帶權路徑長度:樹中所以葉子結點的帶權路徑長度之和(WPL)
哈夫曼編碼
學習完這些知識點後,我對哈夫曼樹和哈夫曼編碼有了大致的瞭解,就是找最優二叉樹,然後哈夫曼編碼就是根據每個字母的出現頻率不同,按照它們的權值進行構造哈夫曼樹。將所有權值左分支改爲0,右分支改爲1,得到相應字符的的傳輸數據。
然後,下載解壓下載的題目文件,發現一個txt文件,打開後
果然,是哈夫曼編碼,由於我現在的編程能力,寫不出有關的編碼腳本。所以我畫了一個哈夫曼樹
根據txt文件,我猜想前五位編碼應該是flag{,最後一位是**},然後根據這六位編碼,調整最底下的g、l、{、}**的位置。然後得到每個字符的分配權值:
a:000
d:10(或01)
g:00101
f:110
l:00111
0:111
5:01(或10)
{:00100
}:00110
然後把txt文件裏的0和1按照上述權值進行分隔
然後比對每個字符的權值,對分隔好的0和1,進行編碼,最終得到兩個結果
然後最終答案就是其中的一個啦!!!!
2、Crypto-滴答滴答
這道題題目沒有給任何提示,下載文件,發現並不能打開和用winrar解壓文件。於是我便選擇用notepad++打開
很顯然這是摩斯電碼,進行解碼得到
發現第一個斜槓前有一串特別的字母MORSEISCOOLBUTBACONISCOOLER彷彿看不太懂,寫成小寫字母morseiscoolbutbaconiscooler很明顯,這句話的意思是“摩斯是酷的,但是培根是更酷的”,那麼接下來就應該進行培根解密,直接解密,發現不行。查了查培根加密的格式發現,並沒有斜槓**“/”**,於是我用notepad++的替換功能把所有的斜槓去掉,然後培根解密得到
"DO YOU KNOW THE FOUR FENCE ZGIAHYANAUOZNXWI"用百度翻譯的意思是“你知道四道柵欄嗎?”,可以想到接下來是柵欄密碼解密,且每組字數爲4。我把所有字符進行解密,發現並沒有解出有意義的字符。所以我把“ZGIAHYANAUOZNXWI”進行柵欄解密,最後得到
很顯然最終結果出來了,下面進行提交,發現錯誤。這就應該是格式的問題了,調過之後成功提交了。。
3、MISC-TTL字段
從題目中,我們可以知道這道題是TTL字段。然而對此我有點懵,從來沒有接觸過它。於是我便查有關資料和一些大佬的博客
下載解壓題目文件,發現ttl.txt文件,打開發現ttl.txt中的ttl只有4個值63,127,191,255
寫出他們的二進制表示後發現只有最高兩位不同,63-00111111、127-01111111、191-10111111、255-11111111。於是把4個值替換成00、01、10、11如果傳輸4個就是一字節,取前面的2位組成8位,對照二進制字母表,可以發現前面是ffd8,jpg圖片標誌
因爲這個腳本我寫不出來,於是用了大佬的腳本
fp = open('ttl.txt','r')
a = fp.readlines()
p = []
for i in a:
p.append(int(i[4:]))
s = ''
for i in p:
if i == 63:
a = '00'
elif i == 127:
a = '01'
elif i == 191:
a = '10'
elif i == 255:
a = '11'
s += a
# print(s)
import binascii
flag = ''
for i in range(0,len(s),8):
flag += chr(int(s[i:i+8],2))
flag = binascii.unhexlify(flag)
wp = open('res.jpg','wb')
wp.write(flag)
wp.close()
#00111111 63
#01111111 127
#10111111 191
#11111111 255
然後把ttl.txt和這個腳本(腳本文件名我寫成了1.py)放在同一路徑,在cmd命令行輸入命令python 1.py
生成了一個fi.txt文件,打開
這是16進制編碼,所以把這些編碼粘貼在winhex裏生成一個jpg文件,打開
發現只有二維碼的一部分,在最後轉換出的結果中,發現了六個jpg的文件頭(ffd8),說明這就是六張圖片,用foremost直接分開(或用strgsolve分離圖片)就好了,之後用ps(或ppt)拼在一塊
掃描結果如下所示:
應該就是AutoKey(自動密鑰密碼)那個加密,找了個在線網站解密得到
得到最終flag了!!!!!
這便是我上週做題的總結,小白進階ing,歡迎大佬批評指正!