Puzzles - Writeup by AI
题目信息
- 来源: Bugku CTF
- 类别: Crypto
- 题目名称: puzzles
- Flag格式:
flag{0Part1-Part2-Part3-Part4-a1a2a3a4}(所有值以十六进制表示)
考点分析
本题是一个综合性数学谜题,包含5个独立的子问题:
| 问题 | 类型 | 知识点 | 难度 |
|---|---|---|---|
| Question 0 | 线性代数 | 多元一次方程组求解 | ⭐⭐ |
| Question 1 | 数论 | 质数序列识别 | ⭐⭐ |
| Question 2 | 微积分 | 极限与定积分计算 | ⭐⭐⭐ |
| Question 3 | 物理 | 法拉第电磁感应定律 | ⭐⭐⭐ |
| Question 4 | 高等数学 | 三重积分(柱坐标) | ⭐⭐⭐⭐ |
解题思路
Question 0: 线性方程组求解
题目:
13627·a₁ + 26183·a₂ + 35897·a₃ + 48119·a₄ = 347561292
23027·a₁ + 38459·a₂ + 40351·a₃ + 19961·a₄ = 361760202
36013·a₁ + 45589·a₂ + 17029·a₃ + 27823·a₄ = 397301762
43189·a₁ + 12269·a₂ + 21587·a₃ + 33721·a₄ = 350830412
解法:
使用z3-solver约束求解器直接求解四元一次方程组。
结果:
- a₁ = 4006 = 0xFA6
- a₂ = 3053 = 0xBED
- a₃ = 2503 = 0x9C7
- a₄ = 2560 = 0xA00
Question 1: Part1 - 质数序列
题目:
给出三个质数: 26364809, Part1, 26366033, 26366621
分析:
这些应该是连续的质数序列。需要在26364809和26366033之间寻找质数。
解法:
遍历该区间,找出所有质数,Part1应该是第二个质数(紧跟在26364809之后)。
结果:
- Part1 = 26364823 = 0x1924B97
Question 2: Part2 - 微积分计算
题目:
Part2 = (4×lim(x→2) (x²-3x+2)/(x²-4) + 3×∫₀^{ln2} e^x(4+e^x)²dx + 2×∫₁^e (1+5ln x)/x dx + ∫₀^{π/2} xsinxdx) × 77
逐步计算:
-
极限项:
lim(x→2) (x²-3x+2)/(x²-4) = lim(x→2) [(x-1)(x-2)]/[(x-2)(x+2)] = lim(x→2) (x-1)/(x+2) = 1/4 -
第一个积分:
∫₀^{ln2} e^x(4+e^x)²dx 令 u = 4+e^x, du = e^x dx 当 x=0, u=5; 当 x=ln2, u=6 = ∫₅⁶ u²du = [u³/3]₅⁶ = (216-125)/3 = 91/3 -
第二个积分:
∫₁^e (1+5ln x)/x dx 令 u = ln x, du = dx/x 当 x=1, u=0; 当 x=e, u=1 = ∫₀¹ (1+5u)du = [u + 5u²/2]₀¹ = 1 + 5/2 = 7/2 -
第三个积分(分部积分):
∫₀^{π/2} xsinxdx = [-xcosx]₀^{π/2} + ∫₀^{π/2} cosxdx = 0 + [sinx]₀^{π/2} = 1 -
最终计算:
Part2 = (4×1/4 + 3×91/3 + 2×7/2 + 1) × 77 = (1 + 91 + 7 + 1) × 77 = 100 × 77 = 7700
结果:
- Part2 = 7700 = 0x1E14
Question 3: Part3 - 电磁感应
题目:
在 B=4T 的均匀磁场中,半径 r=2m 的圆形回路以 dr/dt=5m/s 收缩,求感应电动势。
已知: ε = (Part3 × π) / 233 V
物理原理:
法拉第电磁感应定律: ε = |dΦ/dt| = B × |dA/dt|
其中磁通量 Φ = B·A,面积 A = πr²
计算过程:
dA/dt = d(πr²)/dt = 2πr·(dr/dt)
ε = B × 2πr × (dr/dt)
= 4 × 2π × 2 × 5
= 80π
由题意: ε = (Part3 × π) / 233
所以: Part3 = ε × 233 / π = 80π × 233 / π = 80 × 233 = 18640
结果:
- Part3 = 18640 = 0x48D0
Question 4: Part4 - 三重积分
题目:
Ω是曲线 {y²=2z, x=0} 绕z轴旋转形成的曲面与平面 z=2, z=8 围成的立体。
已知: (Part4 × π) / 120 = ∭_Ω (x²+y²)dxdydz
分析:
- y²=2z 绕z轴旋转形成旋转抛物面: r²=2z (柱坐标)
- 积分区域: 2 ≤ z ≤ 8, 0 ≤ r ≤ √(2z), 0 ≤ θ ≤ 2π
计算过程(柱坐标变换):
x = rcosθ, y = rsinθ, x²+y² = r²
dV = r·dr·dθ·dz
∭_Ω (x²+y²)dV = ∫₂⁸ ∫₀^{2π} ∫₀^{√(2z)} r² · r dr dθ dz
= ∫₂⁸ ∫₀^{2π} ∫₀^{√(2z)} r³ dr dθ dz
先对r积分:
∫₀^{√(2z)} r³dr = [r⁴/4]₀^{√(2z)} = (2z)²/4 = z²
再对θ积分:
∫₀^{2π} z² dθ = 2πz²
最后对z积分:
∫₂⁸ 2πz²dz = 2π[z³/3]₂⁸ = 2π(512/3 - 8/3) = 2π(504/3) = 336π
由题意: (Part4 × π) / 120 = 336π
所以: Part4 = 336π × 120 / π = 336 × 120 = 40320
结果:
- Part4 = 40320 = 0x9D80
完整代码
from z3 import *
import sympy as sp
from sympy import *
# Question 0: 解线性方程组
a1 = Int('a1')
a2 = Int('a2')
a3 = Int('a3')
a4 = Int('a4')
s = Solver()
s.add(13627*a1 + 26183*a2 + 35897*a3 + 48119*a4 == 347561292)
s.add(23027*a1 + 38459*a2 + 40351*a3 + 19961*a4 == 361760202)
s.add(36013*a1 + 45589*a2 + 17029*a3 + 27823*a4 == 397301762)
s.add(43189*a1 + 12269*a2 + 21587*a3 + 33721*a4 == 350830412)
if s.check() == sat:
model = s.model()
a1_val = model[a1].as_long()
a2_val = model[a2].as_long()
a3_val = model[a3].as_long()
a4_val = model[a4].as_long()
# Question 1: Part1 - 质数
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
part1_candidates = []
for i in range(26364809, 26366034):
if is_prime(i):
part1_candidates.append(i)
part1 = part1_candidates[1] # 第二个质数
# Question 2: Part2 - 微积分
x = symbols('x')
limit_term = limit((x**2 - 3*x + 2)/(x**2 - 4), x, 2)
integral1 = integrate(exp(x)*(4+exp(x))**2, (x, 0, log(2)))
integral2 = integrate((1+5*log(x))/x, (x, 1, E))
integral3 = integrate(x*sin(x), (x, 0, pi/2))
part2_expr = (4*limit_term + 3*integral1 + 2*integral2 + integral3) * 77
part2_int = int(round(float(part2_expr.evalf())))
# Question 3: Part3 - 电磁感应
B = 4
r = 2
dr_dt = 5
epsilon = B * 2 * pi * r * dr_dt
part3_int = int(round(float((epsilon * 233 / pi).evalf())))
# Question 4: Part4 - 三重积分
r_sym, theta, z = symbols('r theta z', real=True, positive=True)
integrand = r_sym**3
inner = integrate(integrand, (r_sym, 0, sqrt(2*z)))
middle = integrate(inner, (theta, 0, 2*pi))
outer = integrate(middle, (z, 2, 8))
part4_int = int(round(float((outer * 120 / pi).evalf())))
# 生成Flag
flag = f"flag{{0{part1:X}-{part2_int:X}-{part3_int:X}-{part4_int:X}-{a1_val:X}{a2_val:X}{a3_val:X}{a4_val:X}}}"
print(flag)
运行结果
Question 0:
a1 = 4006 = 0xFA6
a2 = 3053 = 0xBED
a3 = 2503 = 0x9C7
a4 = 2560 = 0xA00
Question 1:
Part1 = 26364823 = 0x1924B97
Question 2:
Part2 = 7700 = 0x1E14
Question 3:
Part3 = 18640 = 0x48D0
Question 4:
Part4 = 40320 = 0x9D80
Flag: flag{01924B97-1E14-48D0-9D80-FA6BED9C7A00}

424

被折叠的 条评论
为什么被折叠?



