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

2.8 KiB

title date tags categories
Sécurité logicielle : TD 4 assembleur x86 partie 2 2023-02-10
Assembleur
x86
Sécurité logicielle
TD

Question 1

partie 4

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