NSSCTF刷题
NSSCTF
[NSSRound#12 Basic]坏东西
下载后得到一个压缩包

解压时发现被加密了,经过验证后发现并不是伪加密,暴力破解后得到密码为99020
发现还是压缩包,继续爆破密码后得到密码为38940,然后继续是压缩包套娃,不知道多少个压缩包.....但是我们可以知道每次的解压密码都是文件名,于是我们就可以写一个脚本进行批量解压,将脚本放到下载的99020.zip文件目录下用python运行即可
import zipfile
name = '99020'
while True:
fz = zipfile.ZipFile(name + '.zip', 'r')
fz.extractall(pwd=bytes(name, 'utf-8'))
name = fz.filelist[0].filename.rstrip('.zip')
print(fz.filelist[0].filename)
fz.close()
运行之后就得到了一堆压缩包和一个pdf文件
然后发现打不开这个pdf文件(果然如题目所说是个坏东西.....),用010打开后发现了一些东西

一个一个提取出来后就得到了flag:NSSCTF{25da50b7993c0db55867a5a51f32f35c}
[NSSRound#3 Team]funnypng
下载题目附件,得到一张图片,如下:
利用StegSolve进行分析发现在这个图片的Red 0通道处发现半张二维码,另一半好像是被隐藏了
然后通过查看文件详细信息,发现这张图片的位深度为48
因此可以说明在48位PNG中,每个颜色通道(R/G/B)是16位的(0-65535),但通常实际数据可能仅使用高8位(前256级),而低8位可能隐藏信息。
利用脚本进行图片的低8位通道提取
import png
file = input('请输入16位通道png文件路径:')
img = png.Reader(file)
imginfo = img.read()
print(imginfo)
w, h, imgdata = imginfo[:3]
data = []
for linedata in imgdata:
line = []
for d in linedata:
line.append(d%(2**8))
data.append(line)
outfile = input('请输入输出文件路径:')
with open(outfile+'front.png', 'wb') as f:
img2 = png.Writer(width=w, height=h, greyscale=False, bitdepth=8)
img2.write(f, data)
print('低8位通道分离完成, 请查看文件: %sfront.png'%outfile)
将分离出来的图片放到StegSolve里面继续分析,可以看到在Blue 0通道有另外一半二维码
可以利用截图工具将两个半张二维码进行截获保存,然后利用在线图片合并工具进行两张图片合并
发现这张二维码有小部分被黑团团遮挡住了,通过了解可以利用这个网站进行破损的二维码读取:QRazyBox - QR Code Analysis and Recovery Toolkit
进入网站选择这个进行二维码导入
选择Tools功能
使用第一个工具
然后就可以进行'破损的'二维码信息读取
最终得到flag:NSSCTF{fbef863db8331e8c63f73d7a04c1cf5b}
|
*PNG图片的位深度知识拓展:
PNG图片的位深度(Bit Depth)是指图像中每个像素通道(如红、绿、蓝或灰度)用来表示颜色信息的二进制位数。它直接影响图像的色彩丰富度、渐变平滑度和文件大小。以下是位深度的具体作用:
1. 决定颜色数量
- 位深度越高,可表示的颜色越多。例如:
- 8位/通道(如24位真彩色PNG):每个通道(R/G/B)有256种可能值(2⁸),组合后约1677万种颜色(256³),适合普通照片。
- 16位/通道(如48位PNG):每通道65536种值(2¹⁶),颜色数量远超人类视觉分辨能力,适合专业摄影或医学成像。
- 1位(二值图):仅黑白两色,用于简单图形(如LOGO)。
2. 影响渐变平滑度
- 低位深度可能导致色带(Banding),即在颜色过渡区域出现阶梯状断层。高位深度(如16位)能呈现更细腻的渐变,尤其在阴影或天空等平滑区域。
3. 透明度控制(Alpha通道)
- PNG支持透明度,其Alpha通道的位深度决定透明度的精细度:
- 8位Alpha:256级透明度(半透明效果自然)。
- 1位Alpha:仅完全透明或不透明(如简单剪贴画)。
4. 文件体积
- 位深度越高,单个像素数据量越大,文件体积也越大。例如:
- 24位PNG(8位/通道)比48位PNG(16位/通道)体积小一半。
- 但PNG采用无损压缩,实际体积可能比理论值小。
5. 专业用途需求
- 医学/科研图像:需要16位保存高动态范围数据。
- HDR或后期处理:高位深度避免编辑时信息丢失。
- 网页/UI设计:通常8位足够,兼顾质量和加载速度。
常见PNG位深度示例:
| 位深度 | 类型 | 典型用途 |
|---|---|---|
| 1位 | 二值图(黑白) | 图标、简笔画 |
| 8位(索引色) | 256色 | 低色彩图形(如GIF替代) |
| 24位(8位/通道) | 真彩色(RGB) | 普通照片、网页图片 |
| 32位(8位/通道+Alpha) | RGB+透明度 | 复杂透明效果(如UI元素) |
| 48位(16位/通道) | 高动态范围RGB | 专业摄影、印刷 |
[NSSRound#12 Basic]Bulbasaur
下载附件解压得到一张图片和一个加密压缩包
根据题目提示,利用盲水印工具WaterMark.exe进行图片盲水印提取,可以发现里面有一串字符,也就是压缩包密码:blind watermark
然后解压压缩包,打开文档
利用随波逐流CTF编码工具进行阴阳怪气解密
得到flag:NSSCTF{W@t3rMaRk_1s_s0000000_35s9}
[MoeCTF 2022]usb
将流量包直接放到CTF流量一键分析里面可以直接提取到usb流量
moectf{<CAP>l<CAP>earnee<DEL>d_a6ou7_<CAP>usb<CAP>_tr@ffic}
然后根据<CAP>和<DEL>进行字母的大写和删除可以得到flag:moectf{Learned_a6ou7_USB_tr@ffic}
最终提交为NSSCTF{Learned_a6ou7_USB_tr@ffic}
[鹏城杯 2022]简单取证
下载附件解压得到一个file.raw文件
这里可以使用ctftools_all_in_one的取证工具或使用单独的volatility工具
1、先查看内存摘要,获取操作系统名称
ctftools_all_in_one:
volatility:
命令:
.\volatility.exe -f .\file.raw imageinfo

2、扫描内存中所有文件
ctftools_all_in_one:
在一堆文件中找到了一张jpg图片文件
volatility:
命令:
.\volatility.exe -f .\file.raw --profile=WinXPSP2x86 filescan > filescan.txt
运行命令后回到工具文件夹中打开filescan.txt可以看到扫描结果
3、提取地址为0x0000000002325028文件
ctftools_all_in_one:
volatility:
命令:
.\volatility.exe -f .\file.raw --profile=WinXPSP2x86 dumpfiles -Q 0x0000000002325028 --dump-dir=./

显示这个就表示下载成功了,回到工具目录可以看到下载的文件名为:file.None.0x81fc6610.dat,然后用vsc或记事本打开会发现一大串的base64加密,用Cyberchef解密一下可以看到这个内容类似一个翻转的zip文件
保存base64解密的文件后,用脚本进行字节翻转得到一个zip压缩包
s = input("请输入文件路径:")
a = open('%s' % s, 'rb')
b = open(s + '.zip', 'wb')
b = b.write(a.read()[::-1])
运行python代码后输入你保存下来的解码文件地址,就可以得到一个zip文件,解压时可以发现文件被加密了
查看cmd历史命令获取密码
ctftools_all_in_one:
volatility:
命令:
.\volatility.exe -f .\file.raw --profile=WinXPSP2x86 cmdscan

得到密码为:62b041223bb9a
坐标绘图
解压压缩包得到flag.txt文件,但是里面是一堆坐标,这个时候就需要用python脚本进行绘图,需提前安装matplotlib库
pip install matplotlib
脚本如下:
import matplotlib.pyplot as plt
def read_coordinates(file_path):
try:
with open(file_path, 'r') as file:
lines = file.readlines()
x_coords = []
y_coords = []
for line in lines:
x, y = map(int, line.strip().split(' ')) #split里面的字符为坐标之间的符号,比如x,y为',',x y为' '
x_coords.append(x)
y_coords.append(y)
return x_coords, y_coords
except FileNotFoundError:
print("错误: 文件未找到!")
except ValueError:
print("错误: 文件内容格式不正确!")
except Exception as e:
print(f"错误: 发生了一个未知错误: {e}")
return [], []
def plot_coordinates(x_coords, y_coords):
if x_coords and y_coords:
#更改s数字可以改变点大小
plt.scatter(x_coords, y_coords,s=5)
plt.xlabel('X 坐标')
plt.ylabel('Y 坐标')
plt.title('坐标点图')
plt.grid(True)
plt.show()
if __name__ == "__main__":
# file_path = 'coordinates.txt'
file_path = input("请输入文件路径: ")
x, y = read_coordinates(file_path)
plot_coordinates(x, y)
运行脚本,将坐标txt文件路径输入之后,就可以得到根据坐标绘制的图片了
扫描二维码得到flag
根据平台要求,最终flag为:NSSCTF{a6b93e36-f097-11ec-a9b2-5254002d2b31}

浙公网安备 33010602011771号