D3CTF 2022 Writeup¶
约 452 个字 143 行代码 10 张图片 预计阅读时间 3 分钟
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 度从左到右读取,发现大写标识,并且可以正常读取
人工读取:
base64 解码:
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年3月8日 23:22:31