前言
近期看到有人CSDN私信我,问我BugkuCTF的一道Misc题,那么今天在这里给大家解答一下这道“粉色的猫”,顺便开始一下我们CTF的旅程。
题目信息
题目名称:粉色的猫
题目作者: 想养一只粉色的猫
描 述: 猫猫不可爱嘛ヾ(≧▽≦*)o
解题过程
下载附件得到一个ZIP,看上去是加密过的,且排除了伪解密
压缩包的注释是DNA编码,我们解码一下
注意:这里有一个很严重的问题,我们会在文章最后进行说明
我们使用得到的压缩包密码CATISSOCUTE来解压这个ZIP,得到key.txt和1
我们先看key.txt
这是PDU编码,我们解密一下(温馨提示:这里一定要一行一行去解)
得到包含PNG文件头的一段16进制
89504E470D0A1A0A0000000D494844520000004700000008080200000
参考一下,把下面的几行都解一下,得到
89504E470D0A1A0A0000000D494844520000004700000008080200000024DC75F1000000BC49444154785EDD92411285300843B919F73F159F84FA8712176E745126E3D4A62D7955B388211799BB2EAB95A6B3BBE7B60993EE63F26FDD1BCDAB30331FE5E6D9375B06566A210A3AB71D8E3D72101DB491696801324F8EF284EB35C0FB64EF100A1BA0C20DDEB84A2BD8B58B39EAC6E0AB108D6D6F44CFD81D03B694BC94C2313D4F689916D626A7958F5CD959BE28C443AE76C10588028592961BFCD40D157F1341389CFAB6AE5F2308775E81EB2030C0504751D9FA4EEF22FD007DED5B68A315FD110000000049454E44AE426082
写到文件中
对图片用stegsolve进行一下反色操作
这个是piet编码,可以用在线网址进行求解,也可以用npiet求解,这里用在线的
因为该工具使用起来还是得慢慢摸索的,这里就不对原理做过多解释
如果大家感兴趣的话,后续我会专门出一期关于piet编码的文章供大家研究
打开在线网站,点击import导入一下反色后的图片
然后点击右边的DEBUGGER,然后点击蓝色按钮
等待步入到最后即可得到a=13和b=14,这应该是猫脸变换的参数,但是没什么信息了,突然发现还有一个文件,我们看看它
这是一个BPG图像,把它用工具解码一下
这里我更加确定是猫脸变换了,百度随便搜了个猫脸变换脚本,改一下ab就行,贴一下:
import matplotlib.pyplot as plt
import cv2
import numpy as np
from PIL import Image
it = cv2.imread('input.png')
def arnold_decode(image, shuffle_times, a, b):
a=13
b=14
# 1:创建新图像
decode_image = np.zeros(shape=image.shape)
# 2:计算N
h, w = image.shape[0], image.shape[1]
N = h # 或N=w
# 3:遍历像素坐标变换
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
# 按照公式坐标变换
new_x = ((a * b + 1) * ori_x + (-b) * ori_y) % N
new_y = ((-a) * ori_x + ori_y) % N
decode_image[new_x, new_y, :] = image[ori_x, ori_y, :]
cv2.imwrite('flag.png', decode_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
return decode_image
arnold_decode(it, 1, 121, 144)
运行之后就得到了flag的图片
flag{c159549a-5604-4bb7-8a6e-9db9d8b1426a}
吐槽环节
题目的第一步,也就是DNA编码那步存在很严重的问题,我找到了一篇blog
注意看Update 5中作者提到以上这段话
In constructing the codon-to-english conversion table I had to decide if I wanted to go with the standard coding (e.g. letting GTC which codes for alanine represent A) or make up a random encoding.
我们机翻一下,可以得到如下内容:
在构建密码子到英语的转换表时,我必须决定是否要使用标准编码(例如,让 GTC 的丙氨酸编码代表 A)或组成随机编码。
换句话说,就是该工具中的替换表完全是随机生成的,因此密文本身没有任何的道理可言,唯一解决这道题目的方法就是就去找到作者使用的工具。所以如果用espasy的DNA解码工具是无法正常解开的。看到这里可能大家也不想说什么了,那么我们就保持微笑就好。