buuoj復現html
1,佛系青年python
下載了以後是一個加密的txt文件和一張圖片api
分析圖片無果,很討厭這種腦洞題,MISC應該給一點正常的線索加部分腦洞而不是出干擾信息來故意讓選手走錯方向,當時比賽作這道題的時候也是醉了學習
接着將壓縮包放進010Editor查看是否僞加密和其餘線索ui
發現僞加密,將0900改爲0000,保存以後打開txt文件this
很明顯最後一句是與佛論禪編碼
佛曰:遮等諳勝能礙皤藐哆娑梵迦侄羅哆迦梵者梵楞蘇涅侄室實真缽朋能。奢怛俱道怯都諳怖梵尼怯一罰心缽謹缽薩苦奢夢怯帝梵遠朋陀諳陀穆諳所吶知涅侄以薩怯想夷奢醯數羅怯諸
在線解密獲得:加密
2,gakki3d
下載壓縮包以後是一張gakki的圖片code
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 位一組
獲得: