Add memory course
This commit is contained in:
parent
007d11fc95
commit
030e2dd93b
1 changed files with 167 additions and 0 deletions
167
content/secu_logicielle/4_acces_memoire/index.md
Normal file
167
content/secu_logicielle/4_acces_memoire/index.md
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
---
|
||||||
|
title: "Sécurité logicielle : L'assembleur - approfondissement"
|
||||||
|
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 <valeur>`: ajoute une valeur dans la pile et descent de pointeur
|
||||||
|
équivalent à:
|
||||||
|
```asm
|
||||||
|
subl $4, %esp
|
||||||
|
movl <valeur>, %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.
|
Loading…
Add table
Add a link
Reference in a new issue