Coup de foudre pour la programmation blitz
par Benoit, 2013-06-17

En participant aux qualifications du CTF de DEFCON 2013, je suis tombé amoureux – amoureux, oui! – avec la programmation blitz. Ce faisant, je suis retombé en amour avec la programmation tout court.

La fumée

La programmation est ma copine du secondaire. Nous nous sommes rencontrés quand j’avais 14 ans et nous ne nous sommes plus jamais quittés. Je l’ai épousée: la programmation est maintenant mon métier. Nous avons eu de beaux petits enfants programmes, que nous élevons du mieux que nous pouvons.

Depuis des années la programmation ne me laisse la toucher que si j’ai d’abord planifier mon design. Pour lui plaire, je dois choisir soigneusement mes noms de variables et de fonctions. Elle me demande d’échafauder minutieusement des hiérarchies de classes. Nous partageons les tâches 50-50: elle collecte la mémoire qui n’est plus utilisée, je classifie intelligemment les éléments de code dans des modules. Bref, la routine s’est un peu installée, mais nous nous entendons bien, nous nous aimons très fort et nous avons une belle vie.

La fin de semaine dernière, j’ai été convié à participer à un événement Capture the Flag (CTF) aux côtés de l’équipe ROT13 (Root Overload Troop ‘13 — oui, ok), à Ottawa. Il s’agit d’une compétition de hacking: une série de problèmes de sécurité sont présentés et leur résolution rapporte des points. Les règles exactes de pointage tendent à varier au gré des événements, mais en somme, la récompense est proportionnelle au degré de difficulté du problème. Les problèmes en question peuvent être d’exploiter une vulnérabilité d’un programme binaire, de composer un shellcode (un programme en langage d’assemblage typiquement employé pour tirer profit d’une vulnérabilité) de taille minimale, d’obtenir l’accès à un compte sur un serveur distant, etc. Pour ceux que tout ce contexte intéresse, cette compétition était une qualification pour la finale du CTF de DEF CON 21, qui aura lieu à Las Vegas au début d’août.

Donc, j’ai accepté l’invitation, mais je m’y rendais à reculons. La programmation et moi, nous sommes vieux maintenant. Ça nous fait du bien de prendre une pause, les week-ends. Et puis franchement, ces problèmes de sécurité me sortent de ma zone de confort. En plus! il me faut manquer la fête des pères pour m’y rendre. Mais enfin, oui c’est oui et j’y suis allé.

L’étincelle

La compétition commence donc le vendredi à 20h00 et comme je m’y attendais, je suis un peu dépassé par le premier problème dévoilé. Je contribue comme je peux au rétro-engineering d’un binaire et à la préparation d’un exploit, mais je ne suis pas très concentré. Toutefois, après environ 5 heures, un second problème est dévoilé, dans une catégorie au nom bizarre de guerilla programming. Les seuls indices donnés sont un serveur et un port. Je m’y connecte et je me fais envoyer un taquin de neuf cases. Eh! un jeu, c’est cool. Je commence donc à jouer, tentant d’ordonner les cases et au bout d’un moment, le serveur brise la connexion en mentionnant Too slow! Un humain est trop lent pour résoudre le taquin: le serveur veut un adversaire digne de lui…

Ooooh! Il faut donc programmer une intelligence artificielle pour résoudre le taquin. Le plus vite possible. Peu importe comment on s’y prend. Cette tâche est à la programmation ce que le blitz ou le bullet est aux échecs. Appelons-ça la programmation blitz.

En somme, il s’agit d’un jeu où, pour jouer, il faut programmer une solution au problème le plus vite possible. On se tape l’IA soi-même si la solution se présente aisément. C’est aussi légitime de mettre la main sur du code trouvé sur le web et d’en scripter l’exécution gérer la différence d’impédance avec le jeu tel que présenté par le serveur. Tous les moyens sont bons. Code ce que tu veux, du moment que ces taquins se font résoudre, et vite. Copier-coller? Ok. Variables globales? Si tu veux. Noms de variables à juste une lettre? Ok, haha, c’est ton problème.

Ma bonne vieille programmation a soudainement défait ses cheveux, qui ont cascadé sur ses épaules. Elle a déboutonné les deux premiers boutons de son chemisier. Elle m’a embrassé fougueusement! Puis nous nous sommes assis et nous avons fait ce qu’il fallait pour battre des taquins. Nous avons aussi gagné une course d’obstacle! Nous avons ensuite courageusement attaqué un problème de construction de circuit, que nous n’avons pas eu le temps de résoudre au complet avant la fin de la compétition.

Le feu

J’ai passé la fin de semaine à programmer passionément. J’ai appris un tas de trucs (je regardais aussi ce que les vrais experts en sécurité faisaient de temps à autre), j’ai risqué, ragé, jubilé, joué, déjoué, compris, essayé, débogué, optimisé, gagné et perdu, et j’ai eu une tonne de plaisir.

D’une part, il est clair que je veux participer à nouveau à ce genre de défi. J’ai l’intention de compléter le programme de construction de circuit, que je vais présenter ici. Je vais aussi m’entraîner: je vais rassembler des outils et du code généralement utile, dépoussiérer et lire mes vieux livres d’intelligence artificielle et m’amuser à craquer quelques problèmes algorithmiques à temps perdu. Je vais aussi tenter de rassembler des gens intéressés à la programmation blitz dans ma région et, si l’intérêt est manifeste, d’organiser des compétitions locales. En ce sens, je vais tenter de mettre au point des serveurs de jeu. Quiconque est intéressé à m’assister dans ces efforts est bienvenu de se manifester dans les commentaires, ou en me contactant personnellement.

D’autre part, je suis retombé passionément amoureux de la programmation. L’expérience du CTF a validé ma compétence en la matière, ce qui fait chaud au coeur, mais il y a plus. J’ai redécouvert l’immense plaisir de décrire ainsi la solution d’un problème à une machine, et d’utiliser ce processus comme une conversation sur les caractéristiques, les limites et la signification de ce problème. Calme-toi, mon ti-coeur. Calme-toi.

Commentaires