cours/content/secu_logicielle/td4-assembleur_x86_part2/index.md

128 lines
3.3 KiB
Markdown

---
title: "Sécurité logicielle : TD 4 assembleur x86 partie 2"
date: 2023-02-10
tags: ["Assembleur", "x86"]
categories: ["Sécurité logicielle", "TD"]
---
## Question 1
### partie 4
Les fichiers utilisés pour cette partie sont disponibles [sur mon dépôt git](https://git.epha.se/ephase/cours_lpro-ADSILLH/src/branch/main/content/secu_logicielle/td4-assembleur_x86_part2/files/q1_4).
Un `Makefile` est disponible pour générer les binaires et les dumps.
D'après les nos tests, le code assembleur généré utilise la pile pour y
positionner les paramètres de notre fonction `foo` à partir de 7 entiers. Le
code assembler généré pour 6 montre bien que les paramètres sont copiés des
regitres vers la pile:
```asm {linenos=inline}
# 0000000000401106 <foo>:
# void foo (int a, int b, int c, int d, int e, int f) {
push %rbp
mov %rsp,%rbp
mov %edi,-0x14(%rbp)
mov %esi,-0x18(%rbp)
mov %edx,-0x1c(%rbp)
mov %ecx,-0x20(%rbp)
mov %r8d,-0x24(%rbp)
mov %r9d,-0x28(%rbp)
# int i = 10 + a + b + c + d + e + f;
mov -0x14(%rbp),%eax
lea 0xa(%rax),%edx
mov -0x18(%rbp),%eax
add %eax,%edx
mov -0x1c(%rbp),%eax
add %eax,%edx
mov -0x20(%rbp),%eax
add %eax,%edx
mov -0x24(%rbp),%eax
add %eax,%edx
mov -0x28(%rbp),%eax
add %edx,%eax
mov %eax,-0x4(%rbp)
#}
nop
pop %rbp
ret
```
Voici le code pour 7 entiers, on peut voir que l'initialisation des paramètres
de notre fonction `foo` seul **6 paramètres** sont présent dans les
**registres** (ligne 10). On vois que le septième **est pris directement dans la
**pile** (ligne 25-25).
```asm {linenos=inline, hl_lines=[10, "24-25"]}
# 0000000000401106 <foo>:
# void foo (int a, int b, int c, int d, int e, int f, int g) {
push %rbp
mov %rsp,%rbp
mov %edi,-0x14(%rbp)
mov %esi,-0x18(%rbp)
mov %edx,-0x1c(%rbp)
mov %ecx,-0x20(%rbp)
mov %r8d,-0x24(%rbp)
mov %r9d,-0x28(%rbp)
# int i = 10 + a + b + c + d + e + f + g;
mov -0x14(%rbp),%eax
lea 0xa(%rax),%edx
mov -0x18(%rbp),%eax
add %eax,%edx
mov -0x1c(%rbp),%eax
add %eax,%edx
mov -0x20(%rbp),%eax
add %eax,%edx
mov -0x24(%rbp),%eax
add %eax,%edx
mov -0x28(%rbp),%eax
add %eax,%edx
mov 0x10(%rbp),%eax
add %edx,%eax
mov %eax,-0x4(%rbp)
#}
nop
pop %rbp
ret
```
Ce fonctionnement est d'ailleurs confirmé dans notre main. D'après le code
ci-dessous un `push` est réalisé **ligne 6** avec comme valeur `0x7`. Ce qui
correspond à **la valeur de notre dernier paramètre** :
``` asm {linenos=inline, hl_lines=[6]}
# 0000000000401148 <main>:
#int main () {
push %rbp
mov %rsp,%rbp
# foo (1, 2, 3, 4, 5, 6, 7);
push $0x7
mov $0x6,%r9d
mov $0x5,%r8d
mov $0x4,%ecx
mov $0x3,%edx
mov $0x2,%esi
```
#### Test avec les flottants
Pour les flottants, le passage sur la pile se fait a partir de 8 paramètres
comme le montre le `main` obtenu (instruction `push` ligne 6):
```asm {linenos=inline, hl_lines=6}
# 0000000000401197 <main>:
# int main () {
push %rbp
mov %rsp,%rbp
# foo (1, 2, 3, 4, 5, 6, 7, 8);
push $0x8
mov $0x7,%r9d
mov $0x6,%r8d
```
## Question 3
Les fichiers utilisés pour cette partie sont disponibles [sur mon dépôt git].
Un `Makefie` est disponible comme pour la précédente question.
[sur mon dépôt git]:https://git.epha.se/ephase/cours_lpro-ADSILLH/src/branch/main/content/secu_logicielle/td4-assembleur_x86_part2/files/q3