flag = b'xxx' n0 = 30798082519452208630254982405300548841337042015746308462162479889627080155514391987610153873334549377764946092629701 g = 91289086035117540959154051117940771730039965839291520308840839624996039016929
defgift(): lcg = LCG() outputs = [] for i inrange(30): outputs.append(int(lcg.next())) return outputs, lcg.a
gift, a = gift()
defcheck(str1,str2): key = bin(a)[2:] test = [] for i inrange(len(key)): if key[i] == '0': test.append(str1[i] == str2[i]) returnall(test)
defhash(msg): key = bin(a)[2:] n = n0 msg = list(map(ord,msg)) for i inrange(len(msg)): if key[i] == '1': n = g * (2 * n + msg[i]) else: continue n = n & ((1 << 383) - 1) return (n - 0xdeedbeef114514) % (1 << 100)
MENU = br''' <OPTION> '''
classTask(socketserver.BaseRequestHandler): def_recvall(self): BUFF_SIZE = 2048 data = b'' whileTrue: part = self.request.recv(BUFF_SIZE) data += part iflen(part) < BUFF_SIZE: break return data.strip()
defproof_of_work(self): rounds = 1000 pseudo_prime = int(self.recv(prompt=b'[+] Plz Tell Me your number: ')) if isPrime(pseudo_prime): self.send(b"\nNo! it's a prime, go away!") self.request.close() for i inrange(rounds): ifpow(randint(2, pseudo_prime), pseudo_prime - 1, pseudo_prime) != 1: self.send(b"\nYou failed in round " + str(i + 1).encode() + b', bye~~') self.request.close() self.send(b"\nCongratulations, you have passed the proof_of_work!\n") returnTrue
defhandle(self): signal.alarm(300) step1 = self.proof_of_work() ifnot step1: self.request.close() self.send(banner) self.send(b"\nNew challenge now! Please give me 2 diff strings whose hashes are the same~~") self.send(b'Here is my gift for you: \n' + str(gift).encode()) string1 = self.recv().decode() string2 = self.recv().decode() iflen(string1) < 70orlen(string2) < 70: self.send(b"\nNo! Too short!") self.request.close() ifnot check(string1,string2): self.send(b"\nNo! I do not like!") self.request.close() if string1 == string2: self.send(b"\nNo! They are the same one!") self.request.close() ifhash(string1) == hash(string2): self.send(b'\nGood job~ Here you are!') self.send(flag) self.send(b"\nConnection has been closed.") self.request.close()
from pwn import * from sage.allimport * context.log_level = 'debug' sh=remote('node5.buuoj.cn',26391) sh.recvuntil(b':') sh.sendline(b'148809159554409110476163772315329170997830985215359063220293349706160369860802335922266079601') sh.recvuntil(b'[') arr=eval(b'['+sh.recvline(keepends=False)) p=next_prime(1<<240) A=[arr[i]**3%p for i inrange(29)] B=[arr[1+i] for i inrange(29)] M=[[p*(i==j) for j inrange(31)]for i inrange(31)] M[0][0],M[1][1]=2**(230-85),2**230 for i inrange(29): M[0][2+i]=A[i] M[1][2+i]=B[i] M=matrix(ZZ,M) M3L=M.LLL() vec=M3L[0] a=abs(vec[0]) assert a%(2**(230-85))==0 a=(vec[0])>>(230-85) print(a) difflen=bin(a).count('1') print(difflen) n0 = 30798082519452208630254982405300548841337042015746308462162479889627080155514391987610153873334549377764946092629701 g = 91289086035117540959154051117940771730039965839291520308840839624996039016929 defH(msg): key = bin(a)[2:] n = n0 msg = list(map(ord,msg)) for i inrange(len(msg)): #print(i) if key[i] == '1': n = g * (2 * n + msg[i]) else: continue n = n & ((1 << 383) - 1) return (n - 0xdeedbeef114514) % (1 << 100) defgetcollision(n): M=[[i==j for j inrange(n+1)]for i inrange(n+1)] M[-1][-1]=2**128 for i inrange(n): M[i][-1]=2**(n-i)*Integer(pow(g,n-i,2**128))%(2**128) M=matrix(ZZ,M) M3L=M.LLL() vec=[] for v in M3L: if(v[-1]==0): vec.append(v) return vec detla=getcollision(difflen)[0] s=bytes([80]*85) t=[80]*85 cur=0 table=bin(a)[2:] for i inrange(85): if(table[i]=='1'): t[i]+=detla[cur] cur+=1 t=bytes(t) print(s) print(t) sh.recvuntil(b':') sh.sendline(s) sh.recvuntil(b':') sh.sendline(t) print(sh.recvall(timeout=500)) #DASCTF{S0rry_But_this_1s_My_revenge}
RF600=RealField(600) A=matrix(RF600,A) b=vector(RF600,[b[i][0] for i inrange(len(b))]) x=A.solve_right(b) xreg=[x[i].round() for i inrange(len(x))] q=sum([xreg[i]*256**i for i inrange(len(xreg))]) print(q) #82562676145944350609535127612846198515707028561842371207246482755300888479199
import os from random import getrandbits from hashlib import sha256, md5 from Crypto.Util.number import * from Crypto.Cipher import AES from Crypto.Util.Padding import pad from secret import flag
classShamir: def__init__(self, pbits, noise_bit, n, m): self.pbits = pbits self.noise_bit = noise_bit self.n = n self.m = m self.p = getPrime(pbits) P.<x> = PolynomialRing(Zmod(self.p)) self.poly = P([bytes_to_long(sha256(os.urandom(32)).digest()) for i inrange(self.n)])
defsample(self): t = getrandbits(self.pbits) y = int(self.poly(t)) noise = getrandbits(noise_bit) return (t, y | noise)
defget_msg(self): res = [] for i inrange(self.m): res.append(self.sample()) return res
pbits = 400 noise_bit = 32 n = 100 m = 75
shamir = Shamir(pbits, noise_bit, n, m) coefficient = shamir.poly() key = "".join([str(i) for i inlist(coefficient)[1:]]) key = md5(key.encode()).digest() aes = AES.new(key = key, mode = AES.MODE_ECB) ct = aes.encrypt(pad(flag, 16))
withopen("data.txt", "w") as f: f.write(str(shamir.p)+'\n') f.write(str(shamir.get_msg())+'\n') f.write(str(bytes_to_long(ct))+'\n')
from Crypto.Util.number import * from hashlib import sha256 import socketserver import signal import string from Crypto.Random import random from Crypto.PublicKey import DSA
defsign(self, m): k = random.StrongRandom().randint(1, self.q - 1) self.k.append(k) h = bytes_to_long(sha256(m).digest()) r = pow(self.g, k, self.p) % self.q s = inverse(k, self.q) * (h + self.x * r) % self.q return r, s
defverify(self, m, signature): r, s = signature if (not (1 <= r <= self.q - 1)) or (not (1 <= s <= self.q - 1)): returnFalse z = bytes_to_long(sha256(m).digest()) w = inverse(s, self.q) u1 = (z * w) % self.q u2 = (r * w) % self.q v = (pow(self.g, u1, self.p) * pow(self.y, u2, self.p)) % self.p % self.q return r == v
defverify(self): m = self.recv(b'message:') r = int(self.recv(b'r:')) s = int(self.recv(b's:')) signature = (r, s) if m == b"I'm Admin.I want flag.": if myDSA.verify(m, signature): self.send(b'Hello there.This is what you want.') flag = open('flag').read() self.send(flag.encode()) else: self.send(b'Who are U?Get out!') returnFalse else: self.send(b'Who are U?Get out!')
from pwn import * from hashlib import sha256 from sage.allimport * from Crypto.Util.number import * context.log_level = 'sdebug' sh=remote('node5.buuoj.cn',25739) sh.recvuntil(b'sha256(XXXX+') s16=sh.recvuntil(b')')[:-1] sh.recvuntil(b'==') s64=sh.recvline(keepends=False).strip() defgetyzm(s16,s64): table='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' for i in table: for j in table: for k in table: for l in table: if(sha256((i+j+k+l+s16).encode()).hexdigest()==s64): return i+j+k+l print(s16) print(s64) yzm=getyzm(s16.decode(),s64.decode()) sh.sendline(yzm.encode()) sh.recvuntil(b':') sh.sendline(b'1') sh.recvuntil(b's:') r1,s1=eval(sh.recvline(keepends=False)) sh.recvuntil(b's:') r2,s2=eval(sh.recvline(keepends=False)) print(r1,s1) print(r2,s2)
sh.recvuntil(b':') sh.sendline(b'3') arr=[] for i inrange(4): sh.recvuntil(b'=') arr.append(eval(sh.recvline(keepends=False))) p,q,g,y=arr print(p,q,g,y)
from Crypto.Util.number import * from hashlib import * from secret import secretkey,flag,ezmath_flag import socketserver import os import signal import string assertlen(bin(secretkey)) == 169
defverify(self, m, y, sig): r, s = sig if (not (1 <= r <= self.q - 1)) or (not (1 <= s <= self.q - 1)): returnFalse z = bytes_to_long(sha256(m).digest()) w = inverse(s, self.q) u1 = (z * w) % self.q u2 = (r * w) % self.q v = (pow(self.g, u1, self.p) * pow(y, u2, self.p)) % self.p % self.q return r == v
defsign(self, m , x): z = bytes_to_long(sha256(m).digest()) while1: k = self.Random.GetNext() % self.q r = pow(self.g , k, self.p) % self.q s = (inverse(k, self.q) * (z + x * r)) % self.q if (s != 0) and (r != 0) : return (r, s)
RANDOM = PseudoRandomNumbersGenerators(getPrime(120),getPrime(120)) DSA = DigitalSignatureAlgorithm(RANDOM) x = secretkey y = pow(DSA.g,x,DSA.p)
MENU = br''' [S]ign. [V]erify(or get flag). [I]dentify. [E]xit. '''
classTask(socketserver.BaseRequestHandler): def_recvall(self): BUFF_SIZE = 2048 data = b'' whileTrue: part = self.request.recv(BUFF_SIZE) data += part iflen(part) < BUFF_SIZE: break return data.strip()
self.send(b'sign of (dawn) is: ' + str(sign0).encode()) self.send(b'sign of (whisper) is: ' + str(sign1).encode()) self.send(b'sign of (want flag) is: ' + str(sign2).encode())
defidentify(self): rec_key = self.recv(b'flag of ezmath is :') ret = RANDOM.GetSomethingUseful(rec_key == ezmath_flag) self.send(str(ret).encode())
defverify(self): msg = self.recv(b'msg:') r = int(self.recv(b'r:')) s = int(self.recv(b's:')) sig = (r,s) if msg == b"I'm Admin.Plz give me flag!": if DSA.verify(msg,y,sig): self.send(b'Yes Sir!Thank you Sir!') return flag else: self.send(b'Who are U?Get out!') returnFalse else: if DSA.verify(msg,y,sig): self.send(b'Yeah!You sign successfully!') return os.urandom(32)
defhandle(self): proof = self.proof_of_work() ifnot proof: self.request.close() signal.alarm(60) chance = 0 while1: self.send(MENU) option = self.recv(b'\n==plz give me your option==\n[IN]:') if option == b'S': if chance == 0: self.sign() chance += 1 else: self.send(b'ERROR! You only have one time!') elif option == b'V': ret = self.verify() if ret : self.send(b'Your Flag is :' + ret) break elif option == b'I': self.identify() else: break self.request.close()
defBabaisClosestPlaneAlgorithm(L, w): G, _ = L.gram_schmidt() t = w i = L.nrows() - 1 while i >= 0: w -= round((w*G[i]) / G[i].norm() ** 2) * L[i] i -= 1 return t - w
from pwn import * from hashlib import sha256 from sage.allimport * from Crypto.Util.number import * sh=remote('node5.buuoj.cn',25626) sh.recvuntil(b'sha256(XXXX+') s16=sh.recvuntil(b')')[:-1] sh.recvuntil(b'==') s64=sh.recvline(keepends=False).strip() defgetyzm(s16,s64): table='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' for i in table: for j in table: for k in table: for l in table: if(sha256((i+j+k+l+s16).encode()).hexdigest()==s64): return i+j+k+l print(s16) print(s64) yzm=getyzm(s16.decode(),s64.decode()) sh.sendline(yzm.encode()) sh.recvuntil(b'[IN]:') sh.sendline(b'I') sh.recvuntil(b':') sh.sendline(b'vnctf{m4th_5tr#c7Ur3_c4n_b3_e@s&!}') a,b,c=eval(sh.recvline()) sh.recvuntil(b'[IN]:') sh.sendline(b'S') sh.recvuntil(b'is:') r1,s1=eval(sh.recvline(keepends=False).strip()) sh.recvuntil(b'is:') r2,s2=eval(sh.recvline(keepends=False).strip()) sh.recvuntil(b'is:') r3,s3=eval(sh.recvline(keepends=False).strip()) q=4472647834455909529770104132730989588839100614528713206340500723723053959558882981013944744229982694127320650903050192577880127483457037552183906934617833 m1 = b'dawn' m2 = b'whisper' m3 = b'want flag' h1,h2,h3=[bytes_to_long(sha256(i).digest()) for i in [m1,m2,m3]] print(h1,h2,h3) M = matrix( [ [-r1, s1, 0, 0, q, 0, 0, 0,0], [-r2, 0, s2, 0, 0, q, 0, 0,0], [-r3, 0, 0, s3, 0, 0, q, 0,0], [0, a, b, -1, 0, 0, 0, 2**512,q], [Rational(f'2/{2**169}'), 0, 0, 0, 0, 0, 0, 0,0], [0, Rational(f'2/{q}'), 0, 0, 0, 0, 0, 0,0], [0, 0, Rational(f'2/{q}'), 0, 0, 0, 0, 0,0], [0, 0, 0, Rational(f'2/{q}'), 0, 0, 0, 0,0], [0, 0, 0, 0, 0, 0, 0, 0,1] ]).T
M=matrix(M) M3L=M.LLL()
defBabaisClosestPlaneAlgorithm(L, w): G, _ = L.gram_schmidt() t = w i = L.nrows() - 1 while i >= 0: w -= round((w*G[i]) / G[i].norm() ** 2) * L[i] i -= 1 return t - w
C = vector([h1, h2, h3, -c, 1, 1, 1, 1,1]) # target vector A = BabaisClosestPlaneAlgorithm(M3L, C) print(A) x = A[4] / Rational(f'2/{2**169}')
print(x) g=3 k=1 r=g msg=b"I'm Admin.Plz give me flag!" h=bytes_to_long(sha256(msg).digest()) s=((h + x * r))% q sh.recvuntil(b'[IN]:') sh.sendline(b'V') sh.recvuntil(b'msg:') sh.sendline(msg) sh.recvuntil(b'r:') sh.sendline(str(r).encode()) sh.recvuntil(b's:') sh.sendline(str(s).encode()) print(sh.recvall(timeout=500)) #print(s) #print(M3L) #sh.interactive()
from Crypto.Util.number import * from random import getrandbits from uuid import * welcome="Welcome to VNCTF 2023!Hope you can enjoy this challenge!" description='''These days DengFeng want to provide a surprise for Deebato.\n So he come up with an idea...\n That is...\n Designing a DLP!\n Namely Deebato Love Problem!''' begin='''So let's go!\n In 1997, I learned to drive a car...\n'''
defmain(): alarm(300) hello() a,p,order=gen() print("OOOOOOh!I will give you something useful!") print(f"a = {a}") print(f"p = {p}") m=int(input("Please give me your choice:")) secret,c1,c2=get_msg(m,a,p,order) print("OK,here is my gift.") print(f"c1 = {c1}") print(f"c2 = {c2}") ticket=int(input("Please give me the secret:")) if ticket==secret: print("OKOK,it seems that you know Deebato Love Problem well.Here is my flag") print('flag{'+str(uuid4())+'}') else: print("Sorry!You don't understand Deebato Love Problem not at all!I can't give you flag!")
try: main() except Exception as e: print(f"Error : {e}")
题目还给出了提示:
Hint1: cheon discrete log attack
根据关键词 Google 了一圈,发现 eprint 上编号为 2008-300 的论文给出了算法:
#BSGS1 from tqdm import * D=dict() ginv=pow(g,q-2,q) for i in tqdm(range(d1)): u=i v=pow(c2,pow(ginv,i,q),p) D[v]=u u1,v1=None,None for i in tqdm(range(d1)): v=pow(2,pow(g,d1*i,q),p) if(D.get(v,None)): u1,v1=D.get(v,None),i print(u1,v1) break #BSGS2 k0=d1*v1+u1 d2=int(1+sqrt(d).n()) D=dict() g0inv=pow(g0,q-2,q) p1divd=(p-1)//d for i in tqdm(range(d2)): u=i v=pow(c1,pow(g0inv,u*p1divd,q),p) D[v]=u u2,v2=None,None for i in tqdm(range(d2)): v=pow(2,pow(g0,k0+d2*i*p1divd,q),p) if(D.get(v,None)): u2,v2=D.get(v,None),i print(u2,v2) break ans=pow(g0,k0+(d2*v2+u2)*p1divd,q)
d,_,bits1,bits2=findd(q) if(max(bits1,bits2)>=47): sh.close() raise ValueError(f"Find bits {max(bits1,bits2)} that exceed 47!") sh.recvuntil(b'ce:') sh.sendline(str(d).encode()) sh.recvuntil(b'=') c1=eval(sh.recvline(keepends=False)) sh.recvuntil(b'=') c2=eval(sh.recvline(keepends=False)) print(c1,c2) g0=findgen(q) g=pow(g0,d,q) d1=(sqrt((q-1)/d)) d1=int(d1.n()+0.5) #---------BSGS1--------- D=dict() ginv=pow(g,q-2,q) for i in tqdm(range(d1)): u=i v=pow(c2,pow(ginv,i,q),p) D[v]=u u1,v1=None,None for i in tqdm(range(d1)): v=pow(2,pow(g,d1*i,q),p) if(D.get(v,None)): u1,v1=D.get(v,None),i print(u1,v1) break k0=d1*v1+u1 d2=int(1+sqrt(d).n()) D=dict() g0inv=pow(g0,q-2,q) p1divd=(p-1)//d #---------BSGS2--------- for i in tqdm(range(d2)): u=i v=pow(c1,pow(g0inv,u*p1divd,q),p) D[v]=u u2,v2=None,None for i in tqdm(range(d2)): v=pow(2,pow(g0,k0+d2*i*p1divd,q),p) if(D.get(v,None)): u2,v2=D.get(v,None),i print(u2,v2) break ans=pow(g0,k0+(d2*v2+u2)*p1divd,q)