2021 XCTF Guesskey
阿新 • • 發佈:2021-01-20
Guess key
下載附件,是一段程式碼,分析如下:
from random import randint import os from flag import flag N=64 key=randint(0,2**N) # 0到2的64次方中隨機取一整數 print key key=bin(key)[2:].rjust(N,'0') # key取二進位制,只取64位,左側補0 count=0 while True: p=0 q=0 new_key='' zeros=[0] for j in range(len(key)): if key[j]=='0': #在key中篩選0 zeros.append(j) #如果有0,zeros列表就補上0的位置號,最大64,最小0 p=zeros[randint(0,len(zeros))-1] #在zeros列表中隨機取一個字串 q=zeros[randint(0,len(zeros))-1] #在zeros列表中隨機取一個字串 try: mask=int(raw_input("mask:")) #輸入mask except: exit(0) mask=bin(mask)[2:] # mask變成二進位制 if p>q: tmp=q q=p p=tmp #使p<q cnt=0 for j in range(0,N): # 在key中迴圈 if j in range(p,q+1): # 在p到q中迴圈 new_key+=str(int(mask[cnt])^int(key[j])) #如果j在p到q中,則newkey +=(mask中的值與key中的值異或) else: new_key+=key[j] # 如果j不在p到q中,則直接將key賦值給newkey cnt+=1 cnt%=len(mask) key=new_key try: guess=int(raw_input("guess:")) except: exit(0) if guess==int(key,2): count+=1 print 'Nice.' else: count=0 print 'Oops.' if count>2: print flag
在下面這段程式碼中:
for j in range(0,N): # 在key中迴圈
if j in range(p,q+1): # 在p到q中迴圈
new_key+=str(int(mask[cnt])^int(key[j])) #如果j在p到q中,則newkey +=(mask中的值與key中的值異或)
else:
new_key+=key[j] # 如果j不在p到q中,則直接將key賦值給newkey
發現只有當j 在p和q之間時,newkey會與原來的key不一樣。而且變換機制是由我們的輸入決定的,所以我們就要控制我們的輸入,儘可能的減少改變。