你瞭解base麼?1 解題

峰圣榜發表於2024-06-20

CTF 你瞭解base麼?1 解題

題目:CTF 你瞭解base麼?1  
題目內容:在資料的深海里,我探尋Base的奧秘,
如星辰般閃爍,是資訊的集結地。
程式碼編織的網,捕捉著資料的蹤跡,
Base,你是資料的港灣,是智慧的基石。

字串的舞蹈,在Base中躍動,
二進位制、十六進位制,變幻著節奏。
你不僅僅是儲存,更是轉化的橋樑,
將繁雜的資訊,化為簡潔的符號。

img

附件及解題程式碼見文尾下載連結

解題思路及步驟

1.利用線上工具“CyberChef”進行base64解碼

解壓壓縮包晨的檔案用記事本開啟,發現有不少行的未尾有“=”,猜測這應該是base64編碼,開啟線上轉碼工具網站:https://cyberchef.org/,選擇“From Base64”,拖入Recipe區中,得到如下:

img

發現是用python編寫的加密指令碼。整理成python程式碼如下:

#!/usr/bin/env python
#  -*- coding: utf-8 -*-
import base64
import sys
#I'm so upset.
#You can't encrypt without code
#The answer can be decrypted
#I'm sure the code won't beat you
#There's a lot of crap in it
#I can't send it. It's too hard and it's not
#Look for it
#我很難過。
#沒有程式碼就無法加密
#答案可以被解密
#我相信程式碼不會打敗你
#裡面有很多垃圾
#我發不出去。這太難了,但事實並非如此
#尋找它
def str_to_hex(s): 
    str = r"/x" 
    xxx = [hex(ord(c)).replace('0x', '') for c in s]
    str += r'/x'.join(xxx)
    return str 
   #I am an encryption
   #我是一個加密
def base(s):
      return base64.b64encode(s)

   #I am an encryption
   # #Can you find the flag?
   #我是一個加密
   #你能找到那面旗幟嗎?
if __name__ == "__main__":
        flag = ""    
        flag = str_to_hex(flag)   
        flag = flag.encode("utf-8")    
        flag = base(flag)
# flag=b'L3g2Ni94NmMveDYxL3g2Ny94N2IveDM4L3gzMi94MzEveDMxL3gzMS94MzEveDYzL3gzNS94MzQveDYxL3g2Ni94MzYveDM1L3g2MS94NjQveDY0L3gzNS94MzEveDM1L3g2My94MzgveDM3L3gzMi94NjEveDY0'
#A few words in water Otherwise, it can't be encrypted
#One more sentence is needed
#by Mogic
#Is there a bracket
#幾個字在水裡,否則無法加密。還有一句是魔術需要的,有括號嗎

2.將解碼得到的flag後引號裡的編碼進行“base64解碼+HEX解碼”

提取flag後面引號裡的內容,再次用From Base64轉碼,得到如下:
img

/x66/x6c/x61/x67/x7b/x38/x32/x31/x31/x31/x31/x63/x35/x34/x61/x66/x36/x35/x61/x64/x64/x35/x31/x35/x63/x38/x37/x32/x61/x64

分析應該是16進位制碼,使用“From Hex”得到如下程式碼:
flag{821111c54af65add515c872ad

img

看到了flag,只是缺一個右花括號,添上後,提交flag,提示錯誤

於是,開始研究前面得到的python程式碼,試圖透過這個編碼指令碼修改解碼指令碼,但始終沒有找到右花括號。一直卡在這裡很長時間沒頭緒。

3.驗證並確認附件裡的base64文字有隱寫

沒辦法,只有到指令碼中的英文註釋尋找蛛絲馬跡,由於英文不好,還利用工具翻譯成了中文。發現裡面有兩句有暗示:

沒有程式碼就無法加密
幾個字在水裡,否則無法加密。還有一句是魔術需要的,有括號嗎

剛剛練習過base64的隱寫題目,掌握的解題辦法只有透過指令碼最好使。
關於base64隱寫的文章見:
base64隱寫原理[https://www.cnblogs.com/ZhouJiaHao/p/14512711.html]

驗證base64編碼裡有沒有隱寫最好的辦法,就是解碼後,再用得到的明文再編碼,核對前後兩個編碼中“=”等號前的字元是否一樣,如不一樣,說明有隱寫。只有=的編碼才有隱寫空間,於是找了一行有=的編碼:

ICAgIGZsYWcgPSBmbGFnLmVuY29kZSgidXRmLTgiKd==

解碼後得到:

    flag = flag.encode("utf-8")

img

再將解碼得到的文字編碼,得到:

ICAgIGZsYWcgPSBmbGFnLmVuY29kZSgidXRmLTgiKQ==

兩行一對比,發現=前的字元不一樣,一行是“d”,另一行是“Q”,其它的都一樣,說明有隱寫。
img

4.用python指令碼解密隱寫內容

既然有隱寫,那就有戲了。
急忙找來前一篇博文(網址:https://www.cnblogs.com/bcd589/p/18241224) 寫的python指令碼,把附件att中文字複製裝進“flag_encode.txt”檔案,執行指令碼,得到如下結果:

73fe83}

img

終於找到了flag的後面部分

5.拼接前後兩部分,形成完整flag

flag的後面部分,與前半部分拼接在一起,該題的flag就出來了。
flag{821111c54af65add515c872ad73fe83}

6.原始碼下載

附件:連結:https://pan.baidu.com/s/1bV05iusdwTFgPJfG1mqxpg?pwd=srts
提取碼:srts

也可以用手機掃碼下載:
img

相關文章