Writeup 4 CSS CTF Semester 2 2026 - Lamp Drill

Writeup 4 CSS CTF Semester 2 2026 - Lamp Drill

题目信息

  • 题目名称:Lamp Drill
  • 分值:15
  • 难度:Beginner
  • 类型:Hardware / Reverse Engineering
  • 题目描述:

Warm-up. No spaces.

Flag Format: CSSCTF{...}

These artists may help (Cost: 5 points)

  1. Offonoff
  2. Logical (Cost: 15 points)
    A black filled lamp is 1. An empty circle is 0.
  • 附件 :lampDrill.svg

解题思路

1. 分析提示

题目给了两个提示:

提示 1(5 分):Offonoff

Offonoff 是一个韩国音乐组合,但在这里它是个双关:

  • Off = 关 = 逻辑 0
  • On = 开 = 逻辑 1
  • "Off on off" = 0 1 0

这暗示我们要关注逻辑电平(0 和 1)。

提示 2(15 分):Logical

A black filled lamp is 1. An empty circle is 0.

这直接告诉我们编码方式:

  • 黑色实心圆 = 1
  • 白色空心圆 = 0

2. 分析 SVG 电路图

打开 lampDrill.svg,可以看到一张逻辑电路图:

顶部:逻辑门真值表

输入 A 输入 B 输出
1 (黑) 1 (黑) 1 (黑)
1 (黑) 0 (白) 0 (白)
0 (白) 1 (黑) 0 (白)
0 (白) 0 (白) 0 (白)

这完全符合 AND 门的真值表:只有两个输入都为 1 时,输出才为 1。

下方:3 行电路

每行有 8 个盒子 ,每个盒子里有 2 个圆(输入),盒子之间用箭头连接。

每个盒子是一个独立的 AND 门。

3. 提取数据

用脚本从 SVG 中提取所有圆形节点的坐标和填充色:

python 复制代码
import re
from collections import defaultdict

with open('lampDrill.svg', 'r') as f:
    content = f.read()

circles = []
pattern = r'<path d="M ([\d.]+) ([\d.]+)\s*C[^"]*"\s*clip-path="[^"]*"\s*style="fill: (#[0-9a-f]+); stroke: #[0-9a-f]+; stroke-width: 1.6'
for m in re.finditer(pattern, content):
    x = float(m.group(1))
    y = float(m.group(2))
    fill = m.group(3)
    val = 1 if fill == '#1c1915' else 0
    circles.append((x, y, val))

rows = defaultdict(list)
for x, y, val in circles:
    rows[round(y)].append((x, val))

for row_key in sorted(rows.keys()):
    if row_key < 200:
        continue
    row = sorted(rows[row_key], key=lambda t: t[0])
    values = [v for x, v in row]
    print(f"y={row_key}: {values}")

输出:

复制代码
y=281: [1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1]
y=385: [0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]
y=489: [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]

4. 计算 AND 输出

每行 16 个输入,每 2 个一组送入 AND 门,得到 8 位输出。

第 1 行(y=281):

输入对 AND 输出
1, 0 0
1, 1 1
1, 1 1
0, 1 0
0, 0 0
1, 0 0
1, 1 1
1, 1 1

输出:0 1 1 0 0 0 1 1 = 01100011 = 0x63 = 'c'

第 2 行(y=385):

输入对 AND 输出
0, 1 0
1, 1 1
1, 1 1
1, 1 1
1, 0 0
0, 1 0
1, 1 1
1, 1 1

输出:0 1 1 1 0 0 1 1 = 01110011 = 0x73 = 's'

第 3 行(y=489):

输入对 AND 输出
0, 0 0
1, 1 1
1, 1 1
1, 1 1
1, 0 0
0, 1 0
1, 1 1
1, 1 1

输出:0 1 1 1 0 0 1 1 = 01110011 = 0x73 = 's'

5. 拼接结果

三行输出对应的 ASCII 字符:

复制代码
c + s + s = css

6. 最终 Flag

复制代码
CSSCTF{css}

解题脚本

python 复制代码
import re
from collections import defaultdict

with open('lampDrill.svg', 'r') as f:
    content = f.read()

circles = []
pattern = r'<path d="M ([\d.]+) ([\d.]+)\s*C[^"]*"\s*clip-path="[^"]*"\s*style="fill: (#[0-9a-f]+); stroke: #[0-9a-f]+; stroke-width: 1.6'
for m in re.finditer(pattern, content):
    x = float(m.group(1))
    y = float(m.group(2))
    fill = m.group(3)
    val = 1 if fill == '#1c1915' else 0
    circles.append((x, y, val))

rows = defaultdict(list)
for x, y, val in circles:
    rows[round(y)].append((x, val))

result = ""
for row_key in sorted(rows.keys()):
    if row_key < 200:
        continue
    row = sorted(rows[row_key], key=lambda t: t[0])
    values = [v for x, v in row]
    outputs = []
    for i in range(0, len(values), 2):
        if i+1 < len(values):
            outputs.append(values[i] & values[i+1])
    if len(outputs) == 8:
        byte = int(''.join(map(str, outputs)), 2)
        result += chr(byte)
        print(f"y={row_key}: {outputs} -> {chr(byte)}")

print(f"Flag: CSSCTF{{{result}}}")

输出:

复制代码
C:\Users\Administrator\AppData\Local\Programs\Python\Python314\python.exe exp.py 
y=281: [0, 1, 1, 0, 0, 0, 1, 1] -> c
y=385: [0, 1, 1, 1, 0, 0, 1, 1] -> s
y=489: [0, 1, 1, 1, 0, 0, 1, 1] -> s
Flag: CSSCTF{css}

进程已结束,退出代码为 0

关键点总结

  1. 编码:黑圆 = 1,白圆 = 0(提示 2)
  2. 逻辑门 :顶部示例确认是 AND 门(只有 1,1 输出 1)
  3. 数据提取:从 SVG 中按 y 坐标分组提取圆形节点
  4. 计算:每行 16 个输入 → 8 个 AND 输出 → 1 字节 ASCII
  5. 结果 :3 行得到 c、s、s → css

最终 Flag:

复制代码
CSSCTF{css}

Rambo

2026年国庆节

🎉🎉🎉

相关推荐
kingx32 小时前
Bugku 真题 Vigenère XOR(UMDCTF 2022)WriteUp:汉明距离 + 逐列频率破重复密钥 XOR
ctf·bugku·汉明距离·维吉尼亚
lone wolf0072 小时前
bugku web题文件包含2
ctf
hengdonghui3 天前
Writeup 4 Bugku - USB 流量截取
wireshark·ctf·流量分析·misc(杂项)
hengdonghui3 天前
Writeup 4 GFCTF 2021 Baby_Web
web·ctf·变量覆盖·路径穿越·php 代码审计
kingx33 天前
Bugku 逆向 MatrixHunter:黑盒 oracle + GF(2) 消元出唯一解
网络安全·矩阵·逆向·ctf
kingx35 天前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
kingx35 天前
Bugku 326 Baby-heap1 题解:glibc 2.23 堆溢出到 FSOP 劫持 _IO_list_all(附完整 exp)
pwn·ctf·glibc·堆溢出·fsop
hengdonghui6 天前
Writeup 4 0xGame 2021 · command (WEB)
web·ctf·rce(远程代码执行)
0xBADCODE6 天前
2026 强网杯 Web 题 cwp · 全链路复盘
前端·安全·web安全·网络安全·系统安全·ctf
kingx39 天前
Bugku WEB 题解总集:文件包含 / SQLi / 反序列化 / SSTI / 反爬 / 组件漏洞
web安全·网络安全·ctf·bugku