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最小公倍數)
因此如果原文內容不足三字節,有一部分比特解碼時候不需要,但會組成編碼后的某個字符。
如果官方題解沒有看懂,簡單說一下我自己的理解,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 位一組
得到: