Rating:

We're told to: nc secretarray.fword.wtf 1337

###### Secret Array Challenge Prompt:

I have a 1337 long array of secret positive integers. The only information I can provide is the sum of two elements. You can ask for that sum up to 1337 times by specifing two different indices in the array.

[!] - Your request should be in this format : "i j". In this case, I'll respond by arr[i]+arr[j]

[!] - Once you figure out my secret array, you should send a request in this format: "DONE arr[0] arr[1] ... arr[1336]"

[ ] - Note 1: If you guessed my array before 1337 requests, you can directly send your DONE request.

[ ] - Note 2: The DONE request doesn't count in the 1337 requests you are permitted to do.

[ ] - Note 3: Once you submit a DONE request, the program will verify your array, give you the flag if it's a correct guess, then automatically exit.

START:

So an example input we could provide: 0 1

Which could give us back the sum: 731986113164683230602132487650

Let it be known the array and its values change per netcat session, so it's time to program

#!/usr/bin/env python3

import socket

host = "secretarray.fword.wtf"
port = 1337

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
send = lambda x: s.send("{}\n".format(x).encode())
def get_response():
    resp = s.recv(1024)
    if not resp:
        raise ConnectionError("Could not connect properly..")
    try:
        return int(resp.decode())
    except:
        return resp.decode()

get_response()

#Initial setup, we'll do indices (0 + 1), (1 + 2), and (0 + 2) for a linear equation set:
values = []
index = 0
a = index
b = index + 1
c = index + 2
row1 = "{} {}".format(a, b) #a + b = x
row2 = "{} {}".format(b, c) #b + c = y
row3 = "{} {}".format(a, c) #a + c = z
send(row1) #0 1
x = get_response()
get_response()
send(row2) #1 2
y = get_response()
get_response()
send(row3) #0 2
z = get_response()
get_response()

#Just gonna wolfram it (linear system of equations) :l
print("Plug this into wolfram's linear system of equations:")
print("a + b = {}".format(x))
print("b + c = {}".format(y))
print("a + c = {}".format(z))
a = input("What does wolfram say A is?\n")
values.append(int(a))
b = input("What does wolfram say B is?\n")
values.append(int(b))
c = input("What does wolfram say C is?\n")
values.append(int(c))

index = 3
#I know that was fun but hey now that we have the value of a,
#n = sum - a, right?  I'd have iterated for B and C but 1337 attempts
print("Iterating..")
while index < 1337:
    if index % 100 == 0:
        percentage = round((index / 1337) * 100, 2)
        print("{}% complete..".format(percentage))
    row = "0 {}".format(index)
    send(row)
    x = get_response()
    get_response()
    n = int(x - values[0])
    values.append(n)
    index += 1

done_string = "DONE {}".format(' '.join(map(str, values)))
send(done_string)
result = get_response()
print(result)
res2 = get_response()
print(res2)
s.close()