[*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原本的值

 

posted @ 2021-01-22 22:39  1jzz  阅读(155)  评论(0)    收藏  举报