2025.5.1miniLCTF
2025.5.1miniLCTF
是 2025.5.1miniLCTF 哒!
勉勉强强做了3道题,稍微记录一下
rsasign
听说你很会RSA? (flag以miniL开头)
1 |
|
题目给出了$gift=(p+q+a+b+a * b)^2 \ (mod\ phi)$抹去了低740位后的结果,实际测试可以得出,在抹去了低740位后,gift和$(p^2+q^2)%phi>>740$的结果是一样的。
而$n=p * q$,phi和n在题目中抹去了低740位的情况下可以认为是一样的,同时测试得出$(p^2+q^2)//phi=2$,也就是说$gift<<740+2 * n$是$p^2+q^2$的近似值,那么我们可以解出$p+q$的近似值
1 |
|
然后我们可以用这个近似值以及$n=p*q$来解出p和q的近似值
1 |
|
然后二元copper即可求出p,q
ps:这里之前做的时候表达式写错了,然后好久求不出来…
二元copper:
1 |
|
解p,q:
1 |
|
然后正常解个RSA即可
1 |
|
babaisiginsigin
Cryptoers(?) sign in here \(≥v≤)/
1 |
|
题目要求我们完成2个挑战,每个挑战会先让我们发送2个m,靶机会返回特定计算后的结果,然后让我们计算靶机给出的m的计算后的结果。
这里我们并不需要计算出准确的x和y,只需要得到一个等效的x,y,使得我们的计算结果和靶机上的基本都是一样的就好了。
我的想法是,对于一个二进制的数m,比如10101,靶机会计算$(m|x)+(m|y)$,对于第i位比特位,假如$m_i$是0,那么返回的结果中的第i位就会是$x_i+y_i$,而如果$m_i$是1,那么返回的结果中的第i位就会是$1+1$,就一定是0,同时往前进一位。
那么对于一个01交替的二进制数m来说,这里假设还是10101,对于它的计算结果r,如果$m_0$(最低位)是0,同时$r_0$是0,那么$x_0$和$y_0$就可能都是0,或者都是1,那么我们再看$r_{1}$,如果也是0,那么就证明在$r_0$的计算中没有进位,那么$x_0$和$y_0$就只可能都是0,反之则都是1。
如果$r_0$是1,那么就证明$x_0$和$y_0$中有一个1,而我们可以任意让其中一个是1即可,因为不管哪个是1,这不影响计算结果。
然后我们会注意到如果$m_i$为1的时候会向前进一位,但这也只是让我们上面的结果稍稍改变了一下,并不会使得$x_{i+1}$和$y_{i+1}$变的不确定。
在这种构造下,我们就可以得到x和y一半的比特位了(这里的x,y指等效的x,y),然后我们对m按位取反即可得到另一半比特位。
这个过程可以交给z3来完成。
然后对于第二部分z3仍然可以求解,我做的时候没有仔细的去思考过,只是想试试z3还能不能做,然后准确率竟然比第一部分还高,很神奇。
z3可能出错的原因我不清楚,它是有可能解出连约束都过不了的解的,但概率还是比较小的,多交换几次即可。
exp(可能不稳定,但我懒得改了):
1 |
|
flag:
1 |
|
ezhash?!
这次你还能碰撞的出来吗? (注:flag以miniL开头)
1 |
|
题目给了64组测试数据,然后一个flag的哈希值。
那么我们通过测试数据来解出所用的key,然后解这个哈希即可。
题目中提到key是128位的,但我实际上仅通过一组数据解出来一个更小的key,同时这个key对于后面63组数据来说是符合的,也就是说我们可以解出一个等效的key来解题,而不需要去解128位的key。
这个还是用z3即可
1 |
|
解出来key是1000001。
接下来可以参考这篇博客
hash——复现
构造相同的格,稍微调一下参数就可以了。
1 |
|
经过测试,k2在$2^{10}$ 到 $2^{15}$这个范围内更容易出。
1 |
|
Noisy
Damn, there’s just too much noise! Can we still get the flag back?
1 |
|
题目要求我们从$ci = self.s * (msg[i] + k0 * self.M) * (1 + k1 * self.p) % self.n$中恢复$msg[i]$。
复现ing…