NSSCTF刷题

NSSCTF


[NSSRound#12 Basic]坏东西

image-20241211141152594

下载后得到一个压缩包

image-20241211191639481

解压时发现被加密了,经过验证后发现并不是伪加密,暴力破解后得到密码为99020

image-20241211192720351

发现还是压缩包,继续爆破密码后得到密码为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文件

image-20241211194046348

然后发现打不开这个pdf文件(果然如题目所说是个坏东西.....),用010打开后发现了一些东西

image-20241211194345589

一个一个提取出来后就得到了flag:NSSCTF{25da50b7993c0db55867a5a51f32f35c}

[NSSRound#3 Team]funnypng

image-20250326193003210

下载题目附件,得到一张图片,如下:

funnypng

利用StegSolve进行分析发现在这个图片的Red 0通道处发现半张二维码,另一半好像是被隐藏了

image-20250326200726987

然后通过查看文件详细信息,发现这张图片的位深度为48

image-20250326193524860

因此可以说明在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通道有另外一半二维码

image-20250326201531967

可以利用截图工具将两个半张二维码进行截获保存,然后利用在线图片合并工具进行两张图片合并

pictures

发现这张二维码有小部分被黑团团遮挡住了,通过了解可以利用这个网站进行破损的二维码读取:QRazyBox - QR Code Analysis and Recovery Toolkit
进入网站选择这个进行二维码导入

image-20250326202452119

选择Tools功能

image-20250326202635767

使用第一个工具

image-20250326202723696

然后就可以进行'破损的'二维码信息读取

image-20250326202910798

最终得到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

image-20250327204838110

下载附件解压得到一张图片和一个加密压缩包

根据题目提示,利用盲水印工具WaterMark.exe进行图片盲水印提取,可以发现里面有一串字符,也就是压缩包密码:blind watermark

image-20250327205225513

然后解压压缩包,打开文档

image-20250327205454786

利用随波逐流CTF编码工具进行阴阳怪气解密

image-20250327205607320

得到flag:NSSCTF{W@t3rMaRk_1s_s0000000_35s9}

[MoeCTF 2022]usb

image-20250327212421872

将流量包直接放到CTF流量一键分析里面可以直接提取到usb流量

image-20250327213910512

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]简单取证

image-20250425212109070

下载附件解压得到一个file.raw文件

这里可以使用ctftools_all_in_one的取证工具或使用单独的volatility工具

附:Volatility下载地址

1、先查看内存摘要,获取操作系统名称

ctftools_all_in_one:

image-20250425213139250

volatility:

命令:

.\volatility.exe -f .\file.raw imageinfo

image-20250425213622681

2、扫描内存中所有文件

ctftools_all_in_one:

在一堆文件中找到了一张jpg图片文件

image-20250425214025867

volatility:

命令:

.\volatility.exe -f .\file.raw --profile=WinXPSP2x86 filescan > filescan.txt

运行命令后回到工具文件夹中打开filescan.txt可以看到扫描结果

image-20250425214343458

3、提取地址为0x0000000002325028文件

ctftools_all_in_one:

image-20250425214722019

volatility:

命令:

.\volatility.exe -f .\file.raw --profile=WinXPSP2x86 dumpfiles -Q 0x0000000002325028 --dump-dir=./

image-20250425215045837

显示这个就表示下载成功了,回到工具目录可以看到下载的文件名为:file.None.0x81fc6610.dat,然后用vsc或记事本打开会发现一大串的base64加密,用Cyberchef解密一下可以看到这个内容类似一个翻转的zip文件

image-20250425215938802

保存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:

image-20250425231136985

volatility:

命令:

.\volatility.exe -f .\file.raw --profile=WinXPSP2x86 cmdscan

image-20250425231346231

得到密码为: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文件路径输入之后,就可以得到根据坐标绘制的图片了

image-20250425232131392

扫描二维码得到flag

image-20250425232403493

根据平台要求,最终flag为:NSSCTF{a6b93e36-f097-11ec-a9b2-5254002d2b31}

posted @ 2024-12-11 21:11  梦见雨  阅读(154)  评论(0)    收藏  举报