[Misc]2022DASCTF Apr X FATE 防疫挑战赛 wp

1. 熟悉的猫

解压得到两个文件

flag.zip 需解压密码 先放着

kdbx 文件用 keepass 读 也是要密码

len5 猜测是爆破 crunch 生成 5 位字典

hashcat 爆破 // 也有用 passware 的 有兴趣可以自行尝试

ps: 这里还蛮有意思的 刚开始用虚拟机跑 报错硬件问题跑不了 拿到真实机跑了一小会 风扇蹭蹭转还挺爽

跑出密码 13152

里面的内容是jbRw5PB2kFmor6IeYYil,用该密码解压压缩包。得到一个 hint 和一张图片

image-20220424220529961

ps: 图像加密要了老命 当时不清楚具体是什么加密方式 到这里就干不下去了

根据图片特征和题目,猜测为猫脸变换,这里只给了一串数字根据积累能联想到可能有两种解密的方式。

均尝试后发现没有反应或者报错,因此我想用脚本解。发现出题人塞了个零宽进去

这里给了一个 22*160,试了下发现不是猫脸的参数,因此尝试去解 k,用 tupper 自指发现貌似有点规律

搜个脚本 改下参数

   def Tuppers_Self_Referential_Formula():
    k = 92898203278702907929705938676672021500394791427205757369123489204565300324859717082409892641951206664564991991489354661871425872649524078000948199832659815275909285198829276929014694628110159824930931595166203271443269827449505707655085842563682060910813942504507936625555735585913273575050118552353192682955310220323463465408645422334101446471078933149287336241772448338428740302833855616421538520769267636119285948674549756604384946996184385407505456168240123319785800909933214695711828013483981731933773017336944656397583872267126767778549745087854794302808950100966582558761224454242018467578959766617176016660101690140279961968740323327369347164623746391335756442566959352876706364265509834319910419399748338894746638758652286771979896573695823608678008814861640308571256880794312652055957150464513950305355055495262375870102898500643010471425931450046440860841589302890250456138060738689526283389256801969190204127358098408264204643882520969704221896973544620102494391269663693407573658064279947688509910028257209987991480259150865283245150325813888942058
   # 这里替换为你自己的K值

def f(x, y):
    d = ((-22 * x) - (y % 22))
    e = reduce(lambda x, y: x * y, [2 for x in range(-d)]) if d else 1
    g = ((y // 22) // e) % 2
    return 0.5 < g

for y in range(k + 21, k - 1, -1):
    line = ""
    for x in range(0, 160):
        if f(x, y):
            line += " ■"
        else:
            line += "  "
    print(line)
    if __name__ == '__main__':
    Tuppers_Self_Referential_Formula()

跑出 121 144 两个参数

image-20220424230333655

然后再用猫脸脚本去解,改下参数

import cv2
import numpy as np

def arnold_decode(image, shuffle_times, a, b):
    """ decode for rgb image that encoded by Arnold
    Args:
        image: rgb image encoded by Arnold
        shuffle_times: how many times to shuffle
    Returns:
        decode image
    """
    # 1:创建新图像
    decode_image = np.zeros(shape=image.shape,dtype=int)
# 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, :]
return decode_image

img = cv2.imread("flag.png")  #变换的图片
a = 121
b = 144
st = 1
pic = arnold_decode(img,st,a,b)
cv2.imwrite('flag2.png',pic)  #保存得到的图片

得到 flag 图片

DASCTF{751476c0-6cff-497f-9541-83ede0ebc5a0}

反思:

**1. 题名熟悉的猫 -> 猫脸置换 **

2. 积累 -> tupper 自指 零宽隐写 新工具使用

2.SimpleFlow

开局一个流量包

ctrl+f:flag 碰碰运气 查到有 flag.txt 和 flag.zip 两个文件

image-20220426193454093

image-20220426194309303

包进 foremost 提取出 flag.zip 解压需密码

回到 flag.txt 的 tcp 流 -> 追踪 tcp 流

image-20220426194510530

image-20220426194717136

拿到密码 压缩包里拿到 flag

3. 冰墩墩

image-20220501153307230

十万个文件 随便打开几个看看

image-20220501153529635

里面发现 start.txt 应该是从这里开始

image-20220501153828550

发现前部分得数据是15位,左边补零转 16 进制得0x504B,能想到是压缩包,写了个脚本逐个读取文件,将数据拼接并写入文件。用到 zfill

zfill 的功能

  • 为字符串定义长度,如不满足,缺少的部分用 0 填补

zfill 的用法

  • 用法:newstr = string.zfill(width)
  • 参数:width新字符串希望的宽度

zfill 的注意事项

  • 与字符串的字符无关
  • 如果定义长度小等于当前字符串长度,则不发生变化
import re

path = 'D:\\BinDunDun\\'

regex_next = "is (.*?\\.txt)"
regex_data = "(.*?) =>"
next_file = 'start.txt'
final_data = ''
while True:
    context = open(path + next_file).read()
    try:
        file_data = re.findall(regex_data, context)[0]
        data = file_data.zfill(16)
        final_data += data
    except Exception as e:
        print(context)
        print('no data!')
    try:
        next_file = re.findall(regex_next, context)[0]
        if next_file == 'end.txt':
            break
    except Exception as e:
        print(context)
        print('no next!!')
        break

print(final_data)
with open(path+'final.zip','wb') as fp:
    fp.write(int(final_data,2).to_bytes(len(final_data),'big'))
fp.close()

跑完得到压缩包

image-20220501155252536

WINHEX 看一下

image-20220501155438327

改 FFD8FF 拿到 jpg 是个冰墩墩

** 用剑龙逆一下 pyc 文件 **

python .\stegosaurus.py -x .\BinDunDun.pyc

得到BingD@nD@n_in_BeiJing_Winter_Olympics

** 用 jphs05 解出 **REFTQ1RGe0dvb2RfSm9kX0dpdmVfVGhlX0ZGRkZMQGdfVG9fWW91IX0

base64 解码得到 flag