Trouver kernel32.dll



Documents pareils
GlobalScape Secure FTP Server Buffer Overflow

Programmation assembleur : aperçu

Structure d un programme

Logiciel de base. Première année ENSIMAG

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

Assembleur. Faculté I&C, André Maurer, Claude Petitpierre

SSTIC Désobfuscation automatique de binaires. Alexandre Gazet. Yoann Guillot. Et autres idyles bucoliques...

Architecture des ordinateurs

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Rappels d architecture

Assembleur i8086. Philippe Preux IUT Informatique du Littoral. Année universitaire 95 96

Programmation C. Apprendre à développer des programmes simples dans le langage C

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Architecture des ordinateurs : Programmation des processeurs avec l'environnement «y86» (INF155)

Traduction des Langages : Le Compilateur Micro Java

Compilation (INF 564)

Résumé Génération de code Le code intermédiaire

Désobfuscation automatique de binaire - The Barbarian Sublimation

TP3 : Manipulation et implantation de systèmes de fichiers 1

1 Architecture du cœur ARM Cortex M3. Le cœur ARM Cortex M3 sera présenté en classe à partir des éléments suivants :

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Conception de circuits numériques et architecture des ordinateurs

La technologie Java Card TM

Département informatique de l université d Angers

Manuel d'installation

CM2 L architecture MIPS32

Jeu d instructions NIOS II

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Initiation à la sécurité

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Architecture des ordinateurs

UE Programmation Impérative Licence 2ème Année

Le Projet BINSEC. Automatiser l analyse de sécurité au niveau binaire. Airbus group, CEA, IRISA, LORIA, Uni. Joseph Fourier. p.

Microprocesseur + Logiciel

Cours d initiation à la programmation en C++ Johann Cuenin

KoinKoin. Système d exploitation à architecture basée micro-noyau. Antoine Castaing Nicolas Clermont Damien Laniel

Bases de programmation. Cours 5. Structurer les données

Présentation du noyau de Windows NT. Bertrand Coulon

Description de SQL SERVER. historique

Déprotection semi-automatique de binaire

GPA770 Microélectronique appliquée Exercices série A

Comprendre telock 0.98 et private versions.

Chapitre I Notions de base et outils de travail

Plan du cours. Historique du langage Nouveautés de Java 7

ASR1 TD7 : Un microprocesseur RISC 16 bits

Table des matières. Avant-propos... Préface... XIII. Remerciements...

Traduction binaire dynamique de l extension SIMD Néon de l ARMv7 dans Qemu

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Documentation utilisateur "OK-MARCHE" Historique des modifications. 3.0 Mise à jour complète suite à version OK-MARCHE V2.2. de marchés publics

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Licence Sciences et Technologies Examen janvier 2010

Un ordinateur, c est quoi?

Comment se connecter au VPN ECE sous vista

Playing with ptrace() for fun and profit

IV- Comment fonctionne un ordinateur?

CARPE. Documentation Informatique S E T R A. Version Août CARPE (Documentation Informatique) 1

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

La sécurité dans un réseau Wi-Fi

Introduction aux SGBDR

Structure fonctionnelle d un SGBD

Cours de Programmation Impérative: Zones de mémoires et pointeurs

REALISATION d'un. ORDONNANCEUR à ECHEANCES

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

TD Architecture des ordinateurs. Jean-Luc Dekeyser

Partie 7 : Gestion de la mémoire

Cahier Technique Envoi par à partir des logiciels V7.00

Croisière au cœur d un OS Étape 4 : Mise en place de la pagination

Métriques de performance pour les algorithmes et programmes parallèles

Exécutif temps réel Pierre-Yves Duval (cppm)

Techniques de contournement des firewalls personnels et protections

Cahier Technique Liaison Comptabilité Api / Sage ECF

Solution du challenge SSTIC Emilien Girault ANSSI/COSSI/DTO/BAI 06/06/13

Les vulnérabilités du noyau. LECORNET Olivier LEGROS Bruno VIGIER Nicolas Promo 2005

Introduction aux buffer overflow, CS335

Réalisation d un OS 32 bits pour PC(x86)

Cours A7 : Temps Réel

Introduction à MATLAB R

Alexandre Buge Epitech 5 Promo Soutenance de stage du 01/03/2004 au 31/08/2004

Systèmes de transmission

Cours de Système : Gestion de Fichiers

Guide d installation de Java et des pilotes de lecture des supports

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Internet Le service de noms - DNS

Rootkit pour Windows Mobile 6

Base de l'informatique. Généralité et Architecture Le système d'exploitation Les logiciels Le réseau et l'extérieur (WEB)

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Temps Réel. Jérôme Pouiller Septembre 2011

4. Initiation à l'assembleur

Installation d un poste i. Partage et Portage & permissions NTFS

Le langage C. Séance n 4

SRS Day. Vue d ensemble. Avérous Julien-Pierre

USTL - Licence ST-A 1ère année Codage de l information TP 1 :

Les portes logiques. Voici les symboles des trois fonctions de base. Portes AND. Portes OR. Porte NOT

Le Ro le Hyper V Troisie me Partie Haute disponibilite des machines virtuelles

TP, première séquence d exercices.

EFT. Guide de mise en route

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Transcription:

Trouver kernel32.dll Jerome Athias http://www.athias.fr Du fait que parler directement au kernel n est pas une option, une solution alternative est nécessaire. La seule autre manière de parler au noyau est de passer par une API existante sur la machine Windows. Sur Windows, comme les variantes Unix, les APIs standards du mode utilisateur sont exportées sous la forme d objets chargés dynamiquement qui sont mappés dans l espace d un processus durant son exécution. Ces types d objets son appelés Shared Objects (.so) soit Objets Partagés, ou dans le cas de Windows Dynamically Linked Library (.dll ) (Bibliothèques de Liaison Dynamique). Le choix d une DLL est très simple sur Windows car il n y en a qu une seule dont on soit sûr qu elle soit partagée dans l espace d un processus, si le binaire n est pas lié statiquement ; kernel32.dll. ntdll.dll n est pas traitée par souci de simplicité Kernel32.dll offre la possibilité, requise pour assurer la fiabilité et portabilité d un shellcode, de réaliser des actions comme l accès à un port, le téléchargement de fichier et ce, via les fonctions LoadLibraryA et GetProcAddress. La fonction LoadLibraryA, comme son nom l indique, permet de charger une DLL. WINBASEAPI HMODULE WINAPI LoadLibraryA(LPCSTR lplibfilename); LoadLibraryA utilise la convention d appel et accepte une pointeur chaîne constant sur le nom de fichier du module à charger, ournant l adresse de base (sous la forme d un pointeur void) du module chargé en cas de succès. Nous discuterons plus tard la résolution des adresses de symboles. Malheureusement, il existe un problème récurrent à l utilisation de kernel32.dll, c est qu elle n est pas chargée à la même adresse suivant la version de Windows. (cette adresse peut être paramétrée en utilisant l utilitaire rebase.exe). Cela implique que l on ne peut pas inclure les adresses des fonctions de kernel32.dll en dur dans le shellcode sans perdre en portabilité. Nous allons aborder trois méthodes pour pallier à ce problème. http://www.athias.fr/ 1

PEB Cibles: Windows 95/98/ME/NT/2K/XP Taille: 34 octets Cette première technique du PEB (Process Environment Block ) est documentée dans l excellent document de The Last Stage of Delerium (http://www.lsd-pl.net/documents/winasm-1.0.1.pdf). C est de loin la technique la plus fiable à utiliser pour déterminer l adresse de base de kernel32.dll. Le seul désavantage est que c est également la plus gourmande vis à vis de la taille du code requis ; 34 octets pour une version fonctionnant avec Windows 9x et Windows NT. Le système d exploitation alloue une structure pour chaque processus s exécutant qui peut toujours être trouvée en fs:[0x30] dans le processus. La structure PEB contient des informations sur les tas du processus, l image binaire, et, le plus important, trois listes chaînées sur les modules chargés qui ont été mappés dans l espace du processus. Les listes chaînées elles-mêmes diffèrent dans les fonctionnalités à montrer l ordre dans lequel les modules ont été chargés, à l ordre dans lequel les modules ont été initialisés. La liste chaînée de l ordre d initialisation est la plus intéressante car l ordre dans lequel kernel32.dll est initialisée est toujours constant ; c est toujours le second module a être initialisé. En parcourant cette liste, l on peut donc extraire l adresse de base de kernel32.dll de la seconde entrée. Code assembleur: find_kernel32: xor eax, eax mov eax, fs:[eax+0x30] test eax, eax js find_kernel32_9x find_kernel32_nt: mov eax, [eax + 0x0c] mov esi, [eax + 0x1c] mov eax, [eax + 0x8] jmp find_kernel32_finished find_kernel32_9x: mov eax, [eax + 0x34] lea eax, [eax + 0x7c] mov eax, [eax + 0x3c] find_kernel32_finished: http://www.athias.fr/ 2

Description du Code: Préserve le registre ESI xor eax, eax Met EAX à zéro mov eax, fs:[eax+0x30] Stocke l adresse du PEB dans EAX (eax+0x30 élimine les zéros (nulls) et sauve un octet en même temps) test eax, eax Compare EAX avec lui même js find_kernel32_9x Si SF vaut 1 alors c est un Windows 9x Sinon c est un NT (La logique ici est que l adresse où se charge kernel32.dll sur un Windows 9x est trop grande pour tenir dans un entier signé (plus grand que 0x7fffffff).) mov eax, [eax + 0x0c] Extrait le pointeur vers la structure de données du loader mov esi, [eax + 0x1c] Extrait la première entrée dans la liste d ordre d initialisation des modules Récupère la prochaine entrée dans la liste qui pointe sur kernel32.dll mov eax, [eax + 0x8] Récupère l adresse de base du module et la stocke dans EAX jmp find_kernel32_finished Saute vers la fin comme kernel32.dll a été fait mov eax, [eax + 0x34] Stocke le pointeur en offset 0x34 dans EAX (non documenté) lea eax, [eax + 0x7c] Charge l adresse effective dans EAX plus 0x7c pour rester dans la limite d un octet signé pour éviter les zéros (nulls) mov eax, [eax + 0x3c] Extrait l adresse de base de kernel32.dll Restaure ESI à sa valeur initiale. Retourne à l appelant. http://www.athias.fr/ 3

SEH Cibles: 95/98/ME/NT/2K/XP Taille: 33 octets La technique du SEH (Structured Exception Handling gestionnaire structuré d exception) est la deuxième technique la plus fiable pour obtenir l adresse de base de kernel32.dll. Cette méthode est également mentionnée dans le document du The Last Stage of Delerium mais n est pas couverte en détail. Le shellcode en lui-même est de 33 octets et fonctionne à la fois sur Windows 9x et Windows NT. Le procédé pour déterminer l adresse de base de kernel32.dll avec cette technique repose sur le fait que le SEH par défaut est configurer pour utiliser une fonction qui réside dans kernel32.dll. A la fois sur Windows 9x et Windows NT, la première entrée dans la liste SEH est toujours trouvée en fs:[0] dans le processus. L on peut donc parcourir la liste des gestionnaires d exception installés jusqu à la dernière. Quand la dernière est atteinte, l adresse du pointeur de fonction peut être utilisée comme point d entrée pour revenir en arrière par pas de 64Ko, ou pages de16 x 4096 octets. Dans Windows, les DLLs vont s aligner seulement par limites de 64Ko. A chaque limite de 64Ko, une vérification peut être réalisée pour voir si les 2 caractères sont MZ. Ces deux caractères marquent l entête MSDOS des exécutables portables. Quand une correspondance est trouvée, il est fiable de dire que l adresse de base de kernel32.dll a été trouvée. Le problème que l on peut rencontrer avec cette technique est que le UEH (Unhandled Exception Handler gestionnaire d exception non traitée) peut ne pas pointer dans kernel32.dll. Il est possible pour une application de irer complètement le gestionnaire standard de l image et d utiliser le sien propre. Dans ce cas, cette méthode ne peut pas être utilisée. Mais cela n arrive que rarement. Code assembleur: find_kernel32: push ecx xor ecx, ecx mov esi, fs:[ecx] not ecx find_kernel32_seh_loop: mov esi, eax cmp [eax], ecx jne find_kernel32_seh_loop find_kernel32_seh_loop_done: mov eax, [eax + 0x04] find_kernel32_base: find_kernel32_base_loop: find_kernel32_base_finished: pop ecx http://www.athias.fr/ 4

Description du Code : Préserve le registre ESI push ecx Préserve le registre ECX xor ecx, ecx Met ECX à zéro, ainsi il peut être utilisé comme l offset pour obtenir la première entrée dans la liste SEH mov esi, fs:[ecx] Capture la première entrée dans la liste SEH et la stocke dans ESI not ecx Inverse tous les bits dans ECX pour l utiliser dans la comparaison plus tard pour déterminer si le dernier gestionnaire (handler) d exception a été atteint Charge l entrée suivante dans la liste SEH et la stocke dans EAX mov esi, eax Initialise ESI à la prochaine entrée dans la liste cmp [eax], ecx Compare la valeur de EAX pour voir s il est à 0xffffffff. Si oui, la dernière entrée de la liste est atteinte et le pointeur de fonction doit être dans kernel32.dll. jne find_kernel32_seh_loop Si les valeurs sont différentes, alors l adresse de base n a pas encore été trouvée. On boucle encore mov eax, [eax + 0x04] Si l entrée suivante dans la liste est égale à 0xffffffff, on sait que la fin est atteinte. On peut donc extraire le pointeur pour cette entrée et le stocker dans EAX. Décrémente EAX. Si la valeur précédente était alignée sur une limite de 64Ko, cela va mettre les 16 bits inférieurs de EAX à 0xffff. Sinon, cela va juste décrémenter EAX à une valeur indéterminée Met à zéro les 16 bits inférieurs d EAX pour aligner l adresse sur une limite de 64Ko Vérifie si la valeur des 2 octets d EAX est MZ Si les valeurs ne correspondent pas, boucle encore et va à la prochaine limite de 64Ko inférieure. Sinon, saute plus bas comme l adresse de base de kernel32.dll a été trouvée. pop ecx Restaure ECX à sa valeur initiale Restaure ECX à sa valeur initiale Retourne à l appelant http://www.athias.fr/ 5

TOPSTACK Cibles: NT/2K/XP Taille: 25 octets La dernière technique décrite dans ce document est relativement nouvelle. Elle n implique que 25 octets et ne fonctionne actuellement que pour les versions basées sur Windows NT. Elle consiste à extraire le dessus du tas en utilisant un pointeur enregistré dans le TEB (Thread Environment Block). Chaque thread s exécutant possède son propre TEB correspondant avec des informations uniques à ce thread. Le TEB pour le thread en cours peut être accédé en fs:[0x18] dans le processus. Le pointeur sur le dessus du tas pour le thread courant peut être trouvé 0x4 octets dans le TEB. A partir de là, 0x1c octets dans le tas depuis le dessus réside un pointeur qui existe quelque part dans kernel32.dll. Finalement, nous pouvons utiliser la même approche que la technique du SEH en parcourant les limites de 64Ko jusqu à trouver un MZ. Code assembleur: find_kernel32: xor esi, esi mov esi, fs:[esi + 0x18] mov eax, [eax 0x1c] find_kernel32_base: find_kernel32_base_loop: find_kernel32_base_finished: http://www.athias.fr/ 6

Description du Code : Préserve le register ESI xor esi, esi Met ESI à zéro pour l utiliser comme base pour l index dans le segment FS mov esi, fs:[esi + 0x18] Capture le TEB et le stocke dans ESI Ajoute 4 à ESI, la valeur actuelle n a pas d importance Capture le haut du tas et le stocke dans EAX mov eax, [eax 0x1c] Capture le pointeur qui est 0x1c octets dans la pile et le stocke dans EAX. Cela sera l adresse qui est dans kernel32.dll Décrémente EAX. Si la valeur précédente était alignée sur une limite de 64Ko, cela va mettre les 16 bits de poids faible d EAX à 0xffff. Sinon, cela va juste décrémenter EAX pour une valeur indéterminée Met à zéro les 16 bits de poids faible d EAX pour aligner l adresse sur une limite de 64Ko Vérifie si la valeur des 2 octets de EAX est MZ Si les valeurs ne correspondent pas, boucle encore et va à la prochaine limite inférieure de 64Ko. Sinon, saute plus bas puisque l adresse de base de kernel32.dll a été trouvée. Restaure ESI à sa valeur initiale. Retour à l appelant http://www.athias.fr/ 7