GoGOLFplex

4 minute read

Une pyjail like lors du 404ctf entre mai et juin 2022.

Description du challenge:

description_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 !