BugKu: 粉色的猫

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个知识点,这道题让我受益良多,出题者水平真高啊!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值