from Crypto.Util.number import * from gmpy2 import * from pwn import *
defcrt(n_list, c_list): n = 1 for i in n_list: n *= i N = [] for i in n_list: N.append(n//i) t = [] for i inrange(len(n_list)): t.append(inverse(N[i], n_list[i]))
summary = 0 for i inrange(len(n_list)): summary += N[i] * t[i] * c_list[i] summary %= n
return summary
# 告诉了e时,循环次数就是e,range(e) ''' io = remote('node4.anna.nssctf.cn', 28649) e = 127 n_list = [] c_list = [] for i in range(127): io.sendlineafter(b'input>', b'1') n = int(io.recvline().decode()[2:]) c = int(io.recvline().decode()[2:]) n_list.append(n) c_list.append(c) M = crt(n_list, c_list) m = gmpy2.iroot(M, e)[0] print(long_to_bytes(m)) '''
# 没有告诉e时,需要爆破
k = 1000 io = remote('node4.anna.nssctf.cn', 28649) n_list = [] c_list = [] for i inrange(k): print(i) # 这里把接受数据的序数打印出来了,用于可视化进程 io.sendlineafter(b'input>', b'1') n = int(io.recvline().decode().split(':')[1]) # 因为输出是 n: 6423142657687, 转换为字符串后按:分割去后面数字部分, 等价于[3:],因为有个空格 c = int(io.recvline().decode()[3:]) n_list.append(n) c_list.append(c) if i > 2: M = crt(n_list, c_list) m,_ = gmpy2.iroot(M, i) # iroot返回两个值:开根的结果和是否完全开根,这里把结果赋值给m,true或false给_,用于直接判断 if _: print(i, long_to_bytes(m)) break