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