Dans cette activité, nous allons utiliser un simulateur de CPU développé par Peter L Higginson. Pour fonctionner, il se base sur une architecture de Von Neumann, comme celle que nous avons découverte dans le cours.
Pour accéder au simulateur, il suffit de se rendre à l'adresse ci-dessous :
Sur ce simulateur, on retrouve tous les éléments qui composent un processeur selon l'architecture Von-Neumann :
Par défaut, le contenu des cases mémoire est affiché en base 10, comme des entiers signés. Il est possible de modifier cet affichage en pour afficher les données en hexadécimale ou en binaire.
Question 1 - Changer le mode d'affichage de la mémoire en binaire. Pour cela, il suffit de sélectionner le bon paramètre à l'aide du bouton OPTIONS
Pour la suite de l'exercice, vous pouvez remettre l'affichage en base 10 ou en base 16.
Dans la partie centrale du simulateur, nous pouvons retrouver tous les éléments de l'architecture de Von Neumann :
Le bloc « Registers » : on retrouve 13 registres, identifiés de R0
à R12
. On retrouve également le registre PC
qui contient l'adresse mémoire de l'instruction en cours d'exécution.
le bloc « Control Unit » : il contient l'instruction machine en cours d'exécution au format hexadécimal.
Le bloc « Arithmetic and Logic Unit » : il permet de réaliser les opérations de base.
Nous ne nous intéresserons pas aux autres composants de la partie CPU.
Il permet d'écrire des programmes en assembleur. Le jeu d'instructions utilisé est le même que celui présent dans le cours.
Question 1 - Dans la partie édition, entrer les lignes de code assembleur suivantes.
MOV R0,#42
STR R0,150
HALT
Question 2 - Cliquer sur « Submit ». Des nombres doivent s'afficher dans les casses mémoire 001
, 002
et 003
.
En fonction de la base choisie, vous pouvez avoir un affichage différent.
Question 3 - Passer l'affichage de la mémoire vive en binaire pour observer les instructions machines.
En cliquant sur « Submit », l'opération d'assemblage a été réalisée. En effet, le programme assembleur est maintenant converti en instructions machines.
000
: elle correspond à MOV R0,#42
.001
: elle correspond à STR R0,150
.002
: elle correspond à HALT
en assembleur.Pour l'instruction machine
11100011 10100000 00000000 00101010
, on remarque que l'octet le plus à droite0010 1010
est bien égale à 42 ! Pareil en hexadécimal avec l'octet42
.
Question 4 - Repassez en base 10 pouf faciliter la lecture des données présentes dans la RAM.
Question 5 - Exécuter le programme assembleur. Pour cela, il suffit de cliquer le sur le bouton RUN. Des animations se lancent afin d'observer les différents échanges d'informations au sein du processeur.
On constate que deux types de valeurs circulent au sein du système :
Vous pouvez régler la vitesse de simulation à l'aide des boutons << et >>. Un appui sur le bouton STOP met en pause la simulation. Si vous appuyez une deuxième fois sur le bouton STOP, la simulation reprend là où elle s'était arrêtée.
Un fois l'exécution terminée, on peut observer que la case mémoire d'adresse 150 contient bien le nombre 42 en base 10. On peut aussi constater que le registre
R0
a bien stocké le nombre 42.
Pour relancer la simulation,
R0
à R12
à 0, ainsi que le registre PC
.clr memory
depuis le bouton OPTIONS.ASSEMBLE
avant de pouvoir exécuter de nouveau votre programme.Question 6 - Modifier le programme précédent pour avoir le nombre 64 à l'adresse mémoire 50 et dans le registre R1
.
INP Rx
avec x
le numéro du registre.OUT Rx
avec x
le numéro du registre.Question 1 - Écrire la suite d'instructions assembleur permettant de réaliser le programme suivant :
a = 5
b = 6
r = a+b+15
print(r)
Question 2 - À l'aide du simulateur, essayer votre programme assembleur.
Vous devez obtenir la valeur 26 dans la case OUTPUT du simulateur.
Question 3 - Écrire la suite d'instructions assembleur permettant de réaliser le programme suivant :
a = int(input('Chosir un nombre A')
b = int(input('Chosir un nombre B')
r = a+b
print(r)
Le simulateur prend en charge les labels. Voici un exemple de programme assembleur utilisant les labels :
MOV R0, #4
MOV R1, #1
MOV R2, #0
CMP R0, #10
BEQ if
B else
if:
OUT R1
HALT
else:
OUT R2
HALT
Question 1 - En s'inspirant des programmes de l'exercice 2, écrire la suite d'instructions assembleur permettant de réaliser le programme suivant :
a = int(input('Chosir un nombre A')
b = int(input('Chosir un nombre B')
if a > b :
print(a)
else:
print(b)
Question 1 - Écrire un programme assembleur permettant d'afficher les nombre de x à 0, où x
est choisi par l'utilisateur.
x = int(input("Entrez un nombre :"))
while x >=0:
print(x)
x = x-1
Question 2 - Exécuter votre programme afin d'observer son bon fonctionnement.
On considère ci-dessous le programme crackme.c
, rédigé en langage en C. Vous pouvez télécharger ce programme ici.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main() {
char saisie[50] = "";
printf("Accès restreint : saisissez votre mot de passe \n");
while (strcmp(saisie,"NSIEIFFEL")!=0) {
printf("Mot de passe : ");
scanf("%s",&saisie);
}
printf("Accès autorisé \n");
return 0;
}
Ce fichier est écrit en langage C et doit être compilé avant de pouvoir être exécuté.
La compilation requiert plusieurs logiciels, plus facilement accessibles sur les systèmes d’exploitation Linux.
Pour simplifier cette étape, voici le fichier exécutable déjà compilé.
Voici une vidéo de l'exécution de ce fichier :
Question 1 - Essayer d'ouvrir ce fichier avec un bloc note ou Notepad++.
Le fichier est ilisible et de nombreux caractères étranges sont affichés. C'est normal, le fichier ne contient pas de caractères textuels, mais un ensemble de codes binaires.
Pour voir le contenu réel du fichier, il faut utiliser un lecteur binaire ou hexadécimal.
Question 8 - Utiliser le site https://hexed.it/
pour obtenir et lire le fichier.
Vous pouvez visualiser le code hexadécimal du fichier
crackme
.
À l'aide du site hexed.it
, il est possible d'aller observer la valeur des octets directement dans le fichier binaire crackme
.
Une fenêtre s'ouvre et affiche le code hexadécimal du fichier. Ce code reste incompréhensible pour un humain, mais le programme nous aide en affichant les chaînes de caractères présentes dans le fichier.
Question 2 - En analysant le fichier, essayer le retrouver le mot de passe du fichier.
Essayons de modifier le fichier afin de contourner le mot de passe du fichier.
Question 2 - À l'aide du site hexed.it
, effectuer une modification afin que le mot de passe soit NSI
. Il suffit de remplacer les octets des lettres EIFFEL
par la valeur 0.
Question 4 - Enregistrer le programme sur le Bureau sous le nom crackme_update_password
.
Voici l'exécution du programme suite à nos modifications :
Le mot de passe du fichier doit avoir été changé !
Question 7 - À l'aide du site hexed.it
, effectuer une modification afin que le mot de passe soit une chaine de caractères vide. Il suffit de remplacer tous les octets des lettres NSIEIFFEL
par la valeur 0.
Question 8 - Enregistrer le programme sur le Bureau sous le nom crackme_remove_password
.
Voici l'exécution du programme suite à nos modifications :
Le mot de passe du fichier n'éxiste plus !
Le désassemblage d'un programme est une opération très complexe et les opérations et chaînes de caractères qui apparaissent sont souvent incompréhensibles.
Néanmoins, il est possible d'agir au niveau le plus bas (le langage-machine) pour modifier un code, comme nous venons de le faire.