前天在忙着参加*CTF的个人考核,这个比赛只有昨天一天看看题,这个队伍貌似是国际强队(ctftime前五),题目出的较好,还有三题没做希望赛后能够复现.
![](/.com//04/18/CrewCTF2022/1.png)
ez-x0r
附件:
1 | BRQDER1VHDkeVhQ5BRQfFhIJGw== |
附件是一串base64,解密出来是包含控制字符的字节:
1 | b'\x05\x14\x03\x11\x1dU\x1c9\x1eV\x149\x05\x14\x1f\x16\x12\t\x1b' |
题目是异或操作,那么猜测flag就是上边的字节和key异或得到的,但不知道key,可以用flag的起始格式”crew{“来和字节异或得到key:
1 | # getkey |
发现key的每一位都是字符f。遂用脚本解密,完整脚本为:
1 | from base64 import b64decode |
Malleable Metal
1 | from Crypto.PublicKey import RSA |
题目本身考查的是copper,但因为位数没调好,直接非预期就出了.
1 | from gmpy2 import * |
The HUGE e
chall.py:
1 | from Crypto.Util.number import getPrime, bytes_to_long, inverse, isPrime |
out.txt:
1 | p = 127557933868274766492781168166651795645253551106939814103375361345423596703884421796150924794852741931334746816404778765897684777811408386179315837751682393250322682273488477810275794941270780027115435485813413822503016999058941190903932883823 |
由assert pow(c,inverse(e,p-1),p) == m可知,解密的d就等于inverse(e,p-1),但是e又等于pow(e1,pow(e2,e3)),是非常大的数,不做mod无法计算出,但是求e对p-1的逆可以先让e模p-1再计算逆,e的求模过程如下:
这里可以用一次费马小定理,让x模一个phi(p-1),然后计算,而p-1是由小素数乘积得到的,直接用factor就能分解,分解以后计算phi即可.exp:
1 | from gmpy2 import * |
toydl
交互给了公钥,和一堆和特殊的小明文,小密文:
![](/.com//04/18/CrewCTF2022/2.png)
观察发现有些x有这样的关系:pow(a,x1,n) = b pow(b,x2,n) = a 这说明:
那么只需要找几组这样的x1 x2计算x1x2-1,再求gcd,gcd即为phi的k倍,运气好的话,可能就是phi,如果不是phi的话可以除以k(遍历) exp:
1 | from gmpy2 import * |