BUU misc(GXYCTF2019)

gakki

下载压缩包之后是一张gakki的图片,
BUU misc(GXYCTF2019)_第1张图片
foremost一下,得到一个压缩包,包里有flag.txt,但是需要密码才能打开。尝试数字爆破,得到密码8864,打开之后得到一串奇奇怪怪的字符,
BUU misc(GXYCTF2019)_第2张图片
看了大佬的wp,对于这种无规律的字符集要尝试字频统计,附上字频统计exp:

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了。
在这里插入图片描述

SXMgdGhpcyBiYXNlPw==

题目base64解密一下,得到Is this base?
下载文件得到一个压缩包,里面是flag.txt,打开一看是base64字符,写脚本跑一下,得到b'Cette nuit,\nIntenable insomnie,\n'

import base64
file=open('D:/flag.txt','rb')
result=base64.b64decode(file.read())
print(result)

或者直接ctrl +C到解码网站,得到的基本一样:
BUU misc(GXYCTF2019)_第3张图片
把那串字符百度一下,是杀人狂想曲的歌词
BUU misc(GXYCTF2019)_第4张图片
多行解密一下,得到果然是歌词,不过有些地方因为编码不同乱码了,

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隐写,
BUU misc(GXYCTF2019)_第5张图片
base64隐写:
base64是将3个8比特转换成4个6比特,最小的转换单位是24比特(6和8最小公倍数)

因此如果原文内容不足三字节,有一部分比特解码时候不需要,但会组成编码后的某个字符。

比如上图A的 0100 0001 被 base64 识别为 0100 0001 0000 然而最后四个比特解密时无
用。换句话说 0100 0001 0000 和0100 0001 1111 对应的原文都是 A ,因此可以使用这四个比特进行隐写。

简单来说,就是base64编码时不是正好占到3字节,当没有占到3字节的时候,我们就可以利用最后的几个bit来隐藏信息,同时也不影响原本的编码。

附上一篇关于base64隐写的文章:https://www.tr0y.wang/2017/06/14/Base64steg/index.html

脚本跑一下得到flag。

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 位一组

你可能感兴趣的:(CTF,WP)