xorxorxor
1 minuto de lectura
Se nos proporciona un código en Python para cifrar la flag, y nos dan el texto cifrado en hexadecimal:
#!/usr/bin/python3
import os
flag = open('flag.txt', 'r').read().strip().encode()
class XOR:
def __init__(self):
self.key = os.urandom(4)
def encrypt(self, data: bytes) -> bytes:
xored = b''
for i in range(len(data)):
xored += bytes([data[i] ^ self.key[i % len(self.key)]])
return xored
def decrypt(self, data: bytes) -> bytes:
return self.encrypt(data)
def main():
global flag
crypto = XOR()
print ('Flag:', crypto.encrypt(flag).hex())
if __name__ == '__main__':
main()
Flag: 134af6e1297bc4a96f6a87fe046684e8047084ee046d84c5282dd7ef292dc9
Se está empleando cifrado XOR con una clave de 4 bytes. Aquí podemos extraer la clave porque sabemos parte del texto claro (las flags tienen formato HTB{...}). Por tanto, dado que
Pero entonces
Y también
Usaremos esta última ecuación para obtener la clave:
$ python3 -q
>>> from pwn import xor
>>> c = bytes.fromhex('134af6e1297bc4a96f6a87fe046684e8047084ee046d84c5282dd7ef292dc9')
>>> k = xor(c, b'HTB{')[:4]
>>> k
b'[\x1e\xb4\x9a'
Nótese que nos quedamos solo con 4 bytes, porque la clave tiene esta longitud. Ahora somos capaces de descifrar el texto cifrado y obtener la flag:
>>> xor(c, k)
b'HTB{rep34t3d_x0r_n0t_s0_s3cur3}'