Solution de 4ureli1 pour A l'envers

intro misc algo

20 décembre 2023

Description du challenge

Le challenge consiste à inverser des chaînes de caractères envoyées par un service distant. Le service envoie une chaîne de caractères précédée de >>>, et attend en retour la même chaîne, mais avec les caractères dans l’ordre inverse.

Résolution du challenge

Connexion au service

Commençons par nous connecter au service distant en utilisant la commande nc localhost 4000 dans le terminal. Cela nous permet de voir comment le service fonctionne et quel type de données il envoie.

Écriture du code Python

Ecrivons un script Python pour automatiser le processus d’inversion des chaînes de caractères. Le script utilise le module socket pour se connecter au service, recevoir des données, inverser les chaînes de caractères et renvoyer les résultats.

Voici le code Python utilisé :

import socket
import time

def reverse_string(s):
    return s[::-1]

def main():
    # Créer une connexion TCP/IP
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Connecter le socket à l'adresse du serveur
    server_address = ('localhost', 4000)
    sock.connect(server_address)

    try:
        while True:
            time.sleep(1)
            # Recevoir des données du serveur
            data = sock.recv(1024)
            print(f"Reçu : {data.decode()}")

            # Diviser le message en lignes
            lines = data.decode().split('\n')
            
            if 'Congratulations!! Here is your flag:' in lines:
                break

            for line in lines:
                # Vérifier si la ligne est une chaîne à inverser
                if line.startswith('>>>'):
                    # Supprimer les '>>>' et les espaces blancs au début de la chaîne
                    line = line.lstrip('>>> ').rstrip()

                    # Inverser la chaîne de caractères
                    response = reverse_string(line)
                    print(f"Envoi : {response}")

                    # Ajouter un caractère de fin de ligne à la réponse
                    response += '\n'

                    # Renvoyer la chaîne inversée au serveur
                    sock.sendall(response.encode())

    finally:
        # Fermer la connexion
        sock.close()

if __name__ == "__main__":
    main()

Explication du code

J’ai rencontré quelques problèmes lors de l’exécution du script. Par exemple

  • le script ne recevait pas de nouvelles chaînes à inverser après avoir renvoyé la première réponse. J’ai résolu ce problème en ajoutant un caractère de fin de ligne (\n) à la fin de chaque réponse avant de l’envoyer au serveur.

  • le serveur envoyait parfois plusieurs lignes de données en une seule fois, y compris des messages qui n’étaient pas des chaînes à inverser. Pour résoudre ce problème, j’ai modifié le script pour qu’il traite chaque ligne de données séparément et n’inverse que les lignes qui commencent par >>>.

Conclusion

Ce challenge permet de pratiquer nos compétences en programmation Python et en manipulation de chaînes de caractères, ainsi que notre compréhension des communications réseau. 🍀