SHACTF-2017-WannaFly-writeup。虽然只有100分,不过比国内一些比赛的题目质量好多了。
题目
|
|
分析
镜像
题目压缩包下载下来后解压有一个img镜像文件。用DiskGenius载入后浏览文件。
文件.bash_history
内容如下:
文件...
内容是一个python脚本,这边先不放出来,放在后面分析用。这里有个坑,DiskGenius是在win平台下的,直接把这个文件导出来后,win系统无法识别点开头的文件根本无法打开,也不能删除。我的方法是把这个导出来的文件先用压缩包压缩后,在压缩包中进行一下重命名,之后再解压缩出来。
在Picture文件夹里有一些被加密后的图片。如下:
深入分析
前面我们得到了...
文件,其内容如下:
可以看出这是一个加密脚本。其调用过程如下:
- 调用find_images()找到png文件,
- 先根据png文件生成一张“模糊”的图片并保存到sha.png中,
- 接着调用encrypt_image(img)。
- 先把原图片进行了一次encrypt()加密,得到encrypted_img
- 读取之前生成的sha.png文件,作为blurred_img
- 将blurred_img + “\n” + encrypted_img 的内容写入图片文件。
用十六进制编辑器打开可以验证。图片中0A
即为10,这是”\n”的的十六进制表示。之前的数据即为blurred_img,之后的数据即为encrypted_img。
接下来我们看看怎么进行encrypt()函数。encrypt()加密使用了AES加密。要对密文解密的话,我们可以调用decrypt(m, p, i),这需要三个参数,m即加密后的数据,p即密钥,i即偏移量。
m是加密后的数据,直接打开图片进行提取就行。
p是密钥。在运行脚本是通过命令行参数读入。结合之前得到的.bash_history
中的chmod +x ...
./... Hb8jnSKzaNQr5f7p
,我们推测Hb8jnSKzaNQr5f7p
即为密钥。
i是偏移量,通过get_iv()生成。其中使用int(time())来作为生成伪随机数的种子。图片的修改时间是可以获得的。所以i,我们也得到了。
exp
脚本如下:
其中old_img_time = os.stat(i).st_mtime
,是为了获得图片的修改时间。
运行后会得到一些图片。其中一张如下:
得到flag: