3.1 KiB
title | date | tags | categories | ||||
---|---|---|---|---|---|---|---|
Sécurité logicielle : TD 4 assembleur x86 partie 2 | 2023-02-10 |
|
|
Question 1
partie 4
Les fichiers utilisés pour cette partie sont disponibles sur mon dépôt git.
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:
# 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).
# 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 :
# 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):
# 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