--- title: "Sécurité logicielle : L'assembleur - accès mémoire" date: 2023-02-01 tags: ["assembleur", "intel", "mémoire"] categories: ["Sécurité logicielle", "Cours"] --- ## Accès direct à la mémoire Prenons le code en C suivant: ```c int i = 42; int j = 43; int main() { i = 1; j = i; j++; } ``` Voici le code assembleur correspondant: ```asm i: .long 42 j: .long 43 main: movl $1, i # on ne peux pas faire movl j i, il va falloir passer par %eax movl i, %eax movl %eax, j incl j ret ``` ## Accès indirects à la mémoire Prenons maintenant le code C suivant, avec des pointeurs et références: ```c int i = 42; main(){ int *x = &i; *x = 0; (*x)++ } ``` Voici le code assembleur correspondant: ```asm i: .long 42 main: movl $1, i movl $i, %eax # récupérons l'adresse de i dans %eax movl $0, (%eax) # (%eax) pointe vers l'adresse mémoire content dans %eax incl (%eax) ret ``` ### Les tableaux Voici un code en C contenant un tableau: ```c int t[2] = {1,2}; main() { t[0] = 3; t[1] = 4; int *x = &t[1]; *x = 0; (*x)++; } ``` Et le code correspondant en assembleur: ```asm {linenos=inline} t: .long 1 .long 2 main: movl $3, t movl $4, t+4 movl $t+4, %eax movl $0, (%eax) incl (%eax) ret ``` La déclaration de notre tableau ligne 1, 2 et 3 : `t` est une étiquette contenant deux `long` (*4 octets*). La première affectation des éléments de t dans notre `main` ligne 5 et ligne 6. Pour le second élément, on prend l'adresse de `t` et on la décale de 4 octets. ### Les structures D'un point de vue de l'assembleur, les structures sont vue comme les tableau : des adresses mémoire, comme tout le reste! Ce que nous avons précédemment est donc valable : **décalage** et **adresses mémoire**. N'oublions pas que **du point du vue du processeurs ce ne sont que des adresses** ### Pointeur de pointeur Voici un code en C: ```c int i = 42, j = 43; int *x; int **z; main() { x = &i; z = &x; [...] *z = &j; ``` Et son pendant en assembleur: ```asm {linenos=inline} i:.long 42 j:.long 43 x:.long 0 z:.long 0 main: movl $i, x movl $x, z [...] movl z, %eax movl $j, (%eax) ``` Comme on peut le voir ligne 1 à 4 tout est déclaré comme `long`. Pour l'affectation de ` *z` ligne 9 et 10, nous passons par `%eax` pour faire le relais. ## La pile En assembleur, `esp` représente le pointeur de pile, La pile est LIFO : *Last In First Out*, Fait important : **on descend sur la pile**. Autre fait important la pile **n'est pas nettoyée** lors de la remontée. Deux instructions sont utilisée : * `pushl `: ajoute une valeur dans la pile et descent de pointeur équivalent à: ```asm subl $4, %esp movl , %eax ``` * `popl`: place la valeur de la pile dans `%eax` et remonte le pointeur, équivalent de: ```asm movl (%exp) %eax addl $4m %esp ``` ### Le registre epb Il se met par défaut au milieu du tas, son nom signifie *Base Pointer*. Il st utilisé généralement pour marquer le début d'une structure de donnée sur la pile.