跳转至

D3CTF 2022 Writeup

Abstract

D3(Vidar、L、CNSS)和 AntSRC 主办的比赛,misc 题目较少,但难度不低


BadW3ter

文件头:

将 CUY1nw31lai 改为 RIFFWAVEfmt 就可以正常打开播放

由题目中 deeper and deeper 推测使用 deepsound 进行隐写
使用 deepsound 配合 CUY1nw31lai 密码得到

明显是叠加后的坏掉的二维码,直接扫描

Never gonna give you up
Never gonna let you down
Never gonna give you up
Never gonna let you down
Never gonna give you up
Never gonna let you down
Never gonna give you up
Never gonna let you down
Never gonna give you up
Never gonna let you down
Never gonna give you up
Never gonna let you down

由于是 tiff 文件,会自带图层,删掉白色背景图层

套用幻影坦克代码:

import cv2
import numpy as np
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='提取幻影坦克')
    parser.add_argument('input', help='输入图')
    parser.add_argument('output1', help='输出隐藏的图')
    parser.add_argument('output2', help='输出直接展示的图')
    arg = parser.parse_args()

    img_in = cv2.imread(arg.input, cv2.IMREAD_UNCHANGED)

    if len(img_in.shape) < 3 or img_in.shape[2] != 4:
        parser.error('你的图片不含alpha通道!')

    b = img_in[:, :, 0].astype(np.float)
    g = img_in[:, :, 1].astype(np.float)
    r = img_in[:, :, 2].astype(np.float)
    a = img_in[:, :, 3].astype(np.float)

    out1 = np.zeros([img_in.shape[0], img_in.shape[1], 3])
    out2 = np.zeros([img_in.shape[0], img_in.shape[1], 3])

    out1[:, :, 0] = b * a / 255
    out1[:, :, 1] = g * a / 255
    out1[:, :, 2] = r * a / 255
    out2[:, :, 0] = 255 - (255 - b) * a / 255
    out2[:, :, 1] = 255 - (255 - g) * a / 255
    out2[:, :, 2] = 255 - (255 - r) * a / 255

    out1 = np.clip(np.floor(out1), 0, 255).astype(np.uint8)
    out2 = np.clip(np.floor(out2), 0, 255).astype(np.uint8)

    cv2.imwrite(arg.output1, out1)
    cv2.imwrite(arg.output2, out2)

得到

(或者直接在 PS 里改背景)

可以扫描出 flag:D3CTF{M1r@9e_T@nK_1s_Om0sh1roiii1111!!!!!Isn't_1t?}


WannaWacca

使用 Volatility 工具获取主机信息,通过 netscan 命令获取恶意软件进程号 1404

vol.py -f d3-win7-5f799647.vmem --profile=Win7SP0x64 netscan
vol.py -f d3-win7-5f799647.vmem --profile=Win7SP0x64 dumpfiles -Q 0x000000003dec4a70 --dump-dir=./Smart.exe

得到 SmartFalcon.exe

进行 upx 脱壳,之后再修改恶意软件的 ip (114.116.210.244) 信息到自己主机,通过给的 pcap 流量重放流量对压缩的 flag.zip 进行解压
对解密后的 flag.zip 用 bkcrack 通过 png 文件头进行已知明文攻击,得到 key:bd363f25 3a7da3aa 4bbe3175,解压 flag.zip 得到下图:

明显的彩色横条和背景苹果暗示,在苹果的 png 解析中会呈现不同的图像:

分别发现上边和右下角有意义不明的白色像素点

再由文件名 I can’t see any light 可以推测是盲文,并且特征明显可以翻译

上边的开头就是一个数字标识,尝试读取一点发现是 504B0304,zip 文件头,全部读取:

import numpy as np
from PIL import Image

img = Image.open("braille.png")
width, height = size = img.size
arr = np.array(img)

BLACK = np.array([0, 0, 0, 255])
WHITE = np.array([255, 255, 255, 255])

B00 = np.array([BLACK, BLACK])
B01 = np.array([BLACK, WHITE])
B10 = np.array([WHITE, BLACK])
B11 = np.array([WHITE, WHITE])

num_flag = 0

def convert(code):
    global num_flag
    if (code == np.array([B01, B01, B11])).all():
        num_flag = 1
        return "num"
    if (code == np.array([B10, B00, B00])).all():
        if num_flag:
            num_flag = 0
            return "1"
        else:
            return "a"
    if (code == np.array([B10, B10, B00])).all():
        if num_flag:
            num_flag = 0
            return "2"
        else:
            return "b"
    if (code == np.array([B11, B00, B00])).all():
        if num_flag:
            num_flag = 0
            return "3"
        else:
            return "c"
    if (code == np.array([B11, B01, B00])).all():
        if num_flag:
            num_flag = 0
            return "4"
        else:
            return "d"
    if (code == np.array([B10, B01, B00])).all():
        if num_flag:
            num_flag = 0
            return "5"
        else:
            return "e"
    if (code == np.array([B11, B10, B00])).all():
        if num_flag:
            num_flag = 0
            return "6"
        else:
            return "f"
    if (code == np.array([B11, B11, B00])).all():
        if num_flag:
            num_flag = 0
            return "7"
        else:
            return "g"
    if (code == np.array([B10, B11, B00])).all():
        if num_flag:
            num_flag = 0
            return "8"
        else:
            return "h"
    if (code == np.array([B01, B10, B00])).all():
        if num_flag:
            num_flag = 0
            return "9"
        else:
            return "i"
    if (code == np.array([B01, B11, B00])).all():
        if num_flag:
            num_flag = 0
            return "0"
        else:
            return "j"

for i in range(4):
    for j in range(960):
        now = arr[i*3:i*3+3, j*2:j*2+2]
        res = convert(now)
        if res != "num" and res != None:
            print(res, end="")

粘贴入 Hex Fiend,解压得到 Future will lead.txt 文件,是 The Ray of Light 歌词混入了一些 0x7F 字符

苹果解释器右下角的内容直接读取无法读出有效内容,考虑翻转 180 度从左到右读取,发现大写标识,并且可以正常读取

人工读取:

VGV4dF9ibGluZF93YXRlcm1hcmsgcHdkIGlzOiBSQHkwZjEhOWh0

base64解码:

Text_blind_watermark pwd is: R@y0f1!9ht

guofei9987/text_blind_watermark

from text_blind_watermark import extract
print(f"d3ctf{{{extract(open('Future will lead.txt', 'r').read(), 'R@y0f1!9ht').strip()}}}")

flag: d3ctf{b576241258a44b868ea25804b0ec1d4e}


最后更新: 2022年6月15日 16:45:09
创建日期: 2022年3月8日 23:22:31
回到页面顶部