将网页内容保存为lyric-.json文件即可。
得到txt文档的内容:
换用其他软件查看,发现存在空白字符隐写:
利用工具解密即可。注意选择正确的解码设置。可以使用十六进制编辑器的查找功能确定使用的编码字符。
由于本鶸出题设计的太不严谨,考虑不够周全,导致比赛中多次出现非预期,因此不得不在比赛过程中对附件进行多次修改,再加上题目附件过大(
根本压缩不动),多次下载浪费了做题师傅许多的时间和空间,带来了不便和不好的做题体验,我对此表示诚挚的歉意,还请各位师傅多多包涵谅解!
解压题目文件,可以发现一个装有flag的加密压缩包和一个完整的用于vmware的虚拟机,双击vmx文件,打开发现虚拟机被加密,所以首先要破解加密
在github上可以找到一个项目:
使用这个脚本可以进行爆破,但是用其自带的字典爆破无法得到密钥,所以接下来我们要寻找字典
观察文件夹中的文件,我们需要先了解一下这些文件的用途,可参考
我们依次观察这些文件,可以发现在 .vmxf 文件中有这样一句话
正常的vmxf文件是不会有这样一句话的,很明显是出题人故意修改过的,用来暗示文件被破坏,需要进行修复
附件中有三个log文件,单纯查看并不能发现什么,但是如果用十六进制编辑器或者vim查看,就可以发现在最大的log文件中存在一些不可见字符
提取隐写的信息,即可得到一份字典,顺便还原出没有经过隐写的log
其实这里也有一个快速确定log文件的方法:正常导出加密虚拟机时,导出的文件并不会含有log文件,而这里的log文件很明显就是出题人后加进去的
通过使用提取出来的字典,利用刚刚提到的脚本进行爆破,即可得到密钥:kx4s3a
用密钥移除加密后,打开虚拟机,发现提示客户文件未指定虚拟机操作系统
所以我们需要先找到虚拟机的操作系统,在镜像文件中一定会有记录,打开iso文件,大概翻一翻就可以看到CentOS
,如果用010的话直接打开加载模板也能看到
修改操作系统为Linux CentOS 7 64 位,再次尝试打开虚拟机,发现提示Operating System not found
,百度一下报错可以大概了解到是CD/DVD指定目录的问题,但是我们再观察一下这个虚拟机再vmware中显示的配置,和其他的虚拟机相对照,可以发现有很多设置都缺少了
有关虚拟机配置的信息,我们上文已经提到了在 .vmx 文件中,用文本编辑器打开vmx文件,可以看到如下的信息
如果打开不是这样的话,先把虚拟机的加密移除,就可以看到了
有关vmx文件中的这些配置选项的含义,可以参考:
当然也可以参考自己其他虚拟机的vmx文件,无论是查看相关文章,还是自己对比其他的虚拟机,都可以发现配置选项中是没有XXX
这一选项的,所以很明显vmx文件已经损坏,需要进行修复,修复方法可参考,需要用到log文件,在log中寻找如下两行信息
将这两行中间的信息复制到vmx文件中,移除前面多余的时间信息和结尾用于隐写的空白字符,保留如下格式,调整为左对齐
修改后保存即可,再次尝试打开虚拟机,出现了新的报错:指定的文件不是虚拟磁盘
在vmx文件已经修复好的情况下,出现这种报错,那就是虚拟磁盘文件,即vmdk文件出现了问题,所以接下来需要修复vmdk,有关vmdk的结构详解可参考:
本题的虚拟机共有7个vmdk,一个很小的和六个分别编号1~6的较大的,其中较小的文件可以用文本编辑器打开,且内容可读,结构大体由三部分组成
参考文档,对比正确的vmdk,可以发现第一部分缺少了version
、parentCID
和磁盘文件的编号,文档中也有写
version
的值默认为1,本题虚拟机并没有快照,所以parentCID=ffffffff
,再按顺序补充编号s001~s006
,修改后保存,再次打开发现仍然报错,继续检查其余的vmdk文件,编号1~6的vmdk文件有固定的文件头,大小为512字节,具体组成如下表:
0 |
0 |
我们用十六进制编辑器打开vmdk,可以发现这些文件缺少了Signature和version(默认为1)共8字节的内容,补上4B 44 4D 56 01 00 00 00
,继续查看,还可以发现第73~76位用于校验文件传输是否发生损坏的行结束符也没有,查ascii表或者对照正常的vmdk,都可以得到对应的16进制字符串0A 20 0D
0A
,修改后保存,再次尝试即可正常打开虚拟机
用题目所给的guest用户登录,发现在当前目录就有一个假的flag,提示flag不在这里,查看history,发现其中提示
我们需要进入root文件夹,但guest用户没有权限进入,查看sudo的版本可以发现是最新版,所以也并不存在提权漏洞,需要换一种思路
CentOS存在单用户模式,我们可以利用单用户模式来修改root的密码:
依次执行以下几条命令:
LANG=en
重启系统后即可用刚刚修改过的密码登录root,在root文件夹下得到压缩包密码
在当前目录下还可以看到一个 7-f1le,取小写md5即是2.0的最后一部分flag
解压即可得到真正的flag
我看也有许多队伍的师傅是采用替换vmx,修改vmdk配置文件的方式对虚拟机进行修复,这也是一种很好的方法,而且比我设计的预期解题方式要简单一些。其实我设计这道题的目的,就是想让大家更多了解虚拟机各个配置文件的用途,了解并学习虚拟机损坏时的修复方式和当root密码忘记如何获得root权限等知识点,私认为和实际生活的联系还是比较大的,也希望各位做题的师傅能通过本题学到新的知识 :)
本题的解法涉及到目前 CPython 设计的安全漏洞。我们将在 Python 安全响应团队回应与修复之后,放出此题题解。
shellgen两道题起源于一个有趣的命题:无字母数字webshell怎么写能最短,有没有程序化的生成方式,如果有,该怎么写?
题目本身有点偏算法,但是由于判定松,无时间限制(五秒,很长很长了),成功拿到flag的队伍还蛮多的
首先构造出a
,对于每个字符都逐个递增,逐个拼接,是最原始暴力的解法:
上面这个小算法生成php代码的长度很大程度上取决于hash_char
,是不是有种哈夫曼的味道?
取target中所有最长不下降子序列,如下:
得到两条不下降的序列,然后根据原有序列依次从每个序列的头部开始输出。
这里还涉及到一个细节,就是变量名如何取。觉的好玩的话可以思考思考。
也有更好的算法,归根结底都是减少++的次数与新变量的个数。比如“标答”中(见GitHub)的变量名就可以继续缩短。
这道题在实际比赛中本来就是作为shellgen的“好玩版”放在那里的,所以即使出现了用简单办法通过的队伍也没有进一步加强(其实做出来的25个队伍中绝大多数都是用很暴力的办法过的,由于只check了一组数据,可能会随机到对暴力算法非常友好的数据,所以多交几次大概也就过了),反而放宽了一些限制(当然有个限制是因为我自己的问题,再次抱歉),大家也就,开心就好(
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。