1
Plan de la s´eance
Technique du d´ebordement de pile : un probl`eme d’utilisation de la
pile d’ex´ecution
Quel code voudrait on voir s’ex´ecuter
Adressage relatif des ´etiquettes
Pourquoi la pile est elle ex´ecutable ? Cons´equences.
Quelle doit ˆetre la nouvelle adresse de retour ?
Mise en place du pi`ege. G´erer l’impr´ecision, etc.
Comment placer notre pi`ege
Quelques conseils
ITechnique du d´ebordement de pile : un probl`eme d’utilisation de la pile d’ex´ecution 2
La technique de d´ebordement de pile est l’une des plus utilis´ee pour
ex´ecuter du code malveillant. Pour ce faire, il faut qu’une application
critique pr´esente une vuln´erabilit´e. Par exemple :
#include <stdio.h>
#define TAILLE 88
void lecture(FILE *flux){
char tampon[TAILLE] ;
unsigned int foo = 0 ;
while ( (tampon[foo++]=fgetc(flux)) !=’\xF8’) ; /* le probl\‘eme est l\‘a */
}
int main(){
FILE *fichier = fopen("piege","r") ;
lecture(fichier) ;
fclose(fichier) ;
return 0 ;
}
La condition d’arrˆet (’\xF8’) est dict´ee par le soucis de simplicit´e.
ITechnique du d´ebordement de pile : un probl`eme d’utilisation de la pile d’ex´ecution 3
La fonction getchar pourrait ˆetre remplac´ee par n’importe quelle
fonction remplissant la m´emoire tampon `a partir d’une socket, du
clavier, etc. L’erreur de programmation est d’autoriser `a ´ecrire plus
de TAILLE octets dans tampon.
%ESP tampon
var. loc.
%EBP %EBP1
adresse
de retour
param`etres
.
.
.
La fonction getchar ne v´erifie pas le nombre
d’octets qu’elle copie dans le buffer tampon.
Si par erreur le tampon est rempli, elle conti-
nue malgr`es tout son travail et ´ecrase l’adresse
de retour ce qui provoque une erreur lors du
ret.
L’instruction `a l’adresse sp´ecifi´ee par ce que
getchar `a plac´ee sur la pile est ex´ecut´ee.
ILe d´ebordement de pile proprement dit : exemple d’´ecrasement de l’adresse de retour 4
Le d´ebordement de pile consiste `a modifier l’adresse de retour :
#include <stdio.h>
int main(void){
void function(void){
int x = 0 ;
int foo = 0 ; function() ;
int *ret ; x = 1 ;
printf("%d\n",x) ;
ret = &foo + 1; return 0 ;
(*ret) += 7 ; }
}
L’ex´ecution de ce programme affiche 0 et non 1.
ILe d´ebordement de pile proprement dit : exemple d’´ecrasement de l’adresse de retour 5
avant le call apr`es le call dans function
x= 0
main ebp
adresse de retour
x= 0
main ebp
ret = &foo
foo = 0
adresse de retour
x= 0
main ebp
Apr`es incr´ementation de 1, le pointeur ret pointe sur l’adresse de
retour. On peut ainsi incr´ementer cette derni`ere et ne pas ex´ecuter
l’affectation de 1 `a xdans la fonction main.
1 / 19 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !