Octane的moeCTF_2022 Writeup
OctaneのCTF初体验!
准备在这里补(shui)一篇WP。因为题目数量挺多的,有些题目也是新手引导向的,或者仅仅涉及一些工具的基本使用方法,所以不会把所有的题目全都写一遍题解,还是主要写Crypto板块的一些题解。感觉有些题还是有记录一下的价值的,在复习的同时也可以把那些做题时没太深究的题深入研究一下。
Crypto
一次就好
先看题目:
from Crypto.Util.strxor import strxor |
大概就是用一次性密码本加密flag,将key再用rsa加密。rsa加密时用的是相邻素数,因此用yafu很快就能分解N得到p和q然后解密出一次性密码本的key。再用该key和c进行异或就能得到flag。当时就是通过这道题了解到了yafu这个工具。
解题脚本:
import gmpy2 |
0rsa0
题目:
from Crypto.Util.number import * |
两个常见的rsa攻击套路。
flag被分为两段分别加密。enc1是低指数小明文攻击。由于$e$比较小(只有3),明文的$e$次方仍然小于$n$,加密得到的$c=m^{e}$。因此将c直接开e次方即可得到flag。解题脚本如下:
import gmpy2 |
enc2是dp泄露攻击。
import gmpy2 |
因此得到flag:
moectf{T8uus_23jkjw_asr_3d32awd!5f&#@sd}
Weird_E_Revenge
先看题目:
from Crypto.Util.number import * |
flag经过填充后分别用n1、n2加密,而n1、n2的因数p、q、r都是已知的,似乎解密需要的参数都是已知的。先尝试用RSA基本解密方法解。
from gmpy2 import invert |
在解密过程中无法找到$e$关于$(p-1)(q-1)$或者关于$(q-1)(r-1)$的逆元。不能用基本方式解密。这是因为$e$与$(q-1)$不互素,从而与$(p-1)(q-1)$和$(q-1)(r-1)$都不互素,因此解不出逆元。但观察题目可以发现相同的明文由不同的n1、n2分别加密了两次。用同余式可以表示成这样:$$m^{e}\ \equiv\ c_{1}\ mod\ n_{1}$$$$m^{e}\ \equiv\ c_{2}\ mod\ n_{2}$$
又$n_{1}=p\cdot q$,$n_{2}=q\cdot r$。由同余式的性质可以得到如下的同余方程式组:$$m^{e}\ \equiv\ c_{1}\ mod\ p$$$$m^{e}\ \equiv\ c_{2}\ mod\ r$$
对于这样的同余方程式组,可以用中国剩余定理(CRT)求出一个与$m^{e}$等价的特解$x$。然后可以用$e$关于$(p-1)(r-1)$的逆元解密$x$得到明文,从而避开与$e$不互素的$(q-1)$。
python的第三方库libnum有函数solve_crt可以直接调用。解题脚本如下:
from gmpy2 import invert |
Signin
题目:
from Crypto.Util.number import * |
虽然是签到题,但却在很长一段时间内一直都没做出来。后来才从在HNCTF上遇到的cot1007师傅学到了此类情况的做法。
题目看起来很友好,加密用到的所有的数都直接给出来了。但$e$与$q-1$不互素,是无法用常规做法解出flag的。也不能像Weird_E_Revenge一样用中国剩余定理求解。
实际上解法很简单。虽然$e$与$q-1$不互素,但其实$m<p$。因此可以直接将$c\ mod\ p$,将问题变为$m^{e}\ \equiv\ c’\ mod\ p$,绕过有问题的$q$。解题脚本:
from Crypto.Util.number import long_to_bytes |
下面几道题先把自己的解题脚本贴在这,解题思路以后一定补完(
Smooth
解题脚本:
import gmpy2 |
ezcbc
解题脚本:
from Crypto.Util.number import * |
ezhash
babyNET
part1
解题脚本:
from Crypto.Util.number import long_to_bytes |
part2
解题脚本:
from Crypto.Util.number import long_to_bytes |
MiniMiniBackpack
解题脚本:
from Crypto.Util.number import long_to_bytes |
不止一次
Misc
Hamming
解题脚本:
noisemsg = [......] # 输入略 |