下载压缩包之后是一张gakki的图片,
foremost一下,得到一个压缩包,包里有flag.txt,但是需要密码才能打开。尝试数字爆破,得到密码8864,打开之后得到一串奇奇怪怪的字符,
看了大佬的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))
题目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到解码网站,得到的基本一样:
把那串字符百度一下,是杀人狂想曲的歌词
多行解密一下,得到果然是歌词,不过有些地方因为编码不同乱码了,
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是将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 位一组