TamuCTF_WP

TamuCTF_wp

Misc_Quick_Response

附件是一个二维码:

quick-response

观察后发现定位点被修改。

把二维码矩阵按 module 提取出来后,用棋盘格异或,再整体反相

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
from PIL import Image
import numpy as np

img = Image.open("quick-response.png").convert("L")
arr = np.array(img) < 100

# 1) 按 32x32 提取成 29x29 模块矩阵
mods = np.zeros((29, 29), dtype=np.uint8)
for y in range(29):
for x in range(29):
block = arr[y*32:(y+1)*32, x*32:(x+1)*32]
mods[y, x] = int(block.mean() > 0.5)

# 2) 构造棋盘格
checker = np.fromfunction(lambda y, x: (x + y) % 2 == 0, (29, 29), dtype=int).astype(np.uint8)

# 3) 恢复真实二维码
qr = 1 - (mods ^ checker)

# 4) 加 quiet zone
canvas = np.zeros((37, 37), dtype=np.uint8)
canvas[4:33, 4:33] = qr

# 5) 渲染输出
out = Image.fromarray((1 - canvas) * 255) # 黑白图
out = out.resize((37 * 20, 37 * 20), Image.NEAREST)
out.save("recovered_qr.png")

print("已保存 recovered_qr.png")

fixed_qr

扫描得到:

gigem{d1d_y0u_n0t1c3_th3_t1m1n9_b175}

Misc_Time_Capsule

拿到附件之后还是蛮明显是一个时间戳隐写的:

time

1
2
3
4
5
6
7
times = [
"15:01:43","15:01:45","15:01:43","15:01:41","15:01:49","15:02:03",
"15:01:38","15:02:01","15:01:43","15:00:48","15:01:50","15:00:51",
"15:01:35","15:00:51","15:01:54","15:00:52","15:02:05"
]
s = ''.join(chr(int(t[3:5])*60 + int(t[6:8])) for t in times)
print(s)

gigem{byg0n3_3r4}

Misc_Phantom2

用trufflehog爆破commit hash

https://2hi5hu.cn/archives/Ciallo_Encrypt

https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github

1
trufflehog.exe github-experimental --repo=https://github.com/tamuctf/phantom2.git --token=ghp_xxx --object-discovery --no-update

爆破出来d3cab66d23265b36ecd8cd410554bdfc603e3416

https://github.com/tamuctf/phantom2/commit/d3cab66d23265b36ecd8cd410554bdfc603e3416

gigem{57up1d_917hu8_3v3n7_4p1_a8f943}

这题目是队友做出来的,我觉得蛮有意思就把她的 wp 拿过来了

Misc_Gamer_Returns

拿到的附件是一个 summon 指令,很明显是一个 MC 的指令,大概是召唤箱子矿车,里面有相应的旗帜,旗帜对应了字母。

旗帜

倒数第四行看不清楚,直接进游戏把对应的旗帜拿出来,发现是反色了,原本红底的旗帜改成了白底,所以看不清楚了。

那直接那新的把旗帜根据旗帜信息做一遍:

qizhi

gigem{t1m3_4_g4m1ng}

Crypto_Hidden_log_Factoring

**generate.py **里先生成 RSA 私钥 d,再用一个由离散对数秘密 s 经过 **HKDF **导出的 **mask **去异或 d,得到公开的 D;同时又公开了 A = g^s mod p。最后密文不是标准 RSA,而是 c = m^2 mod n,也就是 Rabin 型平方加密。 先从 data.txt 里的 DLP 公参入手,利用 **s < 2^100 **这个弱点。题目里 s = randint(1, 1 << 100),而给出的这个 p-1 含有很大的平滑部分,足以用 Pohlig–Hellman 把 s 恢复出来。

拿到 s 后,按源码里的同样方式跑 HKDF,得到 mask,再和 D 异或回去,恢复 RSA 私钥 d。这里长度要取 d.bit_length() // 8,正确值对应 127 字节。

已知 **(n, e, d) **后,用标准的 “由私钥指数反推分解 n” 方法,利用 k = ed - 1成功分解出 n = p*q

因为密文是 c = m^2 mod n,所以接下来是 Rabin 解密:分别对两个素因子求平方根,再 CRT 合并出 4 个候选明文,其中只有一个是正常 ASCII 且符合 flag 格式,于是得到上面的 flag。源码里这一步对应 c = pow(bytes_to_long(flag.encode()), 2, n)

gigem{100lsb_ed_fact0ring_rab1n_attack_1n_th3_log_3oVAjvoCTGmWg847g9zsNBIyPPWqYdP}

AI 写这个crypto好厉害,我就把附件给他,它直接梭哈了