[GXYCTF2019] MISC雜項題


buuoj復現

1,佛系青年

下載了之后是一個加密的txt文件和一張圖片

 

 分析圖片無果,很討厭這種腦洞題,MISC應該給一點正常的線索加部分腦洞而不是出干擾信息來故意讓選手走錯方向,當時比賽做這道題的時候也是醉了

接着將壓縮包放進010Editor查看是否偽加密和其他線索

 

 

發現偽加密,將0900改成0000,保存之后打開txt文件

 

 很明顯最后一句是與佛論禪

佛曰:遮等諳勝能礙皤藐哆娑梵迦侄羅哆迦梵者梵楞蘇涅侄室實真缽朋能。奢怛俱道怯都諳怖梵尼怯一罰心缽謹缽薩苦奢夢怯帝梵遠朋陀諳陀穆諳所吶知涅侄以薩怯想夷奢醯數羅怯諸

  在線解密得到:

 

 2,gakki

下載壓縮包之后是一張gakki的圖片

 

 

 

foremost一下

 

 

 

分離之后得到了壓縮包,同時需要密碼

嘗試數字爆破

得到密碼8864

 

 

 

解密之

 

 

 

flag.txt文件里面是一大堆亂七八糟的字符,這種無規律的字符集我們就嘗試字頻統計

附上官方字頻統計exp:(羡慕

# gakki_exp.py 
# Author : imagin 
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- ={}[]" 
f = open("flag.txt", "r") 
data = f.read() 
result = {d:0 for d in alphabet} 

def sort_by_value(d): 
	items = d.items() 
	backitems = [[v[1],v[0]] for v in items] 
	backitems.sort(reverse=True) 
	return [ backitems[i][1] for i in range(0,len(backitems))] 

for d in data: 
	for alpha in alphabet: 
		if d == alpha: 
			result[alpha] = result[alpha] + 1 

print(sort_by_value(result))

 跑一遍就得到flag了

 

 這道題重在看到題目的意識。

 

3,SXMgdGhpcyBiYXNlPw==

先將題目base64解密

 

 

 

得到  Is this base?

下載附件

壓縮包里面是flag.txt

 

 

 看起來是很多的base64加密,嘗試解密第一行的字符串,使用base64解碼得到: 

Cette nuit,

確實是base64加密,於是我們多行base64解密,得到:

Cette nuit,

Intenable insomnie,

La folie me guette,

Je suis ce que je fuis

Je subis,

Cette cacophonie,

Qui me scie la t錨te,

Assommante harmonie,

Elle me dit,

Tu paieras tes delits,

Quoi qu'il advienne,

On tra卯ne ses cha卯nes,

Ses peines,

Je voue mes nuits,

A l'assasymphonie,

Aux requiems,

Tuant par depit,

Ce que je seme,

Je voue mes nuits,

A l'assasymphonie,

Et aux blasphemes,

J'avoue je maudis,

Tous ceux qui s'aiment,

L'ennemi,

Tapi dans mon esprit,

F錨te mes defaites,

Sans repit me defie,

Je renie,

La fatale heresie,

Qui ronge mon 錨tre,

Je veux rena卯tre,

Rena卯tre,

Je voue mes nuits,

A l'assasymphonie,

Aux requiems,

Tuant par depit,

Ce que je seme,

Je voue mes nuits,

A l'assasymphonie,

Et aux blasphemes,

J'avoue je maudis,

Tous ceux qui s'aiment,

Pleurent les violons de ma vie,

La violence de mes envies,

Siphonnee symphonie,

Deconcertant concerto,

Je joue sans toucher le Do,

Mon talent sonne faux,

Je noie mon ennui,

Dans la melomanie,

Je tue mes phobies,

Dans la desharmonie,

Je voue mes nuits,

A l'assasymphonie,

Aux requiems,

Tuant par depit,

Ce que je seme,

Je voue mes nuits,

A l'assasymphonie,

Et aux blasphemes,

J'avoue je maudis,

Tous ceux qui s'aiment,

Je voue mes nuits,

A l'assasymphonie (l'assasymphonie),

J'avoue je maudis,

Tous ceux qui s'aiment

  有的解碼之后因為編碼不同出現了亂碼。

去百度搜索了一下,原來這個是殺人狂想曲的歌詞

但是有的地方好像又跟原曲子不太一樣,一般這種文字很多的第一反應就會想到字頻加密,不過前一道題目已經考過這個點了。

跑了一下字頻加密也沒有什么結果,因為是base64加密,所以考慮到是base64隱寫,找到一篇介紹base64隱寫的文章,貼上鏈接:

https://www.tr0y.wang/2017/06/14/Base64steg/index.html

base64隱寫我記得在一道題里面遇到過。

 

貼上官方解釋,學習一波: 

base64是將3個8比特轉換成4個6比特,最小的轉換單位是24比特(6和8最小公倍數)

因此如果原文內容不足三字節,有一部分比特解碼時候不需要,但會組成編碼后的某個字符。

比如上圖A的 0100 0001 被 base64 識別為 0100 0001 0000 然而最后四個比特解密時無
用。換句話說 0100 0001 0000 和0100 0001 1111 對應的原文都是 A ,因此可以使用這四
個比特進行隱寫

 

如果官方題解沒有看懂,簡單說一下我自己的理解,base64隱寫就是每一次base64編碼之后不是都剛好占到了三個字節,當沒有占到3個字節的時候,我們將base64編碼最后的幾個比特修改成我們想要隱藏的信息,同時並不影響base64的解碼。

無處不在的隱寫

知道原理之后用腳本跑一遍就行了

# -*- coding: cp936 -*-
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('flag.txt', 'rb') as f:
    bin_str = ''
    for line in f.readlines():
        stegb64 = ''.join(line.split())
        rowb64 =  ''.join(stegb64.decode('base64').encode('base64').split())
        offset = abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=','')[-1]))
        equalnum = stegb64.count('=') #no equalnum no offset
        if equalnum:
            bin_str += bin(offset)[2:].zfill(equalnum * 2)
        print ''.join([chr(int(bin_str[i:i + 8], 2)) for i in xrange(0, len(bin_str), 8)]) #8 位一組

  得到:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM