Dans ce petit challenge fort sympathique, il faut implémenter une comparaison entre deux registres de données intialisés avec
des valeurs aléatoires, puis dans le registre de données R0
, mettre 0
si c’est égal, sinon 1
.
Il faut lire très attentivement la documentation de la machine virtuelle qui se trouve ici. Nous allons avoir besoin des instructions suivantes :
MOV
pour charger une valeur dans un registreCMP
pour la comparaison- et une instruction de saut (
JZA/JNZA
,JZR/JNZR
) pour faire les branches, qui elles-même contiendront un saut pour aller vers la branche finale de terminaison du programme.
Très naïvement, selon les instructions du challenge et la documentation de l’assembleur de la machine virtuelle,
nous pouvons écrire le programme suivant que nous nommerons compar.asm
:
; On compare R5 et R6
CMP R5, R6
; La comparaison a positionné le drapeau Z que l’on teste
; Si Z vrai, on saute à la branche r5_r6_different
; sinon on saute à la branche r5_r6_equal
JZA r5_r6_different
JNZA r5_r6_equal
r5_r6_different:
; on arrive ici si drapeau Z vrai
; on colle 0 dans R0 et on s'en va à la fin
MOV R0, #0
JZA end
r5_r6_equal:
; on arrive ici si drapeau Z faux
; on colle 1 dans R0 et on s'en va à la fin
MOV R0, #1
JZA end
end:
; Arrêt du programme
STP
Ensuite, nous pouvons utiliser le fichier assembler.py
fourni, qui va générer le code machine en hexadécimal :
$ python3 assembly.py compar.asm
Vous devriez obtenir un code machine en hexadécimal. Il ne reste plus qu’à interagir avec le conteneur Docker du challenge en fournissant le code machine obtenu pour récupérer le flag.