Exploiter la stack sous windows xp sp2
Just for knowledge
Pourquoi cet article ?
On trouve sur internet à 90% que des articles expliquant la technique sous linux, or le
commun des mortels possèdent windows !!!
De plus la plupart des articles que l'on rencontre sont soit que de la théorie soit que du
repomper d'ailleur, et souvent repomper de l'article de phrack « Smashing The Stack For Fun
And Profit »
Je ne suis pas un grand écrivain comme vous pouvez le voir mais j'ai envie de faire partager ce
que je sais faire alors c'est parti.
Je vais tenter de vous montrer à quel point il est facile d'exploiter un stack overflow sous
windows xp sp2.
Vous aurez besoin d'un minimum de connaissances, en asssembleur, sur l'architecture de la
mémoire, et posséder un debuggeur.
Etant donné que je réalise cette exploitation sous windows, je me sers d'Ollydbg qui est pour
moi le meilleur debuggeur, qui sert pratiquement à tout :).
Rappel, stack ou pile
La stack est une structure de données basée sur le principe LIFO, ( Last In, Firts Out) ce qui
signifie que les derniers éléments mis sur la pile seront les premiers à être récupérer.
Concrétement lors de l'appel d'une fonction, ses arguments sont poussés (push) sur la stack
suivi par l'appel de la fonction (call).
push eax //push du deuxième argument
push ebx //push du premier argument
call 0x77BF93C7 // appel de la fonction à partir de son adresse.
Lorsque l'appel de la fonction est exécuté, c'est-à-dire le call 0x77BF93C7, la valeur actuelle de
l'eip ( le point d'instruction) est poussé également sur la pile et sert d'adresse de retour de la
fonction.
Explication:
Une fois que la fonction aura terminé sa fonction :p, l'eip sera dépilé (pop) et permettra à la
fonction de rendre la main, ainsi le programme continuera son exécution en sautant vers
l'adresse contenu dans l'eip. L'eip est appelé adresse de retour ou RET sur la pile car il permet
à la fonction de rendre la main à l'exécution qui va poursuivre vers une instruction suivante
dont l'adresse est contenue dans l'eip ok ? Çà va ?
Adresse haute
eip contenant 0x77BF9300 par exemple appéle RET
ebx
eax
Adresse basse
donc dès que la fonction a terminé son boulot la RET est dépilé et on jump vers 0x77BF9300
continuer l'exécution.