Kategori
Krypto
Beskrivning
Det här spelet verkar omöjligt att vinna, men det kanske går att fuska?
Lösning
Ansluter man till utmanings-servern så får man följande input.
██╗ ██╗ ██████╗ ██████╗ ███████╗ █████╗ ████████╗ ██████╗ ██████╗ ██████╗ ███████╗ ██████╗ █████╗ ███╗ ███╗██████╗ ██╗ ██╗███╗ ██╗ █████╗ ██████╗ ██████╗ ██╗ ██╗
██╔╝██╔╝ ██╔════╝ ██╔══██╗██╔════╝██╔══██╗╚══██╔══╝ ██╔═══██╗██╔══██╗██╔══██╗██╔════╝ ██╔════╝ ██╔══██╗████╗ ████║██╔══██╗██║ ██║████╗ ██║██╔═══╝ ██╔════╝██╔═══██╗ ╚██╗╚██╗
██╔╝██╔╝ ██║ ███╗██████╔╝█████╗ ███████║ ██║ ██║ ██║██║ ██║██║ ██║███████╗ ██║ ███╗███████║██╔████╔██║██████╔╝██║ ██║██╔██╗ ██║██║ ██╗ ██║ ██║ ██║ ╚██╗╚██╗
╚██╗╚██╗ ██║ ██║██╔══██╗██╔══╝ ██╔══██║ ██║ ██║ ██║██║ ██║██║ ██║╚════██║ ██║ ██║██╔══██║██║╚██╔╝██║██╔══██╗██║ ██║██║╚██╗██║██║ ██║ ██║ ██║ ██║ ██╔╝██╔╝
╚██╗╚██╗ ╚██████╔╝██║ ██║███████╗██║ ██║ ██║ ╚██████╔╝██████╔╝██████╔╝███████║ ╚██████╔╝██║ ██║██║ ╚═╝ ██║██████╔╝███████╗██║██║ ╚████║╚█████╔╝ ╚██████╗╚██████╔╝██╗ ██╔╝██╔╝
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚══════╝╚═╝╚═╝ ╚═══╝ ╚════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
*** Guess the number and win a prize! ***
Model: MT19937
=========================================
Setting RNG seed...done
What is your guess?
Skriver man in ett nummer som är fel så svarar tjänsten med vilket nummer som var det rätta.
Här kan man även se att psuedo-RNGn som används är MT19937, vilken är sårbar för att förutspå nästa genererade nummer genom att veta de 624 tidigare genererade numren.
För att utnyttja detta kan man samla in de 624 första genererade numren genom att svara fel, och sedan med hjälp av Mersenne Twister Predictor eller liknande generera de nästkommande korrekta numren.
Följande är ett script som kan användas för just detta och hämta flaggan.
from pwn import *
from mt19937predictor import MT19937Predictor
predictor = MT19937Predictor()
r = remote('challs.crate.nu', 16484)
r.recv()
r.recv()
r.recv()
r.recv()
r.recv()
r.recvuntil(b'guess? ')
for _ in range(624):
r.sendline(b'1')
data = r.recvuntil(b'guess? ')
data = data.split(b'\n')[0].split(b' ')
number = int(data[len(data)-1])
print('Adding number:', number)
predictor.setrandbits(number, 32)
r.sendline(str(predictor.getrandbits(32)).encode())
r.recvuntil(b'guess? ')
r.sendline(str(predictor.getrandbits(32)).encode())
print(r.recv())
r.close()
Efter att scriptet körts klart så får man flaggan cratectf{wow_you_must_be_really_lucky}