# Xcode v5.8

文本中得到

1
hAXBCEaBZMLZNJbRAQnNlOZdARqFAB1QpKa7IF4F5R1ElBKErIKpFQZNcNEc+

看编码的构造结构和题目提示 xcode,猜测为 xxencode 编码,随波逐流解码得

1
23NBceayYVwLs6qjZLwdL475ZbTDdGt415d7QmQrVhe

v5.8 提示为 base58,解码得到 flag

DASCTF{The_new_encode_master!!}

# Ez_Signin

解压附件得到加密压缩包

ARCHPR 爆破

得到密码:11452

将文本中的内容进行 base32 解码得到按键精灵的脚本

将脚本复制到按键精灵的源文件界面

F10 运行发现鼠标画出了 flag 字样,于是打开画板运行得到 flag

如果将脚本运行到最后能发现 flag 是被删除了一部分的,在这个花括号 F12 停止即可

flag{8f16a9717824aa456eb9a98653eb3993}

# NewGrating

这题在比赛中并没出,有点小遗憾,赛后把最后的光栅图了解了一下,记录一下

解压得到流量包,总共七个流,不算多,一个个翻翻看

在 0 流得到了冰蝎的马,同样得到了冰蝎的 key,e46023a69f8db309,并且流量是冰蝎 3 的 CBC 模式的 AES 加密。默认 iv 为 0123456789abcdef

随便拿流 2 的请求包试试,成功解密

接下来解密发现流 2、3 都没有什么作用,看到关键的流 4,流量比较大,追踪 tcp 会有点卡,并且返回包会被自动解码,这里建议追踪 http 并且放入 vscode 进行复制解码

比赛的时候发现自己写的 gui 跑不了这么大的数据,就只能手搓脚本了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import base64
from Crypto.Cipher import AES



def aes_cbc_decrypt(key, iv, encrypted_text):
try:
encrypted_text = base64.b64decode(encrypted_text)
cipher = AES.new(key, AES.MODE_CBC, iv)

decrypted_text = cipher.decrypt(encrypted_text)
unpadded_text = _unpad(decrypted_text)

return unpadded_text.decode('utf-8')
except Exception as e:
return str(e)



def _unpad(text):
pad = text[-1]
return text[:-pad]
KEY = "e46023a69f8db309"
IV = "0123456789abcdef"
key = KEY.encode('utf-8')
iv = IV.encode('utf-8')
encrypted_text = input("ENCRYPTDATA:")
decrypted_text = aes_cbc_decrypt(key, iv, encrypted_text)
print(decrypted_text)

new = open('out.txt','w')
new.write(decrypted_text)

为了复制大数据方便就给他输出到文本当中了
在第二个请求包的

将 content 字段解码得到了 password.png

同样在第 5 个请求包解码得到了 7z 压缩包

分别导出,发现压缩包需要密码,需要解密图片拿到密码

该图片是五帧的光栅图,也就是五个图层通过位移、消除操作合并成的一张图片

关于这个 5 层是怎么来的现在所知道的只有试,本质上就是隔 n 个像素提取 1 列进行组合看看能不能拼成可识别的图形

# 方法一:

知道了原理之后利用脚本进行提取(均为赛后别的师傅的脚本,来利用学习):

一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from PIL import Image
import numpy as np

img = Image.open('Password.png').convert('L')
width, height = img.size
img_data = np.array(img)
start = 1
interval = 5
for i in range(start, width, interval):
img_data[:, i:i+interval-1] = 0
Image.fromarray(img_data)

new_image = Image.fromarray(img_data)
new_image.save('processed_image.png')

二:

1
2
3
4
5
6
7
8
from PIL import Image
import numpy as np

img = np.array(Image.open('Password.png'))
for i in range(5):
z = np.zeros_like(img)
z[:, i::5, :] = img[:, i::5, :]
Image.fromarray(z).show()

以上两个脚本都能正确分离出五帧光栅图,使用的均是相隔 5 个像素进行提取的方法

# 方法二:

去了解一下光栅图的制作方法可以知道,光栅图其实就是利用了人的肉眼补全原理,加上多张文字的消除、偏移、重叠而成。重叠之后人的肉眼无法辨别而达到一个隐藏的作用,因此可以根据光栅与帧数的公式去制作光栅,使人的肉眼能够辨别每一帧的字符,达到一个 "分离" 的效果

1
(黑色像素宽度+白色像素宽度)/ 白色像素宽度 = 帧数

因此这里使用 PS 制作黑色为 4 像素,白色为 1 像素的光栅

移动光栅能得到全部的 5 帧文字

得到 password:PPeRLR6SEmHGC

解开压缩包得到 flag

DASCTF{d68b6013-d70a-4ada-926d-68fe3265360a}

总结:这次比赛的 misc 题有点少,前面两题一般,最后的光栅图挺有意思的