Programmation

lundi 11 mars 2019, 22:05  #1
Programmation - Retour au collège
Ablia
  • 7 posts

Bonjour,

je bloque vraiment sur ce challenge. J’ai évidemment fait un petit script pour faire le calcul, puis il a parut évident qu’il fallait également se connecter au serveur IRC pour pouvoir donner la réponse dans les temps.
Et c’est là que le bat blesse.

J’ai commencé en Python. Je me suis renseigné, le RFC est imbitable mais j’ai réussi à comprendre en gros comment fonctionnait le protocole. Et j’en suis arrivée à ça :

[Ech0 : spoil - code source]

Et je fait face à un problème :
connecting to :irc.root-me.org
:irc.hackerzvoice.net NOTICE Auth :*** Looking up your hostname...
irc.hackerzvoice.net 451 JOIN You have not registered
irc.hackerzvoice.net 451 PRIVMSG You have not registered
 : You have not registered
:irc.hackerzvoice.net 451 PRIVMSG :You have not registered

Donc bon, après pas mal de recherche, j’ai lu qu’il fallait peut-être que j’attende un message (MOTD) du serveur avant d’envoyer le join. Mais je ne sais pas comment attendre ce MOTD, je n’ai trouvé aucune commande là-dessus. du coup je fais juste un time.sleep(1) avant le join. Je n’ai plus l’erreur, mais Candy ne répond pas à mon message, et puis c’est moche.
J’ai essayé d’augmenter le nombre de caractères reçus (le 4096, au cas où y’en ai plus), de vérifier si je recevais pas un ping...que dalle.

Du coup je suis passée en script bash. J’ai réussi à me connecter au serveur via telnet sans problème et je peux envoyer et recevoir des messages de Candy, mais je n’arrive pas à "automatiser" ça via un script.
J’ai essayé pas mal de trucs, notamment ça :
# !/bin/bash
telnet irc.root-me.org 6667
[Ech0 : spoil - morceau code source]

Le problème ici est que, après la première ligne, ça lance la connexion...et le reste ne s’écrit pas (ou plutôt, s’écrit après, une fois la connexion telnet finie). Du coup c’est encore à moi de tout écrire, et ça va pas plus vite ^^

Comme j’ai commencé les deux, j’aimerais bien arriver à régler les deux problèmes :D
Si quelqu’un pouvait me donner un coup de main, j’apprécierais. ça fait deux jours que je parcours tous les forums, tous les codes Python que j’ai trouvé correspondent au mien (même un que j’ai trouvé qui correspondait clairement au challenge root-me et qui fonctionnait pour son utilisateur....du coup je comprends vraiment pas). Bon, pour le bash, je suis encore débutante, mais je suis là pour m’améliorer ;)

lundi 11 mars 2019, 22:40  #2
Programmation - Retour au collège
Ech0
  • 328 posts

Bonsoir,

du coup je fais juste un time.sleep(1) avant le join.

Ce n’est pas choquant de faire un sleep().

mais Candy ne répond pas à mon message

Pour recevoir quelque chose de Candy, il faut le spécifier dans le script. Le seul envoi d’un message ne suffit pas, il faut spécifier la réception de la réponse également.
Je te laisserai voir ce point plus en détail : la réception n’est pas gérée "par défaut".

tous les codes Python que j’ai trouvé correspondent au mien

Je te conseille de refaire ton propre code de A à Z, pour éviter les incompréhensions de bouts de codes que t’aurais trouvé sur internet.
Si le code a été écrit entièrement par toi et que tu prends le temps de comprendre chaque détail, tu ne te posera plus ce genre de question. ;)

Vu que tu as commencé par ça, je te conseille d’approfondir tes connaissances sur les sockets.

Du coup je suis passée en script bash.

Tu as commencé par le Python, qui est un bon choix, et tu apprendra plus de choses en faisant le challenge en Python qu’en script bash.
Je te conseille donc de poursuivre ta lancée avec le Python.

PS :
Attention au spoil, il ne faut pas mettre ton code source ou d’indices trop explicites publiquement comme ça, tout le monde n’a pas terminé le challenge.
Je te laisse lire ça : https://www.root-me.org/?page=forum&id_thread=11454&lang=fr

Ech0

mardi 12 mars 2019, 19:14  #3
Programmation - Retour au collège
Ablia
  • 7 posts

Ah, désolée pour le spoil. j’ai eu un doute, mais comme j’ai aussi trouvé des bouts de code sur ce forum je me suis dit que ça devrait être accepté. Merci pour le lien.

J’avoue que j’ai trouvé pas mal de code quand je cherchais des infos sur le protocole IRC en python (j’ai d’abord essayé de lire le RFC, mais il est vraiment difficile d’en tirer quelque chose, notamment au niveau de la connexion). Cependant, j’ai pour règle de ne jamais utiliser un code sans le comprendre avant (surtout pour les CTF, sinon ça sert vraiment à rien) donc j’ai fouillé pas mal avant de le tester ;)

Pour ce qui est de la réception de données, je la prenais en compte un peu plus loin, dans une boucle infinie pour gérer les éventuels PING. ça marchait quand même pas.
Et aujourd’hui, allez savoir pourquoi, ça s’est mit à fonctionner correctement (j’ai d’abord reçu un message d’erreur car, curieusement, il manquait un paramètre à USER, mais une fois ce problème - non signalé hier - réglé, tout a très bien fonctionné. Plus de "Looking up your hostname" non plus. C’est chouette, mais je comprends pas pourquoi, donc ça m’énerve !!!)

Enfin, du coup je m’en vais gérer la récupération des nombres et l’envoi de la réponse.

Mais y’a vraiment pas moyen de faire mieux qu’un sleep ? Je veux dire, j’attends qu’une seconde c’est pas la mort, mais est-ce que le serveur IRC ne peut pas nous dire quand il est prêt à continuer ?

Et sinon, quand je lance plusieurs fois mon script, je ne reçois le joli message de bienvenue du serveur qu’une seule fois, même si je change mon Nick et mon User. Comment ça se fait ?

Autre question : je vois presque toujours irc.rcv(4096). J’ai lu que c’était pour limiter le nombre de caractères reçus du serveur. Mais pourquoi toujours 4096 ? Pour de simples messages, ça pourrait être carrément moins ; pour le gros message de bienvenue, ça pourrait éventuellement être plus. Si cette limite n’a pas de grosse importance, on pourrait la fixer à bien plus haut pour être sûr de rien rater. Y a t-il une raison particulière à ce 4096 ?

PS : j’ai déjà utilisé les sockets en java. C’est pas hyper-clair dans ma tête, donc j’aime pas trop, mais je comprend l’idée. J’ai tendance à visualiser ça comme un PDU, même si c’est sûrement faux :p

mardi 12 mars 2019, 21:46  #4
Programmation - Retour au collège
Ablia
  • 7 posts

Bon, j’ai eu un bug bizarre
Question : qu’avais-je changé ? Je recevais bien le message de Candy ; j’ai ajouté une fonction pour faire le calcul et envoyer la réponse, mais bêtement j’ai oublié d’afficher la réponse de Candy.
J’ai corrigé ce détail et là...plus possible de se connecter au serveur IRC. Pour différents problèmes : You have not registered, Looking Up your hostname...ça dépend. Mais j’ai juste rajouté deux ligne pour voir le message de Candy !
Du coup je supprime ma dernière modif. Eh non. Le problème reste.

Donc je suis revenue à une version ultérieure (ouais, toujours avoir plusieurs versions au cas où ça marche plus sans qu’on comprenne pourquoi) où je me contentais de recevoir et afficher le premier message de Candy - mais au moins ça marchait. Et devinez quoi : connexion impossible. Message d’erreur :
:irc.hackerzvoice.net NOTICE Auth :*** Looking up your hostname...
:irc.hackerzvoice.net NOTICE Auth :*** Could not resolve your hostname : Domain name not found ; using your IP address (176.164.44.14) instead.

à priori, ça ne devrait pas vraiment couper la connexion, pourtant ça s’arrête là. Alors que c’était une version fonctionnelle de mon script. Et ça c’est vraiment incompréhensible.
La seule idée qui m’est venue à l’esprit c’est : y’a peut-être plus de gens de connectés, du coup faut plus de temps au serveur pour répondre. Du coup j’ai augmenté mon sleep : je l’ai passé à 4 au lieu de 1, et j’en ai fait un avant chaque réception de données...

Et ben laissez-moi vous dire un truc : c’était ça. Du coup je poste ça là, au cas où ce bête problème arrive à d’autres.
Au passage j’ai réglé ma question d’affichage du MOTD ; à présent je l’affiche bien à chaque fois. Si j’attends assez longtemps. Sérieux, y’a forcément un truc plus efficace que sleep :/

mercredi 13 mars 2019, 23:47  #5
Programmation - Retour au collège
gwel
  • 65 posts

Pour contourner ton problème de sleep, la méthodologie à suivre c’est de lire ce que t’envoie le serveur : il envoie des codes composés de 3 chiffres pour chaque type de message, Il y a un code envoyé pour te dire "ok c’est bon envoie la suite" (de mémoire ça doit être 400 ou un chiffre assez proche)

Le 4096 me parait totalement arbitraire, ça pourrait être une autre valeur.

Pour ce qui est de ton second post, ce que tu décris comme un message d"erreur ne me parait pas vraiment en être un, du moins ça ne devrait pas t’empêcher de te connecter. Le problème doit être ailleurs. Parfois un serveur IRC ne se rend pas tout de suite compte que tu est déconnecté. De ce fait, si tu te reconnectes directement derrière avec le même nick, il te jettes. ça ne serait pas ça ?