首页 > 其他 > 详细

[CISCN2018]oldstreamgame

时间:2020-12-12 18:46:43      阅读:85      评论:0      收藏:0      [点我收藏+]

一道lfsr类型的题目(一开始纠结于flag的长度问题,32位怎么求出flag,但是flag不是字符而是用16进制来表示的,那就刚好了)
题目代码如下:

flag = "flag{xxxxxxxxxxxxxxxx}"
assert flag.startswith("flag{")
assert flag.endswith("}")
assert len(flag)==14

def lfsr(R,mask):
    output = (R << 1) & 0xffffffff
    i=(R&mask)&0xffffffff
    lastbit=0
    while i!=0:
        lastbit^=(i&1)
        i=i>>1
    output^=lastbit
    return (output,lastbit)

R=int(flag[5:-1],16)
mask = 0b10100100000010000000100010010100

f=open("key","w")
for i in range(100):
    tmp=0
    for j in range(8):
        (R,out)=lfsr(R,mask)
        tmp=(tmp << 1)^out
    f.write(chr(tmp))
f.close()

因为以及给出了mask我们直接求逆就可以得出flag了,sage代码如下(将求出的二进制转为16进制就可以了,提交flag的时候前面加上0x)

MS=MatrixSpace(GF(2),32,32)
MSS=MatrixSpace(GF(2),1,32)
mask=‘10100100000010000000100010010100‘
cm=[]
for i in range(31):
        cm.append(0)
cm.append(mask[0])
index=0
for i in range(31):
        for j in range(32):
                if j==index:
                        cm.append(1)
                else:
                        if j==31:
                                cm.append(mask[i+1])
                        else:
                                cm.append(0)
        index+=1
c=MS(cm)
try:
        c_inv=c.inverse()
except ZeroDivisionError as e:
        print ‘no‘
        exit
res=‘‘
a=[0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,0,0]
for i in range(32):
        t=a[:32]
        t=MSS(t)
        r=(t*c_inv)[0][0]
        a.insert(0,r)
        res=str(r)+res
print res

[CISCN2018]oldstreamgame

原文:https://www.cnblogs.com/Mr-small/p/14125439.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!