BugKu: 粉色的猫
1.获取压缩包密码
能发现只有4种字符AGCT
所以是DNA 碱基序列编码
使用在线解码网站,戳我
压缩包的解压密码为:CATISSOCUTE
2.分析文件
010editor 打开 1 这个文件,文件头为BPG,所以他是BPG格式的图片,该格式详细信息看百度百科
把文件后缀名改成bpg,然后使用 bpg-0.9.8-win64
,下载链接,戳我
出现了图片,但是我们从图片中,根本获取不到任何有用信息。
所以我们调转枪头,去打开key.txt
,如图:
打开解码网站:http://www.sendsms.cn/pdu/
我们发现都是0001000D9
,可以猜测有可能是PDU编码
,这个规律是我发现的,但是如果这几个不是默认的,那0001000D9
这个特征就不会存在了。所以以后碰到0001000D9拿到16进制转ascii没有什么线索,可以尝试PDU编码。
现在我们开始一行一行解码:
可以发现89504E47这明显就是PNG的文件头的16进制,我们解密好所有的行,拼接在一起,然后再保存为图片,这个过程太简单跳过。
图片如下:
这张图片就引出了一个编程语言,叫Piet,详细资料请看:百度百科
不想看的,你就理解为20种颜色进行的编程。所以我们现在就需要去运行这个图片代码。
但是,在去运行这个图片代码之前,我们需要把图片反色一下。
可以看到百度百科的Piet图片颜色背景是白色,而我们拿到的图片颜色背景是黑色。所以需要反色一下,使用Stegsolve.jar进行反色操作。
反色后的图片如下:
现在我们打开在线运行Piet语言网站,戳我
先import
导入图片,然后再点右边的DEBUGGER
然后点绿色的按钮运行Piet语言。
最终得到key:a=13 b=14
3.Arnold变换(猫脸变换)
a=13, b=14,结合我们的1.bpg的图片样貌,所以认为是Arnold变化,所以我们现在就是要获取变化之前的图片。
借鉴了该文章的代码,链接,并进行了一些修改,为了是方便使用。
代码如下:
import cv2
import argparse
import numpy as np
parser = argparse.ArgumentParser()
parser.add_argument('-t', type=str, default=None, required=True, choices=["encode", "decode"],
help='encode | decode')
parser.add_argument('-f', type=str, default=None, required=True,
help='输入文件名称')
parser.add_argument('-a', type=int, default=None, required=True,
help='输入参数a')
parser.add_argument('-b', type=int, default=None, required=True,
help='输入参数b')
args = parser.parse_args()
def isSame(img):
r, c = img.shape
if r != c:
print("图片宽高不一致!")
return False
return True
def arnold(img, a, b):
r, c = img.shape
p = np.zeros((r, c), np.uint8)
for i in range(r):
for j in range(c):
x = (i + b * j) % r
y = (a * i + (a * b + 1) * j) % c
p[x, y] = img[i, j]
return p
def dearnold(img, a, b):
r, c = img.shape
p = np.zeros((r, c), np.uint8)
for i in range(r):
for j in range(c):
x = ((a * b + 1) * i - b * j) % r
y = (-a * i + j) % c
p[x, y] = img[i, j]
return p
img = cv2.imread(args.f, flags=0)
if isSame(img):
if args.t == "encode":
img = arnold(img, a=args.a, b=args.b)
elif args.t == "decode":
img = dearnold(img, a=args.a, b=args.b)
cv2.imshow("images", img)
cv2.waitKey(0)
我们之前只是查看了BPG图片的样貌,并没有进行保存,现在我们使用。
软件运行目录会出现out.png,现在我们获得到了PNG格式的图片,我们现在就可以使用猫脸变化代码进行变化回之前的样貌。
使用之前获取的a=13, b=14,还有刚刚获得的out.png,我们成功拿到了flag!
flag{c159549a-5604-4bb7-8a6e-9db9d8b1426a}
完结,拜拜!
总结:
这道题目涉及到了DNA编码, BPG图片格式,PDU编码,Piet编程语言,猫脸变化
,一共是5个知识点,这道题让我受益良多,出题者水平真高啊!