streamgame

看起来好像不怎么聪明的样子。
key文件,老样子,拖入16进制编辑器查看:
在这里插入图片描述

from flag import flag

assert flag.startswith("flag{")

assert flag.endswith("}")

assert len(flag)==27

#flag=flag{XXXXXXXXXXXXXXXXXXXXX}

def 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=0x100002



f=open("key","ab")  #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()

https://blog.csdn.net/qq_38412357/article/details/79696263
https://blog.csdn.net/qq_39153247/article/details/80144695

加密的过程不用管
只看
最后的
你的一个原始二进制的值,R经过好一顿lfsr函数的折腾,变成一个新的r和out 又一顿折腾变成tmp{1} tmp装的8位数字,凑成一个整数十进制的,,这个数字和Flag比较

def 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)
 
key=[85,56,247,66,193,13,178,199,237,224,36,58]
mask=0b1010011000100011100
 
for k in range(2**19):
    R=k;
    a=''
    judge=1
    for i in range(12):
        tmp = 0
        for j in range(8):
            (k, out) = lfsr(k, mask)
            tmp = (tmp << 1) ^ out
        if(key[i]!=tmp):
           judge=0
           break
    if(judge==1):
        print 'flag{'+bin(R)[2:]+'}'
        break

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值