streamgame2
from flag import flag
assert flag.startswith("flag{")
assert flag.endswith("}")
assert len(flag)==27
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")
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()
又是LFSR
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
wtc_rsa_bbq
用rar打开得到
明显的RSA
先公钥解析,得到n、e,然后分解n得到p、q,最后解RSA
import Crypto.PublicKey.RSA as RSA
key = RSA.importKey('''-----BEGIN PUBLIC KEY-----
MIIEUzANBgkqhkiG9w0BAQEFAAOCBEAAMIIEOwKCBDIGLT1hySRSYwFH6JZw
//8CAwEAAQ==
-----END PUBLIC KEY-----''')
n = key.n
e = key.e
#print (f'n={n}')
#print (f'e={e}')
import gmpy2
from Crypto.Util.number import *
p=2^4244*699549860111847-1
q=2^4244*699549860111847+1
c = bytes_to_long(open('cipher.bin','rb').read())
phi = (q-1) * (p-1)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c,d,n)
print(m)
print(long_to_bytes(m))
但是运行得到的是
猜测时储存时大小端问题,将最后两行代码改为
print(int(m).to_bytes(10,byteorder='little',signed=False).decode())
但是显示错误:OverflowError: int too big to convert
搜了其他师傅的解题方法,发现他们大都是用工具解的,
python3 RsaCtfTool.py --publickey ~/Desktop/key.pem --uncipherfile ~/Desktop/cipher.bin
就能得到一大串,flag在最后:flag{how_d0_you_7urn_this_0n?}