GoGOLFplex
Une pyjail like lors du 404ctf entre mai et juin 2022.
Description du challenge:
Je ne suis pas un grand fan du python mais j’adore les jail / jail like (ainsi que les grands nombres)
Je trouve l’énnoncé du challenge juste EXCELLENT. Ce challenge est vraiment prenant !
En pièce jointe du challenge, un fichier .py, ci-dessous commenté et agrémenté afin de simplifier la compréhension
1print('Bienvenue sur le goGOLFplex, le plus grand parcours de golf de l\'univers!')
2print('Il comporte 10^16 trous mais le meilleur score que quelqu\'un ait fait dans \
3 l\'histoire est 10^25')
4print('Si tu arrives à battre ou égaliser ce score tu rentreras dans l\'histoire !')
5print('En revanche on a décidé de te mettre un petit handicap, ne t\'inquiète pas, \
6 ce n\'est pas gênant ;)')
7
8# Lis stdin et retire tous les whitespace du debut et de la fin de la string
9a = input('En combien de coups essayez-vous de faire le parcours?\n').strip()
10
11try:
12 # si le premier character de notre input est -, +, ou 0
13 # alors exit
14 if a[0] in '-+0':
15 print('Opération interdite! Je ne vais pas me faire avoir comme ça! \
16 Je ne suis pas un débutant!')
17 exit()
18
19 # f-string notre input et ajoute des 0 de sorte
20 # à avoir une string de taille >= à 51
21 # puis, converti notre string en int
22 nb = int(f'{a:<051}')
23 print(f'vous réussissez à finir le parcours en {nb} coups')
24
25 # si le nbr retourné par int est < à 10^25, print le flag
26 if nb <= 10**25:
27 with open('flag.txt', 'r') as f:
28 print(f.readline())
29 exit()
30except Exception as e:
31 print('Vous avez tout cassé....')
32 # print(e)
33 exit()
34
35print('Perdu! Mais vous pouvez retenter votre chance!')
Notre but est donc de terminer le parcours en 10^25 coups ou moins, malheureusement, la f-string nous ajoute automatiquement des ‘0’ pour que notre input fasse au minimun 10^50
Pour nous faciliter la tâche, on peut print l’exception en local en décommentant la ligne 32
J’ai commencé à fuzz le programme avec les idées suivantes:
- non ascii whitespace
- 0 en italic (ca n’existe pas)
- tout sorte de fuzz avec lettres, espaces etc.
- integer overflow (j’en apprends sur le python...)
Mais rien de concluant ne ressort, int va dans tous les cas throw l’exception suivante:
1ValueError: invalid literal for int() with base 10: '<input>'
- Je cherche des bypass de whitespace (pour bypass .strip()) mais rien, (dans l’idée de commencer mon input par " 0")
- Je cherche des tricks wtf sur les f-string, mais pas de soucis à ce niveau.
Alors je commence à regarder la doc python concernant int().
Cette dernière, concernant le constructeur est très courte, on peut y lire:
Changed in version 3.6: Grouping digits with underscores as in code literals is allowed.
Et l’interpreteur en remote est AU MOINS en 3.6 (les f-string sont apparu en v3.6).
Je test le programme avec comme input 1_1
, la f-string va ajouter 48 zeros derrière, le tout va être passé à int(), puis comparé à 10^25.
$ python3.6 chall.py
Bienvenue sur le goGOLFplex, le plus grand parcours de golf de l'univers!
Il comporte 10^16 trous mais le meilleur score que quelqu'un ait fait dans l'histoire est 10^25
Si tu arrives à battre ou égaliser ce score tu rentreras dans l'histoire !
En revanche on a décidé de te mettre un petit handicap, ne t'inquiète pas, ce n'est pas gênant ;)
En combien de coups essayez-vous de faire le parcours?
1_1
vous réussissez à finir le parcours en 11000000000000000000000000000000000000000000000000 coups
Perdu! Mais vous pouvez retenter votre chance!
Super ! int() a concatené mes deux ‘1’ ensemble.
La f-string m’oblige à écrire au minimun 51 charactere, je peux donc mettre un ‘1’ et concatener 25 ‘0’ ensuite.
Je test directement sur le remote:
$ nc challenge.404ctf.fr 32697
Bienvenue sur le goGOLFplex, le plus grand parcours de golf de l'univers!
Il comporte 10^16 trous mais le meilleur score que quelqu'un ait fait dans l'histoire est 10^25
Si tu arrives à battre ou égaliser ce score tu rentreras dans l'histoire !
En revanche on a décidé de te mettre un petit handicap, ne t'inquiète pas, ce n'est pas gênant ;)
En combien de coups essayez-vous de faire le parcours?
1_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0
vous réussissez à finir le parcours en 10000000000000000000000000 coups
404CTF{Und3r5c0r35_1n_1nt3g3r5??}
Yes c’est flag !
404CTF{Und3r5c0r35_1n_1nt3g3r5??}
Une autre solution aurait été d’utiliser un 0 dans une autre langue tel que ۰
.
On réussit donc le plus grand parcours de golf de l’univers en 0 coups !
Merci à Redhpm pour le challenge !