rar
下载附件,查看文件头部,是一个rar的压缩包。
改后缀解压,需要密码,看到压缩包提示:屈原的姓、氏、名、字分别为哪四个字?拼接起来md5加密后即为解压密码
查看百度:屈原(约公元前340—公元前278年),芈姓,屈氏,名平,字原,
组合芈屈平原
,写脚本进行md5编码:
import hashlib
s1 = '芈屈平原'.encode('utf-8')
x=hashlib.md5(s1).hexdigest()
print(x)
得到密码:16ccb09f96f27af192f541992560d695
解压后,得到三个文件:先来看看这个吧
,password
,base_data.txt
先来看看这个吧
用010editor打开先来看看这个吧
,发现是jpg图片
改后缀后,查看
没有什么有用信息。
继续看010editor。
发现一段base64密文:
4pe777iO4pmL77iO4qyn77iO4qyn77iO4qyl77iO4pah77iO4p2S77iO4pmO77iOIOKZk++4juKsp++4jiDimYvvuI4g4pmM77iO4p2N77iO4pe777iOIOKZkO+4juKZk++4juKXj++4juKZj++4jiDirKXvuI7imZPvuI7ip6vvuI7imZLvuI4g4pmL77iOIOKZjO+4juKZk++4juKnq++4jiDimY7vuI7imY/vuI7il7vvuI7ip6vvuI7imZLvuI4g4pah77iO4pmQ77iOIO2gve23j++4ju2gve2zhO+4jg==
base64解密后:
◻︎♋︎⬧︎⬧︎⬥︎□︎❒︎♎︎ ♓︎⬧︎ ♋︎ ♌︎❍︎◻︎ ♐︎♓︎●︎♏︎ ⬥︎♓︎⧫︎♒︎ ♋︎ ♌︎♓︎⧫︎ ♎︎♏︎◻︎⧫︎♒︎ □︎♐︎ 🗏︎📄︎
百度后,得知是wingdings编码
用https://lingojam.com/WingDing
网站解码:
得到:p︎a︎s︎s︎w︎o︎r︎d︎ i︎s︎ a︎ b︎m︎p︎ f︎i︎l︎e︎ w︎i︎t︎h︎ a︎ b︎i︎t︎ d︎e︎p︎t︎h︎ o︎f︎ 3︎2︎
告诉我们password文件是个32位的bmp文件。
passwrod
查看password文件:
只有FF
和00
,只能百度下:
https://blog.csdn.net/yesheng1989/article/details/11595735
得知,现在的password文件中的内容是图片点阵数据
我们需要补全文件头
和信息头
上面的网页中,我们知道bmp的文件头
和信息头
一共是54个字节,我们在password前插入54个字节
再载入bmp模板
按网页内容修改对应字节:
其中文件大小可以查看文件属性查看:
文件尺寸计算方法为:
(文件大小(324,212)-文件头大小(54))/4=wh=81,039
得到81,039
这个数字,然后去http://factordb.com/
进行分解
得到81039 = 3 · 7 · 17 · 227
,即:81039=357227
再修改password文件的后缀为.bmp
打开后得到密码:md5{白帽子社区CTF团队祝您端午安康}
用上面脚本得到密码:74636cc4cfe7cc222130ea50bb2e23c2
base_data.txt文件
打开base_data.txt文件,看到里面是base64编码后的密文,写脚本解码:
import base64
tmp=''
with open(r'C:\Users\Crazy\Desktop\test\base_data.txt','r') as f :
for i in f:
tmp +=base64.b64decode(i).decode('utf-8')
tmp +='\n'
print (tmp)
with open (r'C:\Users\Crazy\Desktop\test\base_data1.txt','w') as f :
f.write(tmp)
打开base_data1.txt
文件:
发现内容格式均为日期+时间+内容
我们将内容copy进excel表,数据分列,并按时间排序,得到如下内容:
我们将内容列的字符串copy进文件,111.txt
发现文件开关是504B,猜测是压缩包,写脚本:
tmp = ''
with open(r'C:\Users\Crazy\Desktop\test\111.txt','r')as f:
for i in f :
tmp +=i.replace('\n', '')
tmp = bytes.fromhex(tmp)
with open(r'C:\Users\Crazy\Desktop\test\111.zip','wb')as f:
f.write(tmp)
得到压缩包111.zip。
111.zip
使用上面password.bmp
的密码解压111.zip
,得到两个文件:DuanWu.png.txt
和This-Is-Flag.png
查看This-Is-Flag.png
,没什么有用内容。
This-Is-Flag.png
用010editor打开,发现CRC校验报错,怀疑图片尺寸被修改。
使用脚本爆破:
import struct
import binascii
from Crypto.Util.number import bytes_to_long
img = open(r'C:\Users\Crazy\Desktop\test\DuanWu\This-Is-Flag.png', "rb").read()
for i in range(0xFFFF):
for j in range(0xFFFF):
stream = img[12:16] + struct.pack('>i', j)+struct.pack('>i', i) + img[24:29]
crc = binascii.crc32(stream)
if crc == bytes_to_long(img[29:33]):
print(hex(i),hex(j))
得到 i 为0xc8
, j为0x5dc
用010editor编辑:
重新查看This-Is-Flag.png
发现为flag的参考图
DuanWu.png.txt
查看DuanWu.png.txt
,
都是十六进制内容,头部看不出什么,尾部发现是png文件头的倒序。写脚本:
with open(r'C:\Users\Crazy\Desktop\test\DuanWu\DuanWu.png.txt','r') as f :
for i in f :
tmp = i[::-1]
tmp = bytes.fromhex(tmp)
with open(r'C:\Users\Crazy\Desktop\test\DuanWu\DuanWu.png','wb') as f1:
f1.write(tmp)
得到DuanWu.png
观察后发现,有许多小竖线,有蓝色和红色,蓝色线每列只有一个,估计为修改后的This-Is-Flag.png
图中的蓝线,我们以此为基准线,写脚本对齐:
from PIL import Image
file = r'C:\Users\Crazy\Desktop\test\DuanWu\DuanWu.png'
img = Image.open(file)
pixels = img.load()
for r in range(img.size[0]):
backup_row = []
for c in range(img.size[1]):
backup_row+=[pixels[r,c]]
done = False
for i in range(0,img.size[1]):
if done:
break
for c in range(img.size[1]):
pixels[r,(c+i)%img.size[1]] = backup_row[c]
if pixels[r,163]==(0,0,255)and pixels[r,171]==(0,0,255)and pixels[r,175]==(0,0,255):
done = True
img.save(r'C:\Users\Crazy\Desktop\test\DuanWu\flag.png')
得到flag.png
文件。打开后即是flag:BMZCTF{Mochu7&Cyz-Wish-You-Happy-DuanWu-Festival}