Rating:

### Overview

Both can be solved with this solution. The servers sends a timestamp and a few random numbers. The goal is to send back the next number in the sequence.

### Idea

The sequence starts with the very first number after a random seed is set, so we can narrow the search space to seeds that start with it. After getting a few candidates, it is possible to check if the other numbers match by using the provided algorithm. The server doesn't have rate limiting, so we can check just a subset of random seeds and request another batch of numbers if none fit.

### Solution

Step 1: Dump a few pairs of (seed, first_random_number) in a file

```

"

d = {}

i = 0

with open('data.csv') as csvfile:

spamreader = csv.reader(csvfile)

for row in spamreader:

i+=1

# check if in dict

if i == 20796091:

break

if row[0] in d:

d[row[0]].append(row[1])

else:

d[row[0]] = [row[1]]

z = row[0]

print(f"Loaded {i} lines")

while True:

r = requests.post(url)

data = r.text.split("\\n")

data[0] # time

leak = data[1]

if leak in d:

number = os.popen(f"php a.php {len(d[leak])} {' '.join(d[leak])} {' '.join(data[:-2])}").read()

print(f"Number: {number}")

cookies = r.cookies

r = requests.post(url+"submit", data={"next": number}, cookies=cookies)

print(r.text)

if "ENO" in r.text:

exit()

```

## Flags

`ENO{M4sT3r_0f_R4nd0n0m1c5}` - randrevenge

`ENO{PHD_1N_TrU3_R4nd0n0m1c5_516189}` - randrevengerevenge