2021”西湖论剑”网络安全大赛Writeup

我只写了自己做的部分,完整WP请访问下载:https://www.yuque.com/docs/share/4c901b3e-a9c4-4e67-9d1c-3030108ca4a0?#

密码:slhq

Web

详见fmyyy师傅:https://blog.csdn.net/fmyyy1/article/details/121451279?spm=1001.2014.3001.5501

Misc

真·签到

1637411942668.png

扫码关注公众号,发送语音即可

1637412040770.png

flag:

1
DASCTF{welc0m3_t0_9C51s_2021}

YUSA的小秘密

1637412134972.png

这题跟去年的ByteCTF的Hardcore Watermark 01几乎一模一样,官方wp链接:https://bytectf.feishu.cn/docs/doccnqzpGCWH1hkDf5ljGdjOJYg#

这题采用的不是RGB通道的LSB隐写,而是采用的YCrCb通道。通过 cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)对 img 图片数据进行色彩空间转换,即可得到三个通道的数据,然后对三个通道的数据分别根据奇偶做二值化处理并保存为图片

1
2
3
cv.imwrite('a.png', (a % 2) * 255)   #对三个通道中的数据分别根据奇偶做二值化处理,并分别保存为图片
cv.imwrite('b.png', (b % 2) * 255)
cv.imwrite('c.png', (c % 2) * 255)

所以完整脚本如下:

1
2
3
4
5
6
7
8
from cv2 import *
import cv2 as cv
img=cv2.imread('C:\\Users\\YiJiale\\Desktop\\yusa\\yusa.png')
src_value=cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
a, b, c = cv.split(src_value) #使用cv.split分离通道
cv.imwrite('a.png', (a % 2) * 255) #对三个通道中的数据分别根据奇偶做二值化处理,并分别保存为图片
cv.imwrite('b.png', (b % 2) * 255)
cv.imwrite('c.png', (c % 2) * 255)

运行后会得到三个通道的图片,在其中a.png即可清晰看到flag

1637412807049.png

flag:

1
DASCTF{2947b683036d49e5681f83f7bc3fbb34}

Yusa的秘密

1637424793366.png

下载附件,发现这是一个内存取证的题目,先用命令获取一下 内存镜像的进程

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 psxview

1637424921400.png

这些进程都分析了一下,发现有StikyNot.exe进程,这是windows的便签程序,可以尝试寻找snt文件来查看便签的内容。这里就直接来用filescan查找文件,用windows的findstr命令筛选一下,先查看下压缩包

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 filescan | findstr /r 'zip'

1637425450076.png

有一个key.zip。直接使用命令dump下来,重命名为1.zip

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003f3356f0 -D C:\Users\YiJiale\Desktop\取证

里面是一个exp文件,但是压缩包加密了,需要寻找密码

1637425753563.png

刚刚查找进程提到过便签的进程,这里来尝试查找一下snt文件

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 filescan | findstr /r "snt"

1637425925981.png

发现了便签文件,我们将他dump下来查看

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003fb306e0 -D C:\Users\YiJiale\Desktop\取证

将其重命名为StickyNotes.snt,用记事本打开是看不到上面东西的,既然数win7的便签,我们就将其传入win7虚拟机尝试打开(这里因为VMware tools始终无法装上,便采用QQ传输文件),后来发现 家庭普通版的Win7居然没有便签这个程序,我是Win11,没有便签程序,于是我尝试下Win10虚拟机

将snt文件放入C:\Users\YiJiale\AppData\Roaming\Microsoft\Sticky Notes\路径下,然后打开便签程序,便可以得到

1637427225748.png

得到了一个密码:世界没了心跳

1637463775207.png

用这个密码成功打开刚刚的exp的压缩包,得到exp文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from PIL import Image
import struct
pic = Image.open('key.bmp')
fp = open('flag', 'rb')
fs = open('Who_am_I', 'wb')

a, b = pic.size
list1 = []
for y in range(b):
for x in range(a):
pixel = pic.getpixel((x, y))
list1.extend([pixel[1], pixel[0], pixel[2], pixel[2], pixel[1], pixel[0]])

data = fp.read()
for i in range(0, len(data)):
fs.write(struct.pack('B', data[i] ^ list1[i % a*b*6]))
fp.close()
fs.close()

通过分析exp可以发现,目前还缺少两个文件便可以得到flag文件,分别是Who_am_I和key.bmp文件

这里Who_am_I,既然是Yusa的秘密,那用户应该就是Yusa了,使用命令来获取一下用户名的hash密码

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 hashdump

1637464309636.png

使用Passware Kit 13来破解Yusa用户的密码

打开软件,点击Memory Analysis功能,再选择Windows User功能

1637464545529.png

发现得到了密码为:YusaYusa520

成功打开了Who_am_I的压缩包得到了Who_am_I文件,题目描述中出现了Sakura组织,所以这里也查找一下相关文件

1637466204940.png

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 filescan | findstr /r "Sakura"

1637464733259.png

这里得到的部分结果含有中文,在Windows里就乱码了,不过不影响,我们dmup一下第一个文件Sakura-didi,并且重命名为2.zip

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003e58ada0 -D C:\Users\YiJiale\Desktop\取证

1637464854355.png

打开压缩包,里面确实是key.bmp文件,但是还是需要密码,接下来就只需要去找密码了

联想到一开始分析进程的时候,除了便签程序,还有一个平时很少遇到过的wab.exe,这是通讯录的程序,我们试着找一下其中的联系人,联系人contact文件,用filescan搜索一下

1
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 filescan | findstr /r "contact"

一共得到了两个联系人的文件,分别是Yusa.contact和Mystery Man.contact

1637465024818.png

我们分别dump下来分析一下

1
2
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003e748f20 -D C:\Users\YiJiale\Desktop\取证
vol.exe -f Yusa-PC.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003fa09070 -D C:\Users\YiJiale\Desktop\取证

1637465148182.png

打开里面是base64编码,解码得到一张Yusa的bmp图片

1637465411780.png

但这并不是我们想要的东西,接着看另一个联系人文件

1637465478346.png

1637465525384.png

发现是base32编码,后面还有一段base,接着解密

1637465564465.png

得到了key:820ac92b9f58142bbbc27ca295f1cf48,这应该就是key.bmp的密码了

1637465616737.png

成功得到了,接着把文件都跟刚刚的exp放同一个目录下尝试运行

1637465751966.png

运行完成后,并没有看到flag,后来发现,flag跟Who_am_I文件需要在exp中互换一下位置

因为刚刚运行了一下导致Who_am_I为空了,所以这里重新导入Who_am_I文件,运行一下,得到了一张gif图,我们改一下后缀,发现是在放烟花

1637465939274.png

逐一分帧查看后得到了flag

1637465983256.png

flag:

1
DASCTF{c3837c61-77f1-413e-b2e6-3ccbc96df9f4}

Cry部分

密码人集合

1637414335412.png

直接nc上去,得到一副矩阵,上面有我要拿西湖论剑第一的字样,看起来很像数独游戏

1637413230500.png

我要拿西湖论剑第一转化为1-9的数字,找一个在线网站填上去

在线网址:https://shudu.gwalker.cn/

1637413827435.png

得到结果后,按照先读小方格再读大方格的顺序依次写出来,得到

1
629153478457268391183947526315946782846172935279358614561894237789523614432761895

然后再把这些数字按照刚刚的转换顺序,再转回汉字,写个小脚本

1
2
3
4
5
6
7
8
9
10
11
12
num=[6,2,9,1,5,3,4,7,8,4,5,7,2,6,8,3,9,1,1,8,3,9,4,7,5,2,6,3,1,5,9,4,6,7,8,2,8,4,6,1,7,2,9,3,5,2,7,9,3,5,8,
6,1,4,5,6,1,8,9,4,2,3,7,7,8,9,5,2,3,6,1,4,4,3,2,7,6,1,8,9,5]
for i in num:
if i == 1:print('我',end='')
if i == 2:print('要',end='')
if i == 3:print('拿',end='')
if i == 4:print('西',end='')
if i == 5:print('湖',end='')
if i == 6:print('论',end='')
if i == 7:print('剑',end='')
if i == 8:print('第',end='')
if i == 9:print('一',end='')

1637414178312.png

运行得到:

1
论要一我湖拿西剑第西湖剑要论第拿一我我第拿一西剑湖要论拿我湖一西论剑第要第西论我剑要一拿湖要剑一拿湖第论我西湖论我第一西要拿剑剑第一湖要拿论我西西拿要剑论我第一湖

把这个粘贴回虚拟机里,Enter一下,即可得到flag

1637414261593.png

flag:

1
DASCTF{043d3b517abe53a8c8a815e56e9cda6f}