MRCTF

写在前面:这里是β-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

完结,撒花✿✿ヽ(°▽°)ノ✿

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章