阴间 CTF 2025

比赛地址:阴间 CTF 2025

比赛时间:4 Apr 2025 14:44 CST - 6 Apr 2025 14:44 CST

Misc

阴曹地府税务总局

Challenge

近年来,阴曹地府面临财政赤字,阎王爷特批成立了 "阴曹地府税务总局",专门对阳间烧给亡灵的冥币收税。然而,由于地府税务系统采用了一套基于 Python 随机数的税率波动算法,导致税率每时每刻都在变化,甚至有时会出现 "零税率" 的情况。

作为一名资深会计师,你在阳寿未尽时不慎掉入阴曹地府。为了回到阳间,你需要向地府税务总局贿赂足够的冥币,获取一张特殊通行证。但你需要预测税率波动,在低税率或零税率时交易,才能最大化你的有限资产。
hint: python

Solution

“基于 Python 随机数的税率波动算法” 那多半就是 random 库了

“每时每刻都在变化” 说明随机数的种子是时间戳

手动玩一遍发现服务器会在一开始就先给出 10 个税率,那么我就可以枚举近期的时间戳,然后通过对比找到正确的时间戳,进而推测出未来的税率,代码如下

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
55
56
57
58
59
60
61
62
63
64
65
66
67
import random
from datetime import datetime, timezone
import re

# 提取税率
rate_string = """
第1轮交易税率: 92%
第2轮交易税率: 13%
第3轮交易税率: 87%
第4轮交易税率: 78%
第5轮交易税率: 71%
第6轮交易税率: 1%
第7轮交易税率: 16%
第8轮交易税率: 11%
第9轮交易税率: 27%
第10轮交易税率: 82%
"""
pattern = r"第\d+轮交易税率:\s*(\d+)%"
matches = re.findall(pattern, rate_string)
history_rates = [int(rate) for rate in matches]

# 获取当前 GMT 时间戳
gmt_timestamp = int(datetime.now(timezone.utc).timestamp())
found_timestamp = None
for offset in range(-3600, 3601): # 枚举时间戳范围±1小时
timestamp = gmt_timestamp + offset

# 枚举初始交易轮次(5到15轮)
for initial_rounds in range(5, 16):
# 初始化随机数生成器
random.seed(timestamp)

# 跳过初始交易轮次
for _ in range(initial_rounds):
random.randint(0, 99)

# 生成前 10 轮税率
generated_rates = [random.randint(0, 99) for _ in range(10)]

# 检查是否匹配历史数据
if generated_rates == history_rates:
found_timestamp = timestamp
print(f"找到正确的时间戳: {timestamp}")
print(f"初始交易轮次为: {initial_rounds}")
break

if found_timestamp is not None:
break

# 如果找到正确的时间戳,继续预测下一轮税率
if found_timestamp is not None:
random.seed(found_timestamp)

# 跳过初始交易轮次
for _ in range(initial_rounds):
random.randint(0, 99)

# 跳过已知的 10 轮历史数据
for _ in range(10):
random.randint(0, 99)

# 预测未来 100 轮税率
future_rates = [random.randint(0, 99) for _ in range(100)]
print("未来 100 轮税率为:")
print(future_rates)
else:
print("未找到匹配的时间戳")

运行得到以下输出

1
2
3
4
找到正确的时间戳: 1743752564
初始交易轮次为: 13
未来 100 轮税率为:
[2, 39, 30, 52, 47, 19, 84, 91, 4, 15, 60, 21, 5, 89, 76, 58, 15, 18, 92, 83, 61, 54, 49, 20, 35, 2, 42, 37, 33, 19, 84, 55, 70, 90, 80, 6, 40, 1, 50, 69, 10, 54, 98, 18, 52, 97, 99, 28, 41, 65, 86, 80, 53, 25, 9, 41, 44, 59, 21, 15, 66, 66, 51, 54, 64, 39, 34, 47, 37, 74, 42, 51, 44, 87, 66, 6, 20, 25, 19, 9, 93, 39, 12, 65, 12, 20, 27, 56, 81, 47, 76, 69, 56, 90, 65, 25, 37, 39, 27, 70]

根据上面的输出手动进行交易即可(懒得写代码了,反正手动也不复杂)

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
ncat nc1.ctfplus.cn 13343

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓████████▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓██▓▒▒▒▒▒▒▒▓███▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒███▒▒▒▒▒▒▒▒▒▒▒▒▒██▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▓█▒▒▒▒▒▓▓██████████▓▓▒▒▒█▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▓▒▒▓███▓▒▒▒▒▒▒▒▒▒▓███▓▒▓█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▓█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓█▓▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒█▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓█▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒█▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒█▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒█▒▒▓█████████████▓▒▒▒█▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒█▒▒▓█████████████▓▒▒▒█▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒█▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒█▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▓█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓█▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒███▓▒▒▒▒▒▒▒▒▒▒▓███▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓█▒▒▒▓██████████▓▓▒▒▒▒█▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒███▒▒▒▒▒▒▒▒▒▒▒▒███▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓███▓▒▒▒▒▒▒▓███▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓████████▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

阴曹地府税务总局 - 冥币税率查询系统
今日公告:2025年04月04日
进行烧纸交易需支付的税率会不断波动(0-99%)
预测准确可节省大量冥币,贿赂通行证需要10000冥币
税务总局提醒您:偷税漏税(预测税率)是违法行为...

「税务局柜台工作人员抬头」:欢迎来到阴曹地府税务总局。
「工作人员查看资料」:系统显示您目前持有 2000 冥币。
「工作人员推了推眼镜」:我们这里的税率每时每刻都在变化,交易时会自动征税。
「工作人员压低声音」:据说有些前世是会计师的鬼魂能预测税率走势...
「工作人员左右张望后靠近窗口」:嘿,想获得点内部消息吗?价格公道,只要1000冥币...
要贿赂工作人员吗?(y/n): n
「工作人员面无表情」:随您便,祝您好运...

【税率历史数据】
「工作人员翻开记录本」:以下是最近十轮交易的税率记录,仅供参考...
第1轮交易税率: 92%
第2轮交易税率: 13%
第3轮交易税率: 87%
第4轮交易税率: 78%
第5轮交易税率: 71%
第6轮交易税率: 1%
第7轮交易税率: 16%
第8轮交易税率: 11%
第9轮交易税率: 27%
第10轮交易税率: 82%

「工作人员合上记录本」:税率参考数据已经给您了。
「工作人员解释道」:每轮交易,您可以烧1000冥币,但会根据当时的税率扣除部分作为税款。
「工作人员指向价目表」:如果税率是50%,您烧1000冥币,实际只有500冥币到达亡灵手中。
「工作人员眨眨眼」:偶尔税率为0时,您的冥币将完全不被课税。
「工作人员提醒」:贿赂地府通行证需要10000冥币,您需要多轮交易才能积累足够的资金。

==== 第1轮交易 ====
当前冥币: 2000
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 2
「系统显示」:当前税率为: 2%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 2500

==== 第2轮交易 ====
当前冥币: 2500
要进行烧纸交易吗?(y/n): 39
「工作人员点头」:谨慎是明智的选择。下轮再来吧!

==== 第3轮交易 ====
当前冥币: 2500
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 30
「系统显示」:当前税率为: 30%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 3000

==== 第4轮交易 ====
当前冥币: 3000
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 52
「系统显示」:当前税率为: 52%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 3500

==== 第5轮交易 ====
当前冥币: 3500
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 47
「系统显示」:当前税率为: 47%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 4000

==== 第6轮交易 ====
当前冥币: 4000
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 19
「系统显示」:当前税率为: 19%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 4500

==== 第7轮交易 ====
当前冥币: 4500
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 84
「系统显示」:当前税率为: 84%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 5000

==== 第8轮交易 ====
当前冥币: 5000
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 91
「系统显示」:当前税率为: 91%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 5500

==== 第9轮交易 ====
当前冥币: 5500
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 4
「系统显示」:当前税率为: 4%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 6000

==== 第10轮交易 ====
当前冥币: 6000
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 15
「系统显示」:当前税率为: 15%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 6500

==== 第11轮交易 ====
当前冥币: 6500
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 60
「系统显示」:当前税率为: 60%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 7000

==== 第12轮交易 ====
当前冥币: 7000
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 21
「系统显示」:当前税率为: 21%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 7500

==== 第13轮交易 ====
当前冥币: 7500
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 5
「系统显示」:当前税率为: 5%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 8000

==== 第14轮交易 ====
当前冥币: 8000
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 89
「系统显示」:当前税率为: 89%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 8500

==== 第15轮交易 ====
当前冥币: 8500
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 76
「系统显示」:当前税率为: 76%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 9000

==== 第16轮交易 ====
当前冥币: 9000
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 58
「系统显示」:当前税率为: 58%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 9500

==== 第17轮交易 ====
当前冥币: 9500
要进行烧纸交易吗?(y/n): y
您预测的当前税率是(0-99%): 15
「系统显示」:当前税率为: 15%
「工作人员震惊」:您的预测非常准确!系统奖励您额外 500 冥币!
「工作人员小声嘀咕」:这家伙难道是税务师转世?
当前冥币余额: 10000

「工作人员震惊地看着账本」:天啊!您已经积累了超过10000冥币!
「工作人员左右张望」:嘘...小声点...这是您要的通行证。
「工作人员从抽屉里拿出一张金色通行证」:凭此证可自由往返阴阳两界,无需再交税!
「通行证背面刻着小字」:geesec{M4st3r_0f_T4x_Ev4s10n_4nd_R4nd0m_Pr3d1ct10n}
「工作人员迅速关上窗口」:我们从未见过,您从未来过...

HellCTF2025-1

1
geesec{M4st3r_0f_T4x_Ev4s10n_4nd_R4nd0m_Pr3d1ct10n}

Web

生死簿查阅系统

Challenge

传闻,阎王爷座下有一本神秘典籍,记载天下众生命数。为追逐数字化潮流,阴曹地府上线了 "生死簿查阅系统"。然,此系统乃鬼斧神工,诡谲难测,唯有精通阴阳之道的黑客才能窥其奥秘。听说有位技术鬼才曾潜入系统,但被抓去做了拔舌地狱的测试员…

你,可敢一试?
HINT 第一层:YIN-HOUR:丑时三刻
HINT2: 阴~阳~两~界,生~死~轮~回,六~道~往~返,我~自~逍~遥 需要移除~转换为 阴阳两界,生死轮回,六道往返,我自逍遥

Solution

HellCTF2025-2

第一次拿到 1 血(可惜不是 misc 题)

虽然这题被放在了 Web,但我觉得把它归到 Misc

HellCTF2025-3

首先打开容器地址,根据题目引导要修改 HTTP 头,但是要怎么修改还不是很清楚(至少我做的时候是不清楚的,我这层过了才出提示呜呜呜),所以就写个脚本挨个试

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
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

time_formats = [
"1743682800",
"2025-04-04T03:00:00Z",
"2025-04-04 03:00:00",
quote("丑时三刻"),
"+3 hours",
]

field_names = [
"HTTP_YIN_HOUR",
"X-Timestamp",
"Custom-Time",
"Date",
"Yin-Hour"
]

for field in field_names:
for time_format in time_formats:
headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
field: time_format
}

response = requests.get(url, headers=headers)
print(f"Field: {field}, Time Format: {time_format}")
print(response.text)
print("-" * 50)

if "geesec" in response.text:
print("Success!")
break

此时的我还没有意识到问题的严重性,竟妄想在第一层就拿到 flag

不过运气还算不错,其中有一条被我撞对了,摸到了第二层的门槛

HellCTF2025-4

根据这条线索立马更新脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
}

post_response = requests.get(url, headers=headers)

print(post_response.text)

又根据提示可以知道要新增两个 header,按要求写就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

post_response = requests.get(url, headers=headers)

print(post_response.text)

HellCTF2025-5

此时得到了新的提示,这里考察的是 PHP 中的 MD5 弱比较绕过,在 MD5 绕过第一式:弱比较绕过这篇博客可以找到符合条件的值 0e215962017,把这个参数传上去就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
}

post_response = requests.get(url, headers=headers, params=params)

print(post_response.text)

HellCTF2025-6

根据提示加一个鬼门关参数就好了,随便填什么那就不填(懒)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
"鬼门关": "",
}

post_response = requests.get(url, headers=headers, params=params)

print(post_response.text)

HellCTF2025-7

根据前面的经验(需要添加的参数都会被出题人用 · 给围起来,就比如说前面的 ·鬼门关· 和这里的 ·八卦·), 所以就先新增一个参数八卦

HellCTF2025-8

其实我也不知道要填什么,想着先这么写了,要是有什么要算的后面再说,没想到竟然就这么过了(后来在群里看到有的师傅在提算卦这件事真的觉得挺搞笑的)

那么还是按照这个规律增加 阴历转生术 这两个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
"鬼门关": "",
"八卦": "",
"阴历": "",
"转生术": "",
}

post_response = requests.get(url, headers=headers, params=params)

print(post_response.text)

HellCTF2025-9

根据提示把 甲子年正月初一 填到 阴历

HellCTF2025-10

根据提示填写符合格式要求的六位数字

HellCTF2025-11

再根据提示把数字改为 000004

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
"鬼门关": "",
"八卦": "",
"阴历": "甲子年正月初一",
"转生术": "000004",
}

post_response = requests.get(url, headers=headers, params=params)

print(post_response.text)

HellCTF2025-12

curl-d 参数其实就是使用 POST 方法

在这里就是把请求方法从 GET 改成 POST ,然后请求体填入提示给的咒语

这里我不得不吐槽一下了

这玩意儿疑似鬼魂作祟,要把 ~ 去掉

HellCTF2025-13

这一点后来新增了提示,因此请求体就是 阴阳两界,生死轮回,六道往返,我自逍遥

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
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
"鬼门关": "",
"八卦": "",
"阴历": "甲子年正月初一",
"转生术": "000004",
}

data = "阴阳两界,生死轮回,六道往返,我自逍遥"

post_response = requests.post(url, headers=headers, params=params, data=data)

print(post_response.text)

HellCTF2025-14

根据提示新增参数 密码,不传东西就把答案告诉我了 029755

HellCTF2025-15

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
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
"鬼门关": "",
"八卦": "",
"阴历": "甲子年正月初一",
"转生术": "000004",
"密码": "029755",
}

data = "阴阳两界,生死轮回,六道往返,我自逍遥"

post_response = requests.post(url, headers=headers, params=params, data=data)

print(post_response.text)

HellCTF2025-16

用的是脚本看到的本身就是网页源代码

这次是新增参数 真解查阅

HellCTF2025-17

这里前面说我 持有的'真解'不正确 ,后面又给出了一个答案 ▁▁▁▁▁▁ ▁▁▁ ▁▁▁▁▁▁ ▁▁▁▁▁▁ ▁▁▁▁▁▁▁▁ ▁▁▁ ▁▁ ,那很明显这里给出的答案就是 真解

HellCTF2025-18

接着又给出了 查阅 的答案 mingfu_zhenjie

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
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
"鬼门关": "",
"八卦": "",
"阴历": "甲子年正月初一",
"转生术": "000004",
"密码": "029755",
"真解": "▁▁▁▁▁▁ ▁▁▁ ▁▁▁▁▁▁ ▁▁▁▁▁▁ ▁▁▁▁▁▁▁▁ ▁▁▁ ▁▁",
"查阅": "mingfu_zhenjie",
}

data = "阴阳两界,生死轮回,六道往返,我自逍遥"

post_response = requests.post(url, headers=headers, params=params, data=data)

print(post_response.text)

HellCTF2025-19

这里说还缺三个关键参数,先根据题目要求填上去

HellCTF2025-20

final_incantation 的计算公式是 新字符 = (原字符的 Unicode 编码 - 0x4e00 - 13) % 总范围 + 0x4e00 ,明文是 地府无常,勾魂索命,生死判定,我命由我

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def enc(text):
encrypted_text = []
for char in text:
code = ord(char)
if 0x4e00 <= code <= 0x9fa5: # 非汉字字符保持不变
new_code = (code - 0x4e00 - 13) % 20902 + 0x4e00
encrypted_text.append(chr(new_code))
else:
encrypted_text.append(char)
return ''.join(encrypted_text)

# 测试加密函数
plain_text = "地府无常,勾魂索命,生死判定,我命由我"
print(enc(plain_text))

输出得到 圣序旓師,勱鬵紕呰,甒歮列宍,戄呰甤戄

HellCTF2025-21

soul_phase 的计算公式是 soul_phase = ((日期 + 月份) % 4 + 1) * 90

今天是 2025年4月4日 ,带入得到 soul_phase = ((4 + 4) % 4 + 1) * 90 ,口算一下得到 90

HellCTF2025-22

karma_hex 的计算公式是 karma_value = (日期 * 31 + 月份) * 100 + 年份的最后两位,然后转为十六进制

带入公式得到 karma_value = (4 * 31 + 4) * 100 + 25

1
2
karma_value = (4 * 31 + 4) * 100 + 25
print(f"{karma_value:06x}")

输出得到 003219

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
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
"鬼门关": "",
"八卦": "",
"阴历": "甲子年正月初一",
"转生术": "000004",
"密码": "029755",
"真解": "▁▁▁▁▁▁ ▁▁▁ ▁▁▁▁▁▁ ▁▁▁▁▁▁ ▁▁▁▁▁▁▁▁ ▁▁▁ ▁▁",
"查阅": "mingfu_zhenjie",
"final_incantation": "圣序旓師,勱鬵紕呰,甒歮列宍,戄呰甤戄",
"soul_phase": "90",
"karma_hex": "003219",
}

data = "阴阳两界,生死轮回,六道往返,我自逍遥"

post_response = requests.post(url, headers=headers, params=params, data=data)

print(post_response.text)

HellCTF2025-23

就差最后一步了,提示说阎王爷的密码就在:ghosssssssssssssssssssssssssttttt,因此只要查阅 ghosssssssssssssssssssssssssttttt 即可

最终的 exp 如下:

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
import requests
from urllib.parse import quote

url = "http://80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn/"

headers = {
"Host": "80-57511269-f6eb-4870-8838-fcf6e2d9fb91.challenge.ctfplus.cn",
"Yin-Hour": quote("丑时三刻"),
"Ming-Wang-Token": quote("玄冥鬼神,听吾号令"),
"Hell-Dimension": quote("第十八层"),
}

params = {
"c": "0e215962017",
"鬼门关": "",
"八卦": "",
"阴历": "甲子年正月初一",
"转生术": "000004",
"密码": "029755",
"真解": "▁▁▁▁▁▁ ▁▁▁ ▁▁▁▁▁▁ ▁▁▁▁▁▁ ▁▁▁▁▁▁▁▁ ▁▁▁ ▁▁",
"查阅": "ghosssssssssssssssssssssssssttttt",
"final_incantation": "圣序旓師,勱鬵紕呰,甒歮列宍,戄呰甤戄",
"soul_phase": "90",
"karma_hex": "003219",
}

data = "阴阳两界,生死轮回,六道往返,我自逍遥"

post_response = requests.post(url, headers=headers, params=params, data=data)

print(post_response.text)

HellCTF2025-24

1
geesec{6601bea6-bebf-49e5-8a02-402454cd245a}