84 lines
1.8 KiB
Markdown
84 lines
1.8 KiB
Markdown
---
|
|
title: "Sécurité logicielle : L'assembleur - appel de fonction"
|
|
date: 2023-02-10
|
|
tags: ["assembleur", "intel", "mémoire"]
|
|
categories: ["Sécurité logicielle", "Cours"]
|
|
---
|
|
|
|
L'instruction poour l'appel de fonction est `call`, elle est équivalent un
|
|
|
|
|
|
```asm
|
|
pushl %eip+5
|
|
jump f
|
|
```
|
|
|
|
On sauvegarde l'adresse de retour sur la pile et un effectue un saut dans le
|
|
code. Lors du retour, nous effetuerons alors :
|
|
|
|
```
|
|
popl %eip
|
|
jumpl (%esp)
|
|
addl $4 %esp
|
|
```
|
|
|
|
## Passage de paramètres (en 32 bits)
|
|
|
|
Le passage de paramètre n'est pas spécifié dans la dosumentation des processeur,
|
|
mais dans une documentation à part et relative à chaque systèmes (Linux, MacOS,
|
|
FreeBSD, OpenBSD, etc.)
|
|
|
|
Prenons l'exemple de la fonction `x=f(42, 52)` :
|
|
|
|
```asm
|
|
pushl $52 # on commence par le paramètre le plus à droite
|
|
pushl $42
|
|
call f
|
|
```
|
|
N'oublions pas que lors de lappel de fonction, l'adresse de retour est
|
|
positionnée sur la pile, vous avons donc:
|
|
|
|
|adresse|contenu|
|
|
|----|----|
|
|
|0xff| 52 |
|
|
|0xfb| 42 |
|
|
|0xf8| retour|
|
|
|
|
Voici maintenant le code de notre fonction :
|
|
|
|
```asm
|
|
f:
|
|
movl 4(%esp) %eax # Attendre l'adresse 0xfb
|
|
addl 8(%esp) %eax
|
|
ret # retour de notre fonction, résultat dans eax
|
|
```
|
|
|
|
Il faut penser à netoyyer la pile **dans la fonction appelante**
|
|
## Les variables locales
|
|
|
|
Elle se positionnent sur la pile après l'adresse de retour. Il faudra bien
|
|
évidement le prendre en compte lors du calcul du décalage lors del
|
|
accès au paramètres:
|
|
|
|
|adresse|contenu|
|
|
|----|----|
|
|
|0xf0| 52 |
|
|
|0xfc| 42 |
|
|
|0xf8| retour|
|
|
|0xf4| 94|
|
|
|
|
```asm
|
|
f:
|
|
subl $4, %esp
|
|
movl 8(%esp), %eax # Attendre l'adresse 0xfb
|
|
addl 12(%esp), %eax
|
|
movl %eax, (%esp)
|
|
...
|
|
addl $4, %esp
|
|
ret # retour de notre fonction, résultat dans eax
|
|
|
|
```
|
|
|
|
## Le Base Pointer
|
|
|
|
|