杂记(二)
记录些近期做的题目
2022西湖论剑
2022西湖论剑——LockbyLock
task.py
1 | from Crypto.Util.number import * |
审计代码得知
服务器给了两次proxyProcedure()
的机会
通过proxyProcedure()
我们可以得到3段密文
于是,我们输入2
可得
再输入4
可得
把得到的两组密文进行组合,求得n。eg:
再求解离散对数获得
再共模攻击
exp
1 | from Crypto.Util.number import * |
2022西湖论剑——MyErrorLearn
task.py
1 | from Crypto.Util.number import * |
已知
则有
上面的式子乘
化简得
用二元copper可解出
再代入得
由于p不一定是素数,所以求逆元的时候可能不存在,多跑几次即可
exp
1 | from Pwn4Sage.pwn import * |
2022西湖论剑——MyErrorLearnTwice
task.py
1 | from Crypto.Util.number import * |
与上题不同之处在于
但328bit相对p的大小依旧是小量,而且可获得的数据有15组,可以用格解决
类似上题的推导
化简得
我们每两组数据进行一次化简,便有了
展开得
记
则有
即
构造格
本人在做题的时候在格的规格这里有卡顿,如有同样疑惑的师傅可以静下来思考一下再往下。
为了提高规约成功的概率,对格进行调平,最后的格如下:
其中
得到
exp
1 | from Pwn4Sage.pwn import * |
2023西湖论剑
2023西湖论剑——Or1cle
无附件,通过getflag,输入的字符串,长度不是2的倍数,泄露源码
1 | def signature(self,msg): |
猜测得到flag的条件是让verify(signature)
函数返回True
我们能控制的只有signature
非预期
因为verify
没有对0采取处理,而且求逆元用的不是inverse
orinvert
,而是
1 | s_inv = pow(s, secp256k1.q - 2, secp256k1.q) |
因此,传入128个0即可让verify(signature)
返回True
网鼎杯 2022 玄武组——crypto557
task.py
1 | from Crypto.Util.number import * |
题目根据m从低到高位为0或1给出不同的enc
所以我们解题思路也是通过enc来判断m当前位是0或1,本题用上二次剩余的性质
根据《信息安全数学基础》中的定理:如果
所以我们做出下面分析
- 如果
是模p的平方剩余,则 (这条是平方剩余的性质),可推出 也就是 , 就是 ,这个推导说明如果 是模p的平方剩余,则c也是模p的平方剩余 - 如果
不是模p的平方剩余,则c是模p平方剩余的概率也为0.5,因为 ,这个c也是 的数 - 再结合上m从低位到高位是0或1,可以推断出:
- c是模p平方剩余的概率是
,对应的是x是模p平方剩余,且 当前位数是1,添入enc的是 ,或m当前位数是0,添入enc的是 - c不是模p平方剩余的概率是
,对应的是x不是模p平方剩余,所以c没有规律,就按照性质得知c是模p平方剩余的概率为
所以根据每组c是模p平方剩余的概率可以判断出这组c对应的x是否为模p的平方剩余。
把所有是模p平方剩余的x提取出来之后,我们再作出下面的分析:
- 已知x是模p的平方剩余
- 如果当前的m是1,则添入enc的是
,应当也是模p的平方剩余 - 如果当前的m是0,则添入enc的是
,它是模p平方剩余的概率是
我们可以遍历所有x,判断当前的
exp
1 | from Crypto.Util.number import * |
网鼎杯 2022 青龙组——Grasshopper
task.py
1 | from Crypto.Util.number import * |
先理解题目的运算:
先求
再求
再求
再求
然后
exp
1 | from Crypto.Util.number import * |
osuCTF
剪枝
task.py
1 | from Crypto.Util.number import isPrime,bytes_to_long |
从低位往高位爆破即可,因为题目生成的素数只含7,2
,所以每次爆破只需要2个数字,爆破起来蛮快的
exp
1 | from Crypto.Util.number import * |
LCG泄露低位
task.py
1 | from Crypto.Util.number import getPrime # https://pypi.org/project/pycryptodome/ |
由
拆成高低位来写,则有
化简得
于是有
即
写到这里是为了后面更好理解
回到题目,简单来写就是
即
构造格
exp
1 | from Crypto.Cipher import AES |
HSCCTF 2024
EzMath
task.py
1 | from Crypto.Util.number import * |
先从第二个assert算出jl
同除
看了la佬博客才知道这是著名的丢番图方程,la佬也给出了论文
根据论文有
然后便能解出jl
再根据第一个assert
化简以后得到
推导不太流利的话,可以用下面函数计算
1 | R.<x,y,z> = PolynomialRing(ZZ) |
然后计算出
exp
1 | from Crypto.Util.number import * |
simple_rsa
task.py
1 | # # sage |
首先需要关注的是 # (inc^3+79*inc^2+65*x+13) % 1009 == 75 and inc is the least number of the solutions
这里其实就是解方程x
对应的就是inc
解方程后可以知道inc是427,然后根据生成素数的方式得知这是个RSA backdoor
参考RSA Backdoor Viability (icewizard4902.github.io),套一下脚本
exp
1 | class FactorRes(object): |
flag{!ep1y_@tree}
预览: