CTF 你瞭解base麼?1 解題
題目:CTF 你瞭解base麼?1
題目內容:在資料的深海里,我探尋Base的奧秘,
如星辰般閃爍,是資訊的集結地。
程式碼編織的網,捕捉著資料的蹤跡,
Base,你是資料的港灣,是智慧的基石。
字串的舞蹈,在Base中躍動,
二進位制、十六進位制,變幻著節奏。
你不僅僅是儲存,更是轉化的橋樑,
將繁雜的資訊,化為簡潔的符號。
附件及解題程式碼見文尾下載連結
解題思路及步驟
1.利用線上工具“CyberChef”進行base64解碼
解壓壓縮包晨的檔案用記事本開啟,發現有不少行的未尾有“=”,猜測這應該是base64編碼,開啟線上轉碼工具網站:https://cyberchef.org/,選擇“From Base64”,拖入Recipe區中,得到如下:
發現是用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轉碼,得到如下:
/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
看到了flag,只是缺一個右花括號,添上後,提交flag,提示錯誤
。
於是,開始研究前面得到的python程式碼,試圖透過這個編碼指令碼修改解碼指令碼,但始終沒有找到右花括號。一直卡在這裡很長時間沒頭緒。
3.驗證並確認附件裡的base64文字有隱寫
沒辦法,只有到指令碼中的英文註釋尋找蛛絲馬跡,由於英文不好,還利用工具翻譯成了中文。發現裡面有兩句有暗示:
沒有程式碼就無法加密
幾個字在水裡,否則無法加密。還有一句是魔術需要的,有括號嗎
剛剛練習過base64的隱寫題目,掌握的解題辦法只有透過指令碼最好使。
關於base64隱寫的文章見:
base64隱寫原理[https://www.cnblogs.com/ZhouJiaHao/p/14512711.html]
驗證base64編碼裡有沒有隱寫最好的辦法,就是解碼後,再用得到的明文再編碼,核對前後兩個編碼中“=”等號前的字元是否一樣,如不一樣,說明有隱寫。只有=的編碼才有隱寫空間,於是找了一行有=的編碼:
ICAgIGZsYWcgPSBmbGFnLmVuY29kZSgidXRmLTgiKd==
解碼後得到:
flag = flag.encode("utf-8")
再將解碼得到的文字編碼,得到:
ICAgIGZsYWcgPSBmbGFnLmVuY29kZSgidXRmLTgiKQ==
兩行一對比,發現=前的字元不一樣,一行是“d”,另一行是“Q”,其它的都一樣,說明有隱寫。
4.用python指令碼解密隱寫內容
既然有隱寫,那就有戲了。
急忙找來前一篇博文(網址:https://www.cnblogs.com/bcd589/p/18241224) 寫的python指令碼,把附件att中文字複製裝進“flag_encode.txt”檔案,執行指令碼,得到如下結果:
73fe83}
終於找到了flag的後面部分
5.拼接前後兩部分,形成完整flag
flag的後面部分,與前半部分拼接在一起,該題的flag就出來了。
flag{821111c54af65add515c872ad73fe83}
6.原始碼下載
附件:連結:https://pan.baidu.com/s/1bV05iusdwTFgPJfG1mqxpg?pwd=srts
提取碼:srts
也可以用手機掃碼下載: