On évite le classique récursif pour le calcul de Fibonacci, d’ailleurs le fichier challenge.py
donne la marche à suivre:
def Fib(n):
if n < 2:
return n
A = 0
B = 1
for _ in range(n - 1):
C = A + B
A = B
B = C
return B
On va utiliser les registres de cette façon:
- R1 : A
- R2 : B
- R3 : C
- R5 : n
- R0 : return value
Le code assembleur suivant devrait faire l’affaire (fichier fib.s) :
; Entry point, R5 is loaded with 'n'
MOV R0, #0
CMP R5, R0 ; if n == 0 -> return 0
JNZA notzero
STP
notzero:
MOV R0, #1 ; if n == 1 -> return 1
CMP R5, R0
JNZA notone
STP
notone:
MOV R0, #1
SUB R5,R5,R0 ; n--
MOV R1, #0 ; A = 0
MOV R2, #1 ; B = 1
again:
ADD R3,R1,R2 ; C = A + B
MOV R1,R2 ; A = B
MOV R2,R3 ; B = C
MOV R0, #1
SUB R5,R5,R0 ; n--
JNZA again ; while(n)
MOV R0, R2 ; return B
STP
On compile avec ‘assembly.py’:
$ python3 assembly.py fib.s
8000000006058A00000614008000000106058A00000c1400800000014c2d80010000800200014a8b00210032800000014c2d8A00001300201400
On lance le docker et on dialogue avec l’instance:
$ nc localhost 4000
Enter your bytecode in hexadecimal:
>>> 8000000006058A00000614008000000106058A00000c1400800000014c2d80010000800200014a8b00210032800000014c2d8A00001300201400
[+] Congrats! Here is the flag: FCSC{770ac04f9f113284eeee2da655eba34af09a12dba789c19020f5fd4eff1b1907}
Et voilà récompensé.