1. 程式人生 > 其它 >MRCTF2020 pyFlag

MRCTF2020 pyFlag

拿到壓縮包的時候7zip預覽,一下子就發現Setsuna.jpg中有壓縮包,直接丟進winhex檢視

可以看到在zip檔案頭和jpg檔案尾中有提示這是祕密檔案的part1,那麼思路就打開了,將其他圖片的祕密檔案部分拼成一個檔案即可。

全部合起來組成一個zip檔案,不是偽加密,先爆破密碼

得到密碼為1234,給出兩個檔案

hint中給出了提示

我用各種baseXX編碼把flag套娃加密了,你應該也有看出來。
但我只用了一些常用的base編碼哦,畢竟我的智力水平你也知道...像什麼base36base58聽都沒聽過
提示:0x10,0x20,0x30,0x55

 

注意四個16進位制數,前兩個非常明顯分別是16和32,後兩個是48和85,明顯是提醒我們密文只採用了base16,base32,base48和base85這四種方式編碼

但是我印象中並沒有base48這種編碼方式。。是不是誤導項?我還是把這個當做base64來做

給出的密文非常雜亂,有明顯的巢狀

G&eOhGcq(ZG(t2*H8M3dG&wXiGcq(ZG&wXyG(j~tG&eOdGcq+aG(t5oG(j~qG&eIeGcq+aG)6Q<G(j~rG&eOdH9<5qG&eLvG(j~sG&nRdH9<8rG%++qG%__eG&eIeGc+|cG(t5oG(j~sG&eOlH9<8rH8C_qH9<8oG&eOhGc+_bG&eLvH9<8sG&eLgGcz?cG&3|sH8M3cG&eOtG%_?aG(t5oG(j~tG&wXxGcq+aH8V6sH9<8rG&eOhH9<5qG(<E-H8M3eG&wXiGcq(ZG)6Q<G(j~tG&eOtG%+<aG&wagG%__cG&eIeGcq+aG&M9uH8V6cG&eOlH9<8rG(<HrG(j~qG&eLcH9<8sG&wUwGek2)

我們需要根據種base編碼的特徵來提取資訊並解碼

base16:構成為字母A-F數字0-9;匹配正則"^[0-9A-F]+$"
base32:構成為字母A-Z數字2-9符號=;匹配正則"^[A-Z2-7=]+$"
base64:構成為字母A-Z,a-z,數字0-9符號+/=;匹配正則"^[A-Za-z0-9+/=]+$"
base85:比較複雜;直接作為判斷條件的else
import re
import base64
base = "G&eOhGcq(ZG(t2*H8M3dG&wXiGcq(ZG&wXyG(j~tG&eOdGcq+aG(t5oG(j~qG&eIeGcq+aG)6Q<G(j~rG&eOdH9<5qG&eLvG(j~sG&nRdH9<8rG%++qG%__eG&eIeGc+|cG(t5oG(j~sG&eOlH9<8rH8C_qH9<8oG&eOhGc+_bG&eLvH9<8sG&eLgGcz?cG&3|sH8M3cG&eOtG%_?aG(t5oG(j~tG&wXxGcq+aH8V6sH9<8rG&eOhH9<5qG(<E-H8M3eG&wXiGcq(ZG)6Q<G(j~tG&eOtG%+<aG&wagG%__cG&eIeGcq+aG&M9uH8V6cG&eOlH9<8rG(<HrG(j~qG&eLcH9<8sG&wUwGek2)
" pattern1 = "^[0-9A-F]+$" pattern2 = "^[A-Z2-7=]+$" pattern3 = "^[A-Za-z0-9+/=]+$" def basedecode(content: str,type: int): if type == 1: return base64.b16decode(content) elif type == 2: return base64.b32decode(content) elif type == 3: return base64.b64decode(content) elif type == 4: return base64.b85decode(content) else: print("no") def get_type(content: str): try: if re.match(pattern1,content.decode()) is not None: return 1 except: print("not16") try: if re.match(pattern2,content.decode()) is not None: return 2 except: print("not32") try: if re.match(pattern3,content.decode()) is not None: return 3 except: print("not64") return 4 content = base while(True): type = get_type(content) content = basedecode(content,type) print(content)

不管最後出結果時的異常,發現了flagMRCTF{Y0u_Are_4_p3rFect_dec0der}

看來把那個0x30當做base64來解是正確的