Allé hop on continue la résolution de cette bombe logique !
Attaquons la phase 2.

Phase 2

D'emblée on remarque une fonction intéressante.

Pas de doute possible, la fonction attend 6 nombres via un scanf,  ces 6 chiffres sont séparés par des espaces.

Si on ne fournit pas les 6 chiffres alors la bombe explose. Maintenant il s'agirait de savoir quel sont ces 6 nombres.

En détaillant le fonctionnement de sym.phase_2, on remarque que la première vérification porte sur le fait que le premier nombre soit un 1.

Si on s'attarde sur les instructions de 0x08048B76 à 0x08048B7E on peut déduire que le nombre qui est vérifié dépend du précèdent, ce qui veut dire que l'on peut trouver les autres éléments de la suite par une méthodologie de proche en proche.

On sait que le premier nombre est forcément 1.

On peut donc fournir à cette fonction une suite de 6 fois le 1.

1 1 1 1 1 1	

Puis à chaque itération on demande la valeur de eax pour avoir la valeur suivante de la suite. Ainsi de proche en proche on obtient cette suite:

1 2 6 24 120 720

NB: Il es préférable de faire un script pour R2 afin de s'économiser.

import r2pipe

r = r2pipe.open('./bomb')
r.cmd('ood ./inputs.txt')
r.cmd('aaa')
print(r.cmd('afl'))

r.cmd('db 0x08048B7E')
r.cmd('dc')

# Iteration 1
# Value wanted: 1

# Itération 2
print("Value wanted: ")	
print(str(int(r.cmd('dr eax'), 16)))
r.cmd('dr eax=' + str(2))
r.cmd('dc')

# Itération 3
print("Value wanted: ")	
print(str(int(r.cmd('dr eax'), 16)))
r.cmd('dr eax=' + str(6))
r.cmd('dc')

# Itération 4
print("Value wanted: ")	
print(str(int(r.cmd('dr eax'), 16)))
r.cmd('dr eax=' + str(24))
r.cmd('dc')

# Itération 5
print("Value wanted: ")	
print(str(int(r.cmd('dr eax'), 16)))
r.cmd('dr eax=' + str(120))
r.cmd('dc')

# Itération 6
print("Value wanted: ")	
print(str(int(r.cmd('dr eax'), 16)))
r.cmd('dr eax=' + str(120))
r.cmd('dc')

# Itération 7
print("Value wanted: ")	
print(str(int(r.cmd('dr eax'), 16)))

Une autre solution aurait été de comprendre un peu mieux le code et de remarquer que cette suite logique à une formule simple.

V[0] = 1 
v[i] = V[i-1] * (i+1) 
V0 = 1 
V1 = 1 * 2 = 2 
V2 = 2 * 3 = 6
V3 = 6 * 4 = 24
V4 = 24 * 5 = 120
V5 = 120 * 6 = 720

Et voilà qui conclut la seconde 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