Misay's blog

Back

周末花了一个上午打了打今年的鹏城杯 题目比较基础 Solve 5 of 6 来此写WP,剩下的RandomAudit实在猜不出出题人的脑洞了,等有师傅公布解法再复现吧

true_or_false#

神人题没把flag删干净 血手慢无

tf.py

题目基于RSA-CRT故障 对于因子pp的签名sp≡mdpmod  ps_p\equiv m^{d_p}\mod p正常 但是sqs_q被替换为一个随机数 我们看接下来的两个mixed后的数据

sigo≡mdmod  n(1)sig_o\equiv m^{d}\mod n\tag{1} sigf≡sq+q((sp−sq)×q−1mod  p)mod  n(2)sig_f \equiv s_q+q((s_p-s_q)\times q^{-1}\mod p)\mod n\tag{2}

我们对2式转移到模pp下 因为我们的sqs_q没有任何的代数关系 可以得到

sigf≡sq+q((sp−sq)×q−1mod  p)mod  p≡spmod  p(3)sig_f \equiv s_q+q((s_p-s_q)\times q^{-1}\mod p)\mod p\equiv s_p\mod p\tag{3}

而我们再对1式转化到模pp下,由于dp≡dmod  ϕ(p)d_p\equiv d\mod \phi(p) 可以得到

sigo≡mdp+kϕ(p)≡mdp×mkϕ(p)≡mdp≡spmod  p(4)sig_o\equiv m^{d_p+k\phi(p)}\equiv m^{d_p}\times m^{k\phi(p)}\equiv m^{d_p}\equiv s_p\mod p\tag{4}

所以说 我们如果恢复了sigosig_o sigfsig_f 就可以直接得到

p=gcd(n,∣sigo−sigf∣)p=gcd(n,|sig_o-sig_f|)

第二步 我们发现seedseed的范围是1∼2311\sim2^{31} 而且给出了seedmod  97seed\mod97的结果 完全可以暴力穷举所有的seed 逆向LCG-MIX 还原我们的两个签名 然后求出flag ,验证是否符合flag-enc exp如下

babyRSA#

task.py

给出了3p2−13pq\frac{3p^2-1}{3pq}的小数近似形式 我们发现误差项−13pq-\frac{1}{3pq}几乎可以忽略 那么leak也就是约等于pq\frac{p}{q} 打连分数展开即可

exp

weak-leak#

也是flag没删干净

task.py

爆破求解pwd 得到seq后计算diff 然后解方程就行

exp

解p q用如下sage代码

diff = 20224040742840345250326339919317453831304805563222287954131954259215526515254
n1 = 5584300989285538211153365890789627571870624311506728764237201442331520767215704903718501881100700113185783404202199758018541582967691088869854375384182438

x = var("x")

eq = (x+diff)*(x+1) - n1 == 0
solution = solve(eq,x)
print(solution)
'''
[
x == -85521263473824766227818846323904319418946431813031743497481757287536903337968,
x == 65297222730984420977492506404586865587641626249809455543349803028321376822713
]
'''
py

PECO#

Task.py

告诉了你p7+q13p^{7}+q^{13}的低777位 而明显(n,2777)=1(n,2^{777})=1,那么有

p7+(n×p−1)13≡g2mod  2777→p20−g2p13+n13≡0mod  2777p^{7}+(n\times p^{-1})^{13}\equiv g_2\mod2^{777}\rightarrow p^{20}-g_2p^{13}+n^{13}\equiv0\mod2^{777}

走Lifting的方式可以确定pp的低777位 打Copper分解nn

再解Pell方程ax2−by2=g1ax^2-by^2=g_1 得到x  y  mx\;y\;m后打格子求出f0  f1f_0\;f_1

exp

Budo的Pem#

public.enc

-----BEGIN PUBLIC KEY-----
MIIECQIBA???????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????
Gwp5tfe98QiKT3ehCxOtijZx2/+SABMTf8Xil1pYHNh7zIUV2HO/rsQzTLHDGxYg
Yxb5LL5En66BFXQRPl6y7QFT0fzLgKAhDoB24cX79q+rvqc60YBcChsgxwzywTv+
AwKCAQBwVQnsKD3JTju+hcoeNoWFhnIfPRqNZ4E0UeFgcozIfnOl8Wo8TtPvtVPt
4V1UAd4ywmXMSQKmZmo7fY6YRLnLKh/8RHnfDQ8e6ZJxhJOtR8sonfIGM3oGOg+w
119moJmBIKAie0rAEADu4OjmABKqarYT+5Kzc5Iu4yhbbL1Cmjv4pjFyCQ4UaxnP
GQrxWr5lc+mau/0BaV+ADCz0cGPvf+yeaWD5GWgkO2cyrkMaPvQI6gJ+PnzURuM9
Qw8Y7brYxl91SwZKg8wP+B15RybFwffTn/kaec06fhj+JvPPoj3jNJ/LRNcISgXn
mu2YkK3q6TLT53idAggyQyNiseEl
-----END PUBLIC KEY-----
py

private.enc

enc为密文也给出了 这里手撕pem应该是可以得到d的部分有效位的 可以走不同位数泄露的线性问题来打 交由LLM审计已有公私钥文件可以得到

arguments.json

注意到我们的e是2047bits 说明d不会很大 然后 n e c都给出了 自然想到Wiener-Attack 但是没成功 稍微估算Bounds后 尝试用Boneh-durfee来打,成功恢复私钥 exp

本题一血。

鹏城杯2025
https://www.zt2misay2.cn/blog/pcb2025
Author Misay
Published at 2025年12月16日