不知道从哪里找到的比赛,随便玩玩,咱水平不高还请见谅
Hardware
Glitch The Wired
这题实际上就是一个用于了解错误注入攻击(Fault Injection Attack)的简单题,题目说有一个安全启动模块,而你可以执行电压毛刺(Voltage Glitch),最后要求是绕过签名验证
题目非常贴心地提供了启动序列的流程:
1 | > observe |
而我们可以设置delay和width,分别表示延后多少个周期开始进行毛刺,而毛刺持续时间为多少个周期
由于题目明确给出了签名验证是在第3200~3400周期,因此我们的毛刺一定要在这中间,除此之外持续时间不能太短(不然无法对模块产生足够的影响)也不能太长(模块会认为出现故障导致崩溃),这里我随便用了10个周期的毛刺,是可以拿到flag的
1 | > set_delay 3200 |
简单搜了一篇文章(An Introduction to Fault Injection (Part 1/3) | Fox IT),现实情况下攻击者需要表征电压和时钟变化对处理器的影响,一般可以用Shmoo图展现,而攻击者需要找到系统正常工作以及系统崩溃之间的一小块范围来进行攻击
Wired SPI Exfil
这题模拟的是通过SPI协议读取闪存芯片内的数据,提示说可能有分区未显示,说明有人在藏东西
首先查看一开头的数据:
1 | > tx 03 00 00 00 |
可以知道分区表在0x008000处,因此继续跟进:
1 | > tx 03 00 80 00 |
即:
1 | name,type,subtype,offset,size |
所以启动时运行的程序数据偏移在0x010000,分区大小为0x010000;配置数据偏移在0x020000,分区大小为0x010000
首先查看程序数据:
1 | > tx 03 01 00 00 |
现实生活中这个程序就可以被拉出来分析了,但是这题里不是我们要找的东西,这甚至不是一个ELF(笑)
接下来查看配置数据:
1 | > tx 03 02 00 00 |
也没有我们要的数据,这就很神秘了,不过看到帮助列表里面还可以读取一个叫SFDP的东西,那么这个是什么呢?
SFDP(Serial Flash Discoverable Parameters),串行闪存可发现参数,简单来说就是一个数据库,或许这里有些线索:
1 | > tx 5A 00 00 00 00 |
欸,你别说,还真有个HIDDEN,估计这就是我们需要找到的线索,但是这么一串Hex我也看不懂啊…
如果你愿意的话,可以啃一下这篇源码:include/sfdp.h - chromiumos/platform/ec - Git at Google,对了解SFDP很有帮助
简单来说就是这样:
1 | +-----------+-------------------+-------------------+------------------+ |
需要注意的是,
Param Count(即有多少个参数)是0-based,即0表示有1个,而Table Length(参数表大小)是1-based,即1表示长度为1;Parameter Pointer(参数表地址指针)为3字节小端序
因此从0x000000可以看出来有2个参数,一个在0x000040处,一个在0x000080处
不过Parameter Table好像不是按照JEDEC的SFDP标准编写的,反正猜一下,由于地址是24位的,因此0x000084~0x000087应该是地址,即0x030000
1 | > tx 03 03 00 00 |
最后一步还有猜猜谜,后面一段乱码明显是混淆过的flag,而已知flag格式ESPILON{...},最后能确认异或密钥WIRED_SP,但是仍旧存在乱码,因此缺少一位,而根据题目描述猜测密钥最后一个字符为I,因此将乱码和WIRED_SPI异或即可得到flag
事后发现如果读取数据的地址超过
0x040000的话,会重新读取0x000000的数据,还有取模的说是
IoT
Nurse Call
送分题,不过这个剧情我给满分,比我写得好太多了
剧情的设定是我们最喜欢的13号病房闹鬼呼叫事件,简单来说就是一个护士半夜值班的时候接收到了来自13号病房的呼叫,但是该病房已经被封闭了3个月,里面没有病人,且病房门是锁着的,而叫了工作人员来看,如下则是工作人员的记录(notes/technicien.txt):
1 | Technician notes -- M. Eiri |
那直接白给了,告诉你logs/reseau.log里面有一个标识符,我们需要通过执行reveil.sh和标识符与“闹鬼的模块”进行通信
下面就是reseau.log的内容:
1 | 2026-01-29 02:12:58 [BUS] frame src=mod_101 dst=hub type=CALL_REQ ack=OK |
所以这里的LAIN就是所谓的标识符,至于如何使用reveil.sh可以使用-h查看帮助,或者查看config/navi-care.conf里面怎么使用的,总之像下面这样就行了:
1 | infirmier@8b2089a63cf6:~$ tools/reveil.sh --id LAIN |
完成解题后我尝试读取
reveil.sh的内容:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 infirmier@8b2089a63cf6:~$ cat tools/reveil.sh
cat tools/reveil.sh
#!/bin/bash
# NAVI-CARE -- Wake signal
# Sends a WAKE signal to a module by its direct identifier
# Usage: reveil.sh --id <MODULE_ID>
if [ -z "$1" ] || [ "$1" != "--id" ] || [ -z "$2" ]; then
echo "Usage: reveil.sh --id <MODULE_ID>"
echo ""
echo "Sends a wake signal (WAKE) to a module on the NAVI-BUS."
echo "The identifier must match the target module."
exit 1
fi
MODULE_ID="$2"
# Standard modules
if echo "$MODULE_ID" | grep -qE '^mod_[0-9]+$'; then
echo "[wake] WAKE signal sent to $MODULE_ID"
echo "[wake] response: module already active -- no action required"
exit 0
fi
# Special module -- room 013
if [ "$MODULE_ID" = "LAIN" ]; then
echo ""
echo "[wake] WAKE signal sent to module LAIN..."
echo "[wake] waiting for response on NAVI-BUS..."
sleep 1
echo ""
echo "============================================"
echo " MODULE LAIN -- ROOM 013"
echo " Status: AWAKE"
echo "============================================"
echo ""
echo " > connection established with phantom module"
echo " > protocol: NAVI-BUS v2 (non-standard mode)"
echo " > identity confirmed: LAIN"
echo ""
echo " module message:"
echo ""
echo ' "no matter where you go, everybody is connected."'
echo ""
echo " flag: ESPILON{r3v31ll3_m01_d4ns_l3_w1r3d}"
echo ""
echo "============================================"
exit 0
fi
# Unknown module
echo "[wake] WAKE signal sent to $MODULE_ID..."
echo "[wake] no response -- unknown module on the bus"
exit 1只能说很朴实无华了(笑)
- 本文作者: 9C±Void
- 本文链接: https://cauliweak9.github.io/2026/03/16/espilon2026/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
我爹
我E神
式神
三极管全能神
Marin