首页 > 编程知识 正文

攻防世界 Crypto高手进阶区 4分题 streamgame2,攻防世界高手进阶区

时间:2023-05-06 10:56:43 阅读:187774 作者:719

前言

继续ctf的旅程
攻防世界Crypto机灵的荔枝进阶区的4分题
本篇是streamgame2的writeup

发现攻防世界的题目分数是动态的
就仅以做题时的分数为准了

解题过程

得到一个key文件和一段python

from flag import flagassert flag.startswith("flag{")assert flag.endswith("}")assert len(flag)==27def lfsr(R,mask): output = (R << 1) & 0xffffff i=(R&mask)&0xffffff lastbit=0 while i!=0: lastbit^=(i&1) i=i>>1 output^=lastbit return (output,lastbit)R=int(flag[5:-1],2)mask=0x100002f=open("key","ab")for i in range(12): tmp=0 for j in range(8): (R,out)=lfsr(R,mask) tmp=(tmp << 1)^out f.write(chr(tmp))f.close()

和攻防世界 Crypto机灵的荔枝进阶区 3分题 streamgame1
一脉相承

爆破就完事了

def check(list1, list2): for i in range(12): if list1[i] != list2[i]: return False return True def lfsr(R ,mask): output = (R << 1) & 0xffffff #将R向左移动1位,nrdsy(0xffffff)='0b111111111111111111111111'=0xffffff的二进制补码 i=(R&mask)&0xffffff #按位与运算符&:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 lastbit=0 while i!=0: lastbit^=(i&1) #按位异或运算符:当两对应的二进位相异时,结果为1 i=i>>1 output^=lastbit return (output,lastbit) if __name__ == '__main__': f = open('key','rb') content = f.read() s_list = [] for c in content: s_list.append(c) print(s_list) mask = 0x100002 for i in range(1 << 21): print(i) tmp_list = [] R = i for j in range(12): tmp = 0 for k in range(8): (R, out) = lfsr(R, mask) tmp = (tmp << 1) ^ out # 按位异或运算符:当两对应的二进位相异时,结果为1 tmp_list.append(tmp) if (check(s_list, tmp_list)): print(nrdsy(i))

得到flag:flag{110111100101001101001}

结语

2018强网杯里streamgame是个系列

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。