写在前面:这里是β-AS,是被这次比赛虐的体无完肤的菜鸡,通过这次比赛学到了很多知识,包括各种工具和命令(渣渣路过)虽然很多都是知识盲区,ε=(´ο`*)))唉还是我刷的题不够多
还有一个体会是:为什么压缩包没有忘记密码这个选项(o(╥﹏╥)o)
CYPTO
。1古典密码知多少
当当当!!首先出现的是古典密码——猪圈及其变形(圣武士密码),还有宇宙的信号~
猪圈咱就不说了,都是老熟人了
附上银河信号的解码图
所以结果是FGCPFLIRTUASYON
此时你兴致冲冲的提交,发现:哎?他怎么不对?他为什么不对?题错了吗
通过图片中的提示fence是栅栏,我们通过栅栏解码得到FLAGISCRYPTOFUN
此时
所以最后答案是
MRCTF{CRYPTOFUN}
(一开始提交flag是一直是不成功,灵光一闪才把flagis删掉[沧桑])
。2天干地支+甲子
甲戌 甲寅 甲寅 癸卯 己酉 甲寅 辛丑
百度天干地支可以得到上文顺序
对照该表,得到以下数字 11515140465138
接下来就。。。一顿操作猛如虎,一看()后面不说,懂得都懂
就很难办,突然,看到题目天干地支+甲子,
那么有两种可能,一个就是甲子01,另一个是一甲子60;
要么就是在最后加,要么就是每个数都加上01。
将01添上后,并没有什么卵用,所以
尝试每个数都+60,即711111111001061119
这样看可能还看不出什么那我们吧每个天干地支的数字分开71 111 111 100 106 111 98
就很眼熟,是十进制转ASCII,不多,我们就收工找出来
Goodjob
所以MRCTF{Goodjob}
。3keyboard
6 666 22 444 555 33 7 44 666 66 3
(要命)后来知道少打了个3
这串数字啥也不像,又提到了keyboard,所以猜是拼音九键,
即mobilephone
最后flag是MRCTF{mobilephone}
。4
MISC
。1ezmisc
图片很干净,照例属性没啥特别的,用010开开,
发现5003193明显小于49444154,所以怀疑改了高度,
MRCTF {1ts_vEryyyyyy_ez!}
。2CyberPunk
打开发现是一个运行软件,
上面显示2020.9.17(正好是我生日第二天2333
回到正题,第二句显示当到2020.9.17我会把flag给你,
所以我们把电脑上时间改成2020.9.17就可以啦,最后flag是
啦啦啦bingo
。3寻找xxx
dtmf音,有点难为我,没有找到非常适合的解决办法(标红,亟待解决)
不过有一个手工方法
用audacity打开该音频,换成频谱图
粉紫色的即为频率,选中一小段,点 分析,找到该段峰值,由于是双音,即可确定内容
(附对照表)
搜索微信号,将手机号发给他,flag就到手啦
。4千层套路
传统套娃题
写个脚本跑一下
#coding=utf-8
import os
import zipfile
orginal_zip = "0573.zip"
while True:
tag = orginal_zip
orginal_zip = zipfile.ZipFile(orginal_zip)
for contents in orginal_zip.namelist():
password = contents[0:contents.find('.')]
print password
orginal_zip.setpassword(tag[:-4])
try:
orginal_zip.extractall()
except:
break
if(len(tag)>6):
os.system("rm "+tag)
orginal_zip=password+".zip"
然后出来一个qr.txt,打开发现是(255,255,255)和(0,0,0)
合理猜测是个二维码,所以继续写个代码跑一跑(用PIL就可以
from PIL import Image
x = 200 #x坐标 通过对txt里的行数进行整数分解
y = 200 #y坐标 x * y = 行数
im = Image.new("RGB", (x, y)) #创建图片
file = open('C:\\Users\\60120\\Desktop\\qr.txt') #打开rbg值的文件
#通过每个rgb点生成图片
for i in range(0, x):
for j in range(0, y):
line = file.readline().replace("("," ").replace(")","") #获取一行的rgb值
rgb = line.split(", ") #分离rgb,文本中逗号后面有空格
im.putpixel((i, j), (int(rgb[0]), int(rgb[1]), int(rgb[2]))) #将rgb转化为像素
im.show() #也可用im.save('flag.jpg')保存下来
简简单单拿到flag:MRCTF{ta01uyout1nreet1n0usandtimes}
。5不眠之夜
拿到这个文件,平常解压,打开文件夹。。。。之后。。。嗯。。wtf石化当场,这是啥???
放一张图,你们感受一下
真就不眠之夜呗
啊啊啊啊啊抓狂
仔细分析一下这些图片,发现flag应该是在图上写着,然后把图片分割了
那就好。。。那也不好办啊,121张,得拼老久啊歪(方法一)
以下两个方法来自V&N wp(https://mp.weixin.qq.com/s/TEnuxcUV1SHiW4VOWQK9eQ)
方法二:
from PIL import Image
import os
import pandas as pd
import difflib
imgs = os.listdir('.')
img_info = pd.DataFrame(columns=['top', 'left', 'right', 'buttom'], index=[])
for img in imgs:
if 'jpg' not in img:
continue
piece = Image.open(img)
piece.convert('L')
x_max = piece.size[0]
y_max = piece.size[1]
top_str = ''
left_str = ''
right_str = ''
buttom_str = ''
for i in range(0, x_max):
top_str += chr(piece.getpixel((i, 0))[0])
buttom_str += chr(piece.getpixel((i, y_max - 1))[0])
for i in range(0, y_max):
left_str += chr(piece.getpixel((0, i))[0])
right_str += chr(piece.getpixel((x_max - 1, i))[0])
img_info = img_info.append(pd.Series({'top': top_str, 'left': left_str, 'buttom': buttom_str, 'right': right_str}, name=img))
img_info.to_csv('res.csv')
img_combine = pd.DataFrame(columns=['top', 'left', 'right', 'buttom'], index=[])
max_similiar = {
'top': '0',
'buttom': '0',
'left': '0',
'right': '0',
}
def strdiff(str1, str2):
return difflib.SequenceMatcher(None, str1, str2).quick_ratio()
for index1, row1 in img_info.iterrows():
for name in img_info.columns:
for index2, row2 in img_info.iterrows():
if index1 == index2:
continue
if name == 'top':
contrast = 'buttom'
elif name == 'buttom':
contrast = 'top'
elif name == 'left':
contrast = 'right'
elif name == 'right':
contrast = 'left'
if max_similiar[name] == '0' or strdiff(row1[name], row2[contrast]) > strdiff(row1[name], img_info.loc[max_similiar[name], contrast]):
max_similiar[name] = index2
#if strdiff(row1[name], img_info.loc[max_similiar[name], contrast]) < 0.85:
# max_similiar[name] = '0'
img_combine = img_combine.append(pd.Series(max_similiar, name=index1))
img_combine.to_csv('final_res.csv')
该代码为辅助拼图(不懂代码的弟弟并没有看懂
方法三:用gaps拼图,先将120张小图合并成一张大图,可以用montage命令实现
magick montage *jpg -tile 10x12 -geometry 200x100+0+0 out.jpg
这个要在cmd下实现,会在同目录下生成一张如下图片
得到这样一张图片,之后再用缺口跑一下就能还原整个拼图
拖到Kali里,执行下列命令
gaps --image=out.jpg --generations=40 --population=120 --size=100
所以最后flag如图所示
。6ISS
这个。。。嗯。。。 第一次见,无线电传输
直接mmsstv(电脑)或者xdsopl.robot36.apk(手机)就可
u1s1 sstv真难听
。7pyflag
拿到题目题目解压发现三张小姐姐的图片,属性没有什么特别的,用010打开看看
发现每一张图片都有部分多余的
猜测是一个压缩包分成了三份,于是我们把它拼起来就好啦
拼完之后记得把压缩包多的东西删掉
(记得有三个哟~
保存为zip文件打开后,发现有两个文件:hint和flag,但是都加密了,尝试修改010后,发现并不是伪加密,到了遇事不决的时候了,暴力破解走一走 最后的到密码是1234
打开hint提示是base家族并给出了范围
打开flag
原文:
G&eOhGcq(ZG(t2*H8M3dG&wXiGcq(ZG&wXyG(jtG&eOdGcq+aG(t5oG(jqG&eIeGcq+aG)6Q<G(jrG&eOdH9<5qG&eLvG(jsG&nRdH9<8rG%++qG%__eG&eIeGc+|cG(t5oG(jsG&eOlH9<8rH8C_qH9<8oG&eOhGc+_bG&eLvH9<8sG&eLgGcz?cG&3|sH8M3cG&eOtG%_?aG(t5oG(jtG&wXxGcq+aH8V6sH9<8rG&eOhH9<5qG(<E-H8M3eG&wXiGcq(ZG)6Q<G(j~tG&eOtG%+<aG&wagG%__cG&eIeGcq+aG&M9uH8V6c
G&eOlH9<8rG(<HrG(j~qG&eLcH9<8sG&wUwGek2)
第一层:base85
475532444B4E525549453244494E4A57475132544B514A54473432544F4E4A5547515A44474D4A5648415A54414E4257473434544B514A5647595A54514D5A5147553444474D5A5547453355434E5254475A42444B514A57494D3254534D5A5447555A444D4E5256494532444F4E4A57475A41544952425547343254454E534447595A544D524A5447415A55493D3D3D
第二层:base16
GU2DKNRUIE2DINJWGQ2TKQJTG42TONJUGQZDGMJVHAZTANBWG44TKQJVGYZTQMZQGU4DGMZUGE3UCNRTGZBDKQJWIM2TSMZTGUZDMNRVIE2DONJWGZATIRBUG42TENSDGYZTMRJTGAZUI===
第三层:base32
54564A4456455A3757544231583046795A5638305833417A636B5A6C593352665A47566A4D47526C636E303D
第四层base16
TVJDVEZ7WTB1X0FyZV80X3AzckZlY3RfZGVjMGRlcn0=
第五层:base64
MRCTF{Y0u_Are_4_p3rFect_dec0der}
bingo~成功
(不过我没有想到base48是真的有用了,还是。。。。
。8unravel
拿到题目解压,出来一张图片,一段音频和一个压缩包
话不多说,开冲
对图片进行分析,属性没有隐藏的,010打开看看,发现他藏了一个图片
直接上Kali,分离出一个张名为aes.png(划重点,要考的)的图片,
然后。。。这张图片就没有然后了,不过合理猜测这个Tokyo应该是个密钥之类的重要东西
下面我们对音频进行分析,打开粗略听一遍,别说还挺好听,还略微有点耳熟,音频名字明显提示 Look_at_the_file_ending
成功get到key,可是看着一串不像base64,也不像十六进制的,(为了解码我还特地去扒了东京喰种的音乐和人物,甚至认识了那张图片里的金木研和英良,后来就误打误撞解除了密码。不过!!!!人家有依据的,看前面考点,是什么!!!)
于是联想到之前在死胡同里的图片。。。!!是aes,Tokyo就是个key(http://tool.chinaz.com/tools/textencrypt.aspx)
CCGandGulu !!!成功得到压缩包密码
又是一段音频,打开并没有什么特别
(敲黑板,划重点了)然是一个新工具:silenteye 用这个过一遍音乐就可以啦
(如有需要,可以找我哈哈哈哈)
。9你能看懂音符吗
这个题目下载下来,很平常的就打开压缩包
然然后。。。。等等,好像有哪里不大对的亚子
嗯。。。压缩包坏了吗?果断010打开,找一个正常的rar文件对比一下
果然是的,把前面两个十六进制颠倒一下顺序就可以啦
正常打开后,发现,诶???怎么什么都没有啊歪(吐血
又想到之前师傅讲doc文件也是一个压缩包,他会通过某种神秘的函数使得文字消失
所以我们把它改成zip格式,重点观察一下,果不其然,被我们找到了
找到是找到了,可是。。。。我根本看不懂啊歪(出题人在那,有没有学过音乐(威胁))
百度音符解码,诶!被我发现了
https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyu
拿去解密,不用谢
MRCTF{thEse_n0tes_ArE_am@zing~}
。10Hello_Misc
打开文件,正常的压缩包和一张png图片
压缩包加密了,然后我们分析一下图片,属性没啥,010打开发现还有一个压缩包,话不多说,直接上Kali,分离出一个压缩包,但是有密码,经过暴力破解无果后,只能从图片上寻找信息
然后感觉这张图片一直很特别,只有红蓝两色
故可以想到将图片中的红色和蓝色像素块转换成 0 & 1 序列并重新构建,以此可以还原得到一张图片(标红,未见过的新思路)
所以利用咖啡里的红色通道分离图片,保存为png,成功得到压缩包密码
解压出的txt打开来看是127 255 63 191四个数字重复
将这四个数字转化为二进制,可以看到这四个数字的二进制形式中 只有最高两位的二进制数不同 ,将其最高两位提取出来组合在一起转化为ASCII,可以得到rar密码。(标红,未见新思路)
fp = open('D:\\404NOTFOUND\\β-AS\\MRCTF\\hello\\hello\\00000043\\out.txt','r')
a = fp.readlines()
p = []
for i in a:
p.append(int(i))
s = ''
for i in p:
if i == 63:
a = '00'
elif i == 127:
a = '01'
elif i == 191:
a = '10'
elif i == 255:
a = '11'
s += a
import binascii
result = ''
for i in range(0,len(s),8):
result += chr(int(s[i:i+8],2))
print result
注意这是一段python2的代码
跑出来结果是!!!
rar-passwd:0ac1fe6b77be5dbe
打开加密的flag压缩包,得到一个压缩包,但是看着很像doc,于是修改后缀名,
将文件内容全选改为深色,可以看到在文档的最下方藏有几串字符
ps:如果用word打开的话可以看到有最后的换行符存在,可以判断文档中隐藏了内容
将每一长串的字符用base64解码,可以得到6行只由 0 & 1 组成的字符串
在文档左侧(word和WPS都可)查找字符就可以观察到flag,包裹上 MRCTF{} 就是最终的flag
所以flag是
MRCTF{He1Lo_mi5c〜}
二解:
from PIL import Image
import bitstring
im = Image.open('try to restore it.png')
width = im.size[0]
height = im.size[1]
pim = im.load() # 读取图片的像素信息
bin_result = ''
for h in range(height):
for w in range(width):
if pim[w,h][0] == 255: # 判断是否是红色(R,G,B)[0]表示第一通道
bin_result += '1'
else:
bin_result += '0'
# print bitstring.BitArray(bin=bin_result).bytes.encode('hex')
with open('result.png','wb') as f:
f.write(bitstring.BitArray(bin=bin_result).bytes)
注:由于刚开始无法确定长宽的内外循环关系及红蓝对应关系,故可以进行多次尝试
还原得到图片,看图获得解压zip包的密码
(生成该脚本
from PIL import Image
import bitstring
with open('1.png','rb') as f:
bitcon = bitstring.Bits(f)
im = Image.new('RGB',(1024,780),(255,0,0))
pim = im.load()
for i,val in enumerate(bitcon.bin):
if val == '0':
pim[i%1024,i/1024] = (0,0,255)
im.save('red_blue.png')
本题有参考这位大佬的博客 Ga1@xy
http://www.ga1axy.top/index.php/archives/13/#hellomiscworld%EF%BC%81
完结,撒花✿✿ヽ(°▽°)ノ✿