[*CTF 2021]GuessKey
from random import randint import os from flag import flag N=64 key=randint(0,2**N) print key key=bin(key)[2:].rjust(N,'0') count=0 while True: p=0 q=0 new_key='' zeros=[0] for j in range(len(key)): if key[j]=='0': zeros.append(j) p=zeros[randint(0,len(zeros))-1] q=zeros[randint(0,len(zeros))-1] try: mask=int(raw_input("mask:")) except: exit(0) mask=bin(mask)[2:] if p>q: tmp=q q=p p=tmp cnt=0 for j in range(0,N): for j in range(0,N): if j in range(p,q+1): new_key+=str(int(mask[cnt])^int(key[j])) else: new_key+=key[j] 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
代码分析:
生成随机数,然后补全成64位2进制,如果哪一位二进制的值为0那么就会把下标加入到zeros中,并且随机取出两个下标值,在这个区间中使用输入的mask值进行异或,然后需要你解出这段二进制数字的十进制值,并且需要连续两次成功解答出才输出flag
解题思路:
因为mask可控,然后将mask值与p、q区间的二进制值进行异或处理,如果mask为0的话那么进行异或之后的值是不变的,所以guess就是key原本的值


浙公网安备 33010602011771号