Add first part of function call
This commit is contained in:
parent
5b2b7ef034
commit
eceb4717df
1 changed files with 84 additions and 0 deletions
84
content/secu_logicielle/5_appel_fonction/index.md
Normal file
84
content/secu_logicielle/5_appel_fonction/index.md
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue