HackademINT

Club de cybersécurité de Telecom SudParis


Game-of-life

Auteur : Headorteil

----------------------------------

Introduction

Dans de challenge, on dispose d’un site qui nous demande de lui renvoyer l’étape n + <étapes> de l’état actuel d’une matrice composée de cases blanches et de cases noires. On peut lire qu’il s’agit du jeu de la vie, on peut donc deviner qu’on doit itérerer selon les règles de “Conway’s game of life”. On nous demande de répéter l’opération, j’ai donc mis mon code de résolution dans une boucle while.

Solution

import time
import math
import requests
import numpy

def voisins(i,j, taille):
    """retourne la liste des voisins de matrice[i][j]"""
    T = []
    if i != 0:
        T.append([i-1, j])
        if j != 0:
            T.append([i-1, j-1])
        if j != taille-1:
            T.append([i-1, j+1])
    if i != taille-1:
        T.append([i+1, j])
        if j != 0:
            T.append([i+1, j-1])
        if j != taille-1:
            T.append([i+1, j+1])
    if j != 0:
        T.append([i, j-1])
    if j != taille-1:
        T.append([i, j+1])
    return T

def viv(T):
    """retourne le nombre de voisins vivants parmi T qui est la liste des voisins"""
    nb=0
    for c in T:
        nb += M[c[0]][c[1]]
    return nbr

r = requests.get("http://10.22.6.197/speed/3_rEivfOKq-Dueb-xgzG-sKXdDJeahGWaPHnu/server.php", headers={"Cookie":"PHPSESSID=pjc4h1440bdp7384e9cjdkkup7"})

while 1:
    print(r.content)

    data = r.json()
    R=data["cases"]

    taille = math.sqrt(len(R))

    M = [[0]*taille]*taille
    M=numpy.array(M)

    #On transforme les données en matrice parce que en ligne c'est pas très pratique
    for i in range(len(R)):
        M[i//taille][i%taille] = R[i]

    N=[[0]*taille]*taille
    N=numpy.array(N)

    for Z in range(data["etapes"]):
    #on fait une boucle pour arriver au rang demandé

        for i in range(taille):
            for j in range(taille):
                a = viv(voisins(i, j, taille))
                if M[i][j] == 0 and a == 3:
                    N[i][j] = 1
                elif M[i][j] == 1 and a < 2:
                    N[i][j] = 0
                elif M[i][j] == 1 and (a == 2 or a == 3):
                    N[i][j] = 1
                elif M[i][j] == 1 and a > 3:
                    N[i][j] = 0
        M = numpy.copy(N)

    R=[0]*(taille**2)

    #On retransforme notre matrice en liste pour renvoyer au bon format
    for i in range(taille):
        for j in range(taille):
            R[i*taille+j]=N[i][j]

    # On met un sleep, sinon on nous reproche de flood
    time.sleep(2)

    data = {}
    for i in range(taille**2):
        data["cases[" + str(i) + "]"] = R[i]

    r = requests.post('http://10.22.6.197/speed/3_rEivfOKq-Dueb-xgzG-sKXdDJeahGWaPHnu/server.php',headers={"Cookie":"PHPSESSID=pjc4h1440bdp7384e9cjdkkup7"},data=data)

Le flag

On obtient alors le code suivant : 3G5w26l1-xtBL-TBS7-jZs1Kpsf2pmjFgfR

On peut alors rentrer le code dans le champ dédié sur le site et on obtient alors le flag suivant : URCACTF{o6tV6KFi-WdPZ-c9g1-aBOCiv9gsDDeAvjd}