MSS Revenge
2 minutos de lectura
Este reto es el mismo que MSS, pero con una correción para evitar una solución.
Revisión del reto
El servidor crea un polinomio con coeficientes aleatorios de 256 bits:
El objetivo es encontrar
No podemos recuperar el polinomio completo porque necesitaríamos un mínimo de 31 valores.
Solución
El problema de este reto es que el polinomio se define sobre los enteros. Como resultado, si evaluamos
Sabiendo esto, podemos hacer lo mismo pero con números primos. El objetivo es obtener este sistema de congruencias:
Este sistema de congruencias modulares se puede resolver utilizando el Teorema Chino del Resto (CRT), que generará el valor de
Todos estos números primos deben ser menores que
Implementación
Podemos programar este procedimiento en Python:
io = get_process()
primes, remainders = [], []
for _ in range(19):
p = getPrime(15)
io.sendlineafter(b'query = ', json.dumps(
{'command': 'get_share', 'x': p}).encode())
r = json.loads(io.recvline().decode()).get('y')
primes.append(p)
remainders.append(r % p)
key = crt(primes, remainders)[0]
io.sendlineafter(b'query = ', json.dumps({'command': 'encrypt_flag'}).encode())
io.recvuntil(b'[+] Here is your encrypted flag : ')
data = json.loads(io.recvuntil(b'}').decode())
iv = bytes.fromhex(data.get('iv'))
enc_flag = bytes.fromhex(data.get('enc_flag'))
key = sha256(str(key).encode()).digest()
cipher = AES.new(key, AES.MODE_CBC, iv)
flag = unpad(cipher.decrypt(enc_flag), AES.block_size).decode()
io.success(flag)
Flag
Y aquí tenemos la flag:
$ python3 solve.py 94.237.52.253:33222
[+] Opening connection to 94.237.52.253 on port 33222: Done
[+] HTB{R3venge_0f_7he_sm4ll_thr3sh0ld_!}
[*] Closed connection to 94.237.52.253 port 33222
El script completo se puede encontrar aquí: solve.py
.