很早就想做的一道题,也是当时V&N公开赛的misc压轴题,整体来看题目非常复杂,套了一层又一层,但涉及考点很多,而且有些考点很新颖很少见,值得一做!

题目考点

  • Malebolge language
  • vmdk中查找题目附件
  • NTFS隐写
  • ELF文件修复
  • 键盘密码
  • base64隐写
  • 需要密钥的LSB隐写
  • osu!中观察flag

题目详解

下载附件解压,得到一个vmdk镜像文件和一个加密的压缩包,下面我们分部来进行解析

Something useful.zip

首先看加密的压缩包,WinRAR打开可以看到备注

Stupid mortal, you must enter the eighth circle of Hell to get the Tip of god。'=B;:?8\<;:921Uv.3,1*No'&J*)iF~%$#zy?w|{zsr8pun4rTji/PONMLKJIHGFEDCBA@?>=<;:987SRQ3IHMFKDCBf)('&%$#"!~}|{zyxwvutsrqpon,+*)i'&%${zy?}|{t:xwp6Wsrkj0QPONMLKJIHGFEDCBA@VUTYXWVUTSRKoON0LKDCgfS

发现关键字the eighth circle of Hell,Google这个可以发现是和《神曲》有关,而且搜索到的第一条就是

image-20200520194117656

而且这个Malebolge和压缩包中的txt文件名也相同,再搜索Malebolge可以发现有和codelanguage相关的词条,搜索查看发现竟然是一种编程语言

image-20200520194403545

而且还有在线的编译网站:http://malbolge.doleczek.pl/,将压缩包备注中的看似乱码的字符串复制进去,而且要删去每行最后的换行,将其变为一行后再Run program,即可得到压缩包密码:%&^&#@()(*:";'/,,

解压后查看压缩包中的txt,得到hint,内容如下

神说:要有ELF!!!
神说:要有WORD!!!
神说:要有NTFS!!!
神说:要有PDF!!!
神说:要有OSZ!!!

地狱 -- 炼狱 -- 天堂

Windows7_by_Lamber.vmdk

用7z查看这个vmdk文件,打开后发现几乎就是整个C盘,而我们要做的就是找到出题人藏在其中的所有题目附件,一个可以相对减少工作量的方法就是按照修改时间排序,从最新的开始找(当然也得一个一个文件夹的翻),最终在以下目录找到一些名字奇奇怪怪的文件

Windows7_by_Lamber.vmdk\Users\lenovo\Documents\Purgatory.zip
Windows7_by_Lamber.vmdk\Users\lenovo\Desktop\Door.png
Windows7_by_Lamber.vmdk\Users\lenovo\Music\paradise.zip
Windows7_by_Lamber.vmdk\Users\lenovo\Downloads\proverbs.pdf

查了一下这些名字都和题目背景有些关系,而且时间也都集中在6号7号这两天,再看这些附件都符合txt中提到的这些文件格式,可以判断这些都是题目的附件,直接从7z中将这些文件拽出来

Door.png

结合txt中hint的NTFS,直接在题目附件所在文件夹打开cmd,执行dir /r,可以看到在Door.png这个文件后隐藏有exe文件,用工具ntfsstreameditor将其提取出来,得到Purgatory.exe这个文件

Purgatory.exe

用cmd执行该文件,得到了一句话

请将该文件放入炼狱中执行(能进入天堂的是Mr.png,Mrs.jpg只能下地狱)

根据提示放在炼狱中执行,推测是需要和什么文件放在一起(最开始尝试了新建文件夹起名为炼狱,结果失败了),结合neverno师傅给我的提示,最终在以下目录又找到了一个名字奇怪的文件

Windows7_by_Lamber.vmdk\Program Files (x86)\Linux\Purgatorio

将其提取出来,我查了Purgatorio这个单词的意思,正是意大利语的炼狱,将这个文件和Purgatory.exe放在同一目录下,再次运行程序,得到了另一个hint

智慧之神evoA说,你需要修复ELF

Purgatorio

010editor查看该文件,看文件头即可知道为ELF文件,但是在调用readelf来分析这个文件时,却报错

readelf:错误:不是 ELF 文件 - 它开头的 magic 字节错误

查看ELF文件的结构发现,开头四个字节应该为7f 45 4c 46,而该文件的文件头错误,将20改为7f后,再次用readelf查看,可以发现这个文件的文件类型为NONE

image-20200521133847706

用010editor运行ELF文件模板也可以看到

image-20200521134031032

参考了网上有关ELF文件格式详解:

可以知道ELF文件格式主要有三种:

  • 可重定向文件(Relocatable file)
  • 可执行文件(Executable file)
  • 共享目标文件(Shared object file)

初步推测其为可执行文件(Executable file),在010editor中修改类型为ET_EXEC后保存,尝试运行文件

image-20200521134819756

在多次尝试后发现可以另外输入字符,并且可以得到其他内容

image-20200521135007075

根据在Purgatory.exe中得到的提示:

智慧之神evoA说,你需要修复ELF

尝试输入evoA,得到了新的内容

image-20200521135304471

在看了小白师傅的wp后发现刚刚得到的字符串30e308e8e7122579b8ea2fae774d1999解md5也可以得到evoA,在刚刚尝试的时候我还发现,当你输入由evoa这四个字母组成的非evoA的字符串,还可以得到一个假的flag(算是彩蛋了吧2333)

image-20200521135734316

proverbs.pdf

刚刚通过ELF得到的字符串:pdfkG@0zl_3ptmVPfa7LHuB8rs#cRdi$,为pdf开头,推测为此pdf文件的密码,输入后打开了pdf文件

image-20200521141037826

看到这种字符串,而且每组字母在键盘上都相连,想到键盘密码,每个表情分隔为一个单词,但是这个键盘密码画出来的单词比较难看,横竖都有,需要多加分辨,最终组合在一起得到

The password of word is capital(PROVERBS OF GOD)

得到word文档附件的密码:PROVERBS OF GOD

Purgatory.zip

用刚刚得到的password解压,得到docm文件,百度可知docm文件为一种包含宏或启用了宏的文档,用word打开后查看宏:ALT+F8,可以看到有名为LargeSB的宏(大写字母即为LSB

image-20200521143406684

运行宏命令可以得到由大量base64组成的字符串(下图只为其中一部分)

image-20200521143617404

如此大量的base64很容易想到base64隐写,用脚本解一下,得到:Hidden1nWord_

再看word文档的内容,为大量的16进制,FF D8 FF E0 0D 0A 1A 0A开头,但不是FF D9结尾,而89 50 4E 47 0D 0A 1A 0A又是PNG的文件头,所以推测其为被修改了文件头的PNG文件,将文件头改回来后python写入文件,得到PNG图片

import binascii

f = open('Purgatory.txt','r').read().replace(' ','').strip()
fi = open('out.png','w')
fi.write(binascii.unhexlify(f))
fi.close()

由于刚刚的宏提示LSB,而且解base64隐写还得到了字符串,推测该PNG为需要密钥的LSB隐写,密钥为Hidden1nWord_,用脚本解密,得到内容如下

The password of paradise:Bliss_Syc!!!!

paradise.zip

刚才得到的解压密码:Bliss_Syc!!!!,解压后得到osz文件,百度可知这种文件和游戏osu!相关,下载游戏后用游戏打开这个osz文件,发现是个可以玩的图,将这个osz文件拖进kali中,发现可以解压,解压后可以看到一个readme.jpg的文件,strings查看这个文件,在最后可以看到一些可读的数字和字符

in,map.flag,is :0036112S0038362y0042112c0055162{0110912
0118712
0135512
0142112
0158163
0200412
0203862
0216312
0219762
0225312
0231312
0251862
0302512
0312112
0318412
0329628
...

在请教了小白师傅后才理解了这些字符的意思,每一行数字都对应一个时间,这个时间在游戏的图中对应了flag的一个字符,比如给出的例子,在这些数字的结尾也给了相应提示:Traversing.Time

0036112:S
0038362:y
0042112:c
0055162:{

根据下面所给的所有时间,在游戏图中找到对应的字符(在编辑地图模式的左下角可以跳转对应时间),有些时间对应图案只是一个圆点,点上显示的数字即是这个时间对应的字符,比如0135512对应的图案,数字为9

image-20200521165036109

将这些字符按照顺序组合在一起,就是题目的flag,内容是32位小写md5

Syc{469ca48e237f59d6f847c623ceef5777}

其中md5的内容解密后为:Welcome to paradise

参考文章