1. 程式人生 > 其它 >2021 XCTF Guesskey

2021 XCTF Guesskey

技術標籤:XCTF安全

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不一樣。而且變換機制是由我們的輸入決定的,所以我們就要控制我們的輸入,儘可能的減少改變。

發現當我們使mask為“0”時,newkey與原來key一致。而且,當我nc連線時,會將原來的key反饋給我們。這樣,我們就能得到flag了。

在這裡插入圖片描述