Solution de OliverSwift pour Fibonacci

hardware

16 janvier 2025

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:

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é.