Attaquons la phase 4 de cette bombe logique! On commence à voir le bout du tunnel !

Si l'on regarde le fonctionnement de sym.phase_4 on se rend compte de la présence d'un scanf .

Le scanf attend un digit

Suite à ce scanf, une vérification du nombre de digits lus est faite ensuite une nouvelle vérification est faite pour s'assurer que la valeur fournit est supérieure à zéro.

Une fois que les vérifications de bases sont valides, alors la valeur est passée en paramètre à la fonction sym.func4

La valeur lu par scanf est passé a la fonction func4

Le cœur du problème se situe dans la fonction sym.func4.

A première vue il peut sembler étrange d'avoir une fonction qui s'appelle elle même. En fait il s'agit d'une fonction récursive.

Cette fonction est assez complexe alors on va y aller étape par étape.

L'algorithme en pseudo code de cette fonction ressemble à ça:

if (arg_8h <= 1)
	return 1;
else:
	y = sym.func4(arg_8h -1)
  	z = sym.func4(arg_8h -2)
   	return y + z 
    

En rouge nous avons donc la vérification de la première condition (si l'entré est inférieure à 1).

En vert nous avons le calcul de y. Le résultat de ce premier calcul est stocké dans esi (premier bloc en jaune).

Ensuite, en bleu, nous avons le calcul de z. Le résultat de ce second calcul est stocké dans eax puis est ensuite ajouté à esi (deuxième bloc jaune) ce qui correspond à return y + z.

Maintenant que l'on comprend un peu mieux le fonctionnement de cette fonction récursive on remarque qu'il s'agit de l'implémentation de la suite de Fibonacci (en récursif) ! Pour être tout à fait exacte, il s'agit içi de l'implémentation de la suite de Fibonacci décalé de 1.

Si l'on reprend la fonction sym.phase_4, on voit que le retour attendu vaut 0x37 soit 55 dans la langue de Molière.

Puisque cette suite est décalé la valeur qui permet d'obtenir 55 est F(9) et non pas F(10).
Pour s'en assurer il suffit de calculer la suite avec un bout de code en python.

#!/usr/bin/python

def func4(x):
	if x <= 1 :
		return 1
	else :
		y = func4(x-1)
		z = func4(x-2)
		return y + z
		
if __name__ == "__main__":
	for i in range(0,10):
		print 'i: ' + str(i) + " | " + str(func4(i))

Donc la réponse à ce challenge est 9.

Et voilà qui conclut la 4émè partie de ce challenge.

Social et Media

Comme toujours je suis disponible sur Twitter et cie, si vous avez des questions, des remarques, des suggestions etc. N’hésitez pas !

Twitter: @GhostAgs

Discord: hackraw