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

3.3 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

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

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.