Vous êtes sur la page 1sur 32

SCURIT DES SYSTMES DEXPLOITATION C.

BENZAID
Vulnrabilits Logicielles

Gestion de Pile : Rappel

La Pile IA32

Zone de la mmoire gre avec la discipline pile Registre %esp contient ladresse du sommet de la pile

Base
Adresses croissantes

Pointeur de Pile : %esp Sommet

Progression de la pile

La Pile IA32 : Push


pushl src
Rcupre

Base
Adresses croissantes

loprande src Dcrmente %esp par 4 Ecrire l oprande ladresse donne par %esp

Pointeur de Pile : %esp


-4

Progression de la pile

La Pile IA32 : Pop


popl dst
Ecrire

Base
Adresses croissantes

loprande ladresse donne par %esp dans dst Incrmenter %esp de 4

+4

Pointeur de Pile : %esp

Progression de la pile

Flux de Contrle de Procdure


Utiliser la pile pour supporter lappel de procdure et le retour


call

etiq_proc

Empiler

ladresse de retour sur la pile Sauter etiq_proc


ret
Dpiler

ladresse partir de la pile Sauter ladresse

Flux de Contrle de Procdure


Adresse de retour
Ladresse Exemple

de linstruction suivante juste aprs lappel

804854e: e8 3d 06 00 00 call 8048b90 <main> 8048553: 50 pushl %eax Ladresse de retour = 0x 8048553

Exemple dAppel de Procdure


804854e: 8048553: e8 3d 06 00 00 50 call 8048b90 <main> pushl %eax
call 8048b90

0x110 0x10c 0x108 123

0x110 0x10c 0x108 123 0x104 0x8048553

%esp 0x108 %eip 0x804854e

%esp 0x104 %eip 0x8048b90

Exemple dAppel de Procdure

Utilisation de la Pile pour Invocation de Procdure


En plus de ladresse de retour, la pile stocke aussi


Les

arguments Les variables locales Espace de travail (Scratch space)


La pile est alloue dans des Frames


Etat

pour une seule instanciation de procdure

La pile est mieux adapte lappel de procdure


Ltat

dune procdure donne est ncessaire durant lexcution de la procdure Lappel retourne avant lappelant (LIFO)

Exemple dune Chane dAppel


Exemple Proc1(){ Proc1 Proc2(){

. .
Proc2();

.
Proc3();

Proc3(){

Proc2 Proc3 Proc3 Proc3

. .
} }

.
Proc3();

. .
Proc3();

.
}

. .

Proc3 est rcursive

Frame de Pile

Contient
Variables locales Information de retour Espace temporaire

Frame Prcdent Pointeur de Frame : %ebp Frame pour Proc Pointeur de Pile : %esp

Gestion

Espace allou quand on accde la procdure


Code "Set-up"

Dsallou quand la procdure retourne


Code "Finish"

Sommet de Pile

Exemple

Exemple

Exemple

Exemple
Proc1(){ Proc2(){ . Proc3(){ Proc3(){ .. . Proc3(); Proc2(); . Proc1 Proc2 Proc1 Proc3 Proc3 Proc3 %ebp Proc3 %esp Proc3 Proc2 Frame Prcdent

. . . Proc3(); . Proc3(); . . . Proc3(); } .. . }


}

Exemple

Exemple

Exemple

Exemple
Proc1(){ Proc2(){ . Proc1 Proc2 Proc1 Proc3 Proc3 Proc3 %ebp Proc2 %esp

..

Frame Prcdent

Proc3(); Proc2();

.. Proc3(); ..
}

Exemple
Proc1(){ Proc1 Proc2 Proc3 Proc3 Proc3 %ebp Proc1 %esp

. .
Proc2();

Frame Prcdent

. .
}

Frame de Pile de IA32/Linux


Frame de pile courant


Arguments

Paramtres passs la fonction appele


Frame de lappelant Arguments @ de retour Ancien %ebp Registres sauvegards + Variables locales Pointeur de Pile : %esp Arguments

Variables locales

Si elles ne peuvent tre gardes dans des registres


Contexte des registres sauvegards Pointeur de Frame : %ebp Lancien pointeur de frame Adresse de retour

Frame de pile de lappelant


Empiler par linstruction call

Les arguments pour cet appel

Exemple : swap()

Exemple : swap()

Exemple : swap() Setup #1


Pile entrante %ebp Pile rsultante %ebp


&val2 &val1 @ de retour %esp yp xp

@ de retour Ancien %ebp %esp

swap: pushl movl pushl

%ebp %esp, %ebp %ebx

Exemple : swap() Setup #2


Pile entrante %ebp Pile rsultante


&val2 &val1 @ de retour %esp yp xp

@ de retour Ancien %ebp %esp %ebp

swap: pushl movl pushl

%ebp %esp, %ebp %ebx

Exemple : swap() Setup #3


Pile entrante %ebp Pile rsultante


&val2 &val1 @ de retour %esp yp xp

@ de retour Ancien %ebp Ancien %ebx %ebp %esp

swap: pushl movl pushl

%ebp %esp, %ebp %ebx

Exemple : swap() Corps


Pile entrante %ebp Pile rsultante


&val2 &val1 @ de retour

Offset (relatif %ebp) 12 yp 8 xp %esp

4 @ de retour 0 Ancien %ebp -4 Ancien %ebx %ebp %esp

movl 12(%ebp),%ecx movl 8(%ebp),%edx . . .

# get xp # get yp

Exemple : swap() Finish #1


Pile de swap Pile rsultante


12 yp 8 xp 4 @ de retour 0 Ancien %ebp -4 Ancien %ebx %ebp %esp 12 yp 8 xp

4 @ de retour 0 Ancien %ebp -4 Ancien %ebx %ebp %esp

movl movl popl ret

-4(%ebp), %ebx %ebp, %esp %ebp

Exemple : swap() Finish #2


Pile de swap Pile rsultante


12 yp 8 xp 4 @ de retour 0 Ancien %ebp -4 Ancien %ebx %ebp %esp 12 yp 8 xp

4 @ de retour 0 Ancien %ebp %ebp %esp

movl movl popl ret

-4(%ebp), %ebx %ebp, %esp %ebp

Exemple : swap() Finish #3

Exemple : swap() Finish #4

Vous aimerez peut-être aussi