题目描述:Just unzip the archive ... several times ...
解题参考:https://blog.csdn.net/wanmiqi/article/details/115873643
题目给出如下文件:
本题的解题思路其实挺简单的。每一层都有一个pwd.png
的图片和flag_xxx.zip
的压缩包,pwd.png是该层压缩包的解压密码,使用摩斯密码图的形式进行表示。我们要做的就是识别图片中给出的压缩包密码,然后递归解压压缩包即可拿到flag。
难点在于如何去识别图中的摩斯密码,以及如何去递归解压。
首先我们可能会想到通过AI算法去识别图形,然后拿到图片的中的摩斯密码。该方法可以实现,但是太过麻烦。另一种方法是直接读取像素块,然后拿到摩斯密码。具体的话可以这样做:
(1)右击查看图片pwd.png
的属性,可以看到,这是一张25×3
像素的png图片。
(2)为了更加直观的理解像素(块)的概念,我们使用 Photoshop 打开该图片,并放大进行查看。
可以看到,这张图片一共有3行,每一行包含25个方格子,也就是前面看到的图片像素数25×3
。
(3)通过数上面图片中的格子数,我们可以看到有13
个红色的格子和(25*3-13)
个粉红色格子。粉红色格子在这里的作用就是背景色。我们可以通过Python的PIL库,去读取该图片的所有的像素块(格子),然后剔除掉粉色的格子就可以拿到正确表示摩斯密码的格子了。接着再将莫斯密码格子转换为摩斯密码字符串,继续通过查表的方式识别出该摩斯密码表示的明文内容,这样我们就拿到了压缩包的正确解压密码了。
(4)从图片中读取摩斯密码的函数可以这样实现:
|
|
该函数执行完成后,可以提取到图片中的摩斯密码字符串。
正则匹配测试,建议使用该网站:https://regex101.com/
(5)有了摩斯密码后,我们还需要查找摩斯密码表找到对应的明文。代码可以这样实现:
|
|
该函数执行完成后,可以将传入的摩斯密码字符串转换为明文字符串。
(6)最后再循环遍历读取压缩包解压密码、解压压缩包、进入子目录继续读取压缩包解压密码、解压压缩包即可。
这个题目的脚本编写过程还是蛮有意思的,能学到不少东西,比如如何用Python读取像素块,正则匹配,文件路径处理,解压压缩包等。
需要注意:处理压缩包时要使用相对路径,绝对路径太长了,会导致脚本报错。
参考学习的文章中,后续代码实现并不是特别方便,比如需要用bash脚本去调用该python脚本实现循环解压压缩包、需要用bash脚本去单独读取flag文件。我们可以把代码进行一下优化。
这不是纯属给自己找事干吗?对,但这样做之后,你会更加熟练Python的很多操作,说不定哪天就用上了。我们平时刷题的目的是提高自己的综合能力,而不是拿到flag就完事了。
完整代码如下:
|
|
接下来,我们只需要执行下这个脚本就可以了。
执行完拿到的flag:
可以试着自己想下,如果不用上面的脚本,如何去读取1000文件夹里面的flag文件呢?
最后。举一反三,以后再遇到需要循环遍历解压压缩包的题目,直接掏出这个脚本来改改就能用了。