BUUCTF刷题笔记(crypto)
[V&N2020 公开赛]Fast
题目:
1 | |
分析题目,我们发现给了解密函数,只差p和q,我们的目标就是去求p、q。又注意到g1和g2的生成,指数上分别有(p-1)和(q-1),很容易想到费马小定理,下面是推导过程:
$g1 = g^{r1*(p-1)} \mod N$
$g1 = g^{r1*(p-1)} \mod p$
费马小定理后得到下式
$g1 = 1 \mod p$
即 g1 = k * p ,所以 gcd(g1-1,N),就可以得到p,q的话同理
脚本:
1 | |
[DASCTF2024八月开学季!新生逐浪,热血向前]EZsignin
题目:
1 | |
从sb = (B_pri_r + retbar(B_pub_R) * B_pri_w) % n式子入手,能容易看出是hnp问题
sbl - Brl = retbar(B_pub_R) * B_pri_w + (brh - sbh)
与e = rx + c格式一致,直接构造格
求出短向量后,会发现一直是错的,我在生成十几组数据尝试后,发现LLL算出来的低32位(也有到33位)是错的,我一开始的思路是直接爆破低33位,试了很久没解出来
查了wp后才知道,是要爆破低36位(我试的样本数还是太少了…),因为低36bit位直接爆破所需时间太长,用了BSGS算法和中间相遇攻击
脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77import hashlib
from Crypto.Util.number import *
from Crypto.Cipher import AES
B_pub_W=(56142839234500040174315077324489019612, 143186177525574678948140963663687495447)
LS= [12160779, 70634852, 136488679, 93279448, 51769705, 99408367, 94011238, 46255543, 136054320, 126842658]
LR= [117789932, 85602320, 136131278, 85538539, 33115646, 15821127, 122073977, 40205177, 40509142, 121833940]
BR= [(43128875586771925869851532015581155657, 108714366549720544283054523544596695631), (166053844834143846221197595138208659402, 9389299139547698081250285594708260233), (83160043610860066750778648875060399604, 160655466348101518011620435983302563358), (18306927902958362110653472691194540502, 141566997533915037448387258113883793369), (124719869188706449552550102421264489653, 111266021208672789646176095367638959348), (62115794167524204331339724293036031704, 24476842210910012261000793337134128911), (57017187772347635647835418540384524017, 149273114828279413180900590599119201032), (141865913804035015431129030802262884043, 11219445710980991629921733217597739715), (35994282847505215202392163277052083355, 5366425669461724819918825109516828913), (72621299937996657982583201267406651177, 39297013522202608324989011761142875947)]
c = b'\xd7\x8c\xf1Yx\x05W\x8ckq\xfdb\xd5\x81K"\xe7q\x88\x18\xedq\x9f\xcap\x1cTB\xc9)\xe1c\xf4~\x7f\xccwh\xfe\t\xbf\xb2!\xde\x84\xeeO\x0f8\xd1\xac\xbc\x1c \xf0F\x0c\x00\xc9\xa7\x9e\x06\xdan'
p = 174523845247570741054964008585718839267
E = EllipticCurve(GF(p), [0, 486662, 0, 1, 0])
G=E(2247961404505753398791635923994899528, 108711418033303501028455466081133667288)
n=G.order()
Cofactor = E.order() // n
f = 128+1
lambda_ = 100
def retbar(P):
index = (f + 1) // 2
return (int(P[0]) % (2 ^ index) + 2 ^ index) % n
C = []
for i in range(len(LS)):
C.append((LR[i] << lambda_)-(LS[i] << lambda_))
#print(C)
fR = [retbar(i) for i in BR]
#print(fR)
LH = identity_matrix(10) * n
LL = matrix([[1,0],[0,1]])*matrix([fR,C])
#print(fR[0].nbits())# 66
#print(n.nbits())# 128
RL = matrix([[2^100/2^128,0],[0,2^100]])
x = 0
M = block_matrix([[LH,0],[LL,RL]])
# print(M)
res = M.LLL()
for r in res:
if r[-1] == 2^100:
# print(r)
x = r[-2] * 2 ^ 128 / 2^100 % n
print(x)# 1178130499626730132053516695382476673
x = x >> 36 << 36
# 爆破低36位
# 可以看成 B_pub_W = x * G + y * G
# y = high * 2 ^ 18 + low
print(x)
B_pub_W = E(B_pub_W)
y_G = B_pub_W - int(x) * G
maps = {}
for i in range(0,2**18):
y_G -= G
maps[y_G[0]] = i + 1
for i in range(0,2**18):
high = (i << 18) * G
if high[0] in maps:
# print(high)
# print("yes")
y = (i << 18) + maps[high[0]]
B_pri_w = x + y
H=hashlib.md5()
H.update(long_to_bytes(B_pri_w))
key=H.hexdigest().encode()
sys = AES.new(key,AES.MODE_ECB)
m = sys.decrypt(c)
print(m)
break
# b'\x01\x02\x03\x00\x00\x00\x00DASCTF{C0ngRatul4tion5_On_y0ur_SuCc3ssfuL_S1gN_1n}\x00\x00\x00\x00\x00\x00\x00'
[NewStarCTF 2023 公开赛道]School of CRC32
1 | |
题目返回target,接收我们发送的数据后经过crc32,校验是否通过(该过程循环100次)。因为首次接触crc32算法,先去了解下源码。
crc32算法源码:
1 | |
将c代码转成python
1 | |
根据源码,我们可以发现,crc32是种迭代的算法(crc32算法叫循环冗余校验,是一种常用的校验算法)。
我的思路是:题目给的target是32位,也就是4字节,直接用中间相遇攻击,从target逆推爆破每个字节,下面是我的函数
1 | |
遇到的问题是,这个函数每次只能爆破一字节,而且只是将所有可能的结果全部存贮在res表中,一开始我试了将decode函数迭代,但并没有成功,在看了大佬的wp(后附)后才有所思路, 下面直接贴大佬的wp([BUUCTF NewStar 2023] week5 Crypto/pwn_[newstarctf 2023 公开赛道]school of crc32-CSDN博客)。
1 | |
反思:在遇到新算法的时候可以多去看看算法的源码实现,并了解了解可能的攻击思路