Utilisation d un compilateur pour évaluer la résistance des obfuscations de programmes C



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

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

UE C avancé cours 1: introduction et révisions

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Une bibliothèque de templates pour CUDA

Introduction au langage C

Plan global Outils de développement et compilation. Plan. Objectifs des outils présentés. IDE, GCC/Clang, ASAN, perf, valgrind, GDB.

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Les structures de données. Rajae El Ouazzani

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Machines Virtuelles. et bazard autour. Rémi Forax

Analyse de sécurité de logiciels système par typage statique

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

Conception de circuits numériques et architecture des ordinateurs

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

Vérification formelle de la plate-forme Java Card

Introduction à MATLAB R

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Les structures. Chapitre 3

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Traduction des Langages : Le Compilateur Micro Java

Rappels d architecture

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

Initiation. àl algorithmique et à la programmation. en C

IRL : Simulation distribuée pour les systèmes embarqués

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Compression de Données - Algorithme de Huffman Document de Conception

Les arbres binaires de recherche

Quelques éléments de compilation en C et makefiles

Programmer en JAVA. par Tama

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

Conventions d écriture et outils de mise au point

Java - la plateforme

Gestion mémoire et Représentation intermédiaire

Algorithmique et Programmation, IMA

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

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

Machines virtuelles Cours 1 : Introduction

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

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

Cours 1 : La compilation

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

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

Arbres binaires de recherche

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Environnements de développement (intégrés)

Algorithmique I. Algorithmique I p.1/??

Analyse de performance, monitoring

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Compilation (INF 564)

as Architecture des Systèmes d Information

Contraintes, particularités. 1. Généralités Gestion de la mémoire a. Type des variables et constantes... 2

Algorithmique, Structures de données et langage C

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Désobfuscation automatique de binaire - The Barbarian Sublimation

Introduction aux Machines Virtuelles avec VMKit

Cours d Algorithmique et de Langage C v 3.0

Comment reproduire les résultats de l article : POP-Java : Parallélisme et distribution orienté objet

Conception. Génie Logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 17/04/2007

Structure d un programme

Architecture des ordinateurs

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Qualité du logiciel: Méthodes de test

Quatrième partie IV. Test. Test 15 février / 71

Programmation C. J.-F. Lalande. 15 novembre 2012

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

Chapitre 2. Classes et objets

Sanity Check. bgcolor mgcolor fgcolor


Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

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

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Cours de Systèmes d Exploitation

La mémoire. Un ordinateur. L'octet. Le bit

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Programmation assembleur : aperçu

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

Cours d algorithmique pour la classe de 2nde

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

DECLARATION DES PERFORMANCES N 1

Le Processus RUP. H. Kadima. Tester. Analyst. Performance Engineer. Database Administrator. Release Engineer. Project Leader. Designer / Developer

OS Réseaux et Programmation Système - C5

Initiation à l algorithmique

La programmation des PIC en C. Les fonctions, les interruptions.

Évaluation et implémentation des langages

Claude Delannoy. 3 e édition C++

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Performances et optimisations

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

Vérifier la qualité de vos applications logicielle de manière continue

Java Licence Professionnelle CISII,

Gestion hybride de la mémoire dynamique dans les systèmes Java temps-réel

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Transcription:

1 Utilisation d un compilateur pour évaluer la résistance des obfuscations de programmes C Stéphanie Riaud INRIA & DGA-MI Directrice de thèse : Sandrine Blazy

2 L obfuscation *Collberg] : une solution de lutte contre la rétro-conception Transformer le code source, binaire, ou une représentation intermédiaire d un programme. Rendre le code binaire désassemblé le moins intelligible possible Protéger un secret contenu dans le code du programme : un savoir, une donnée sensible etc. Temps nécessaire à la rétro-conception équivalent au temps de conception.

3 Obfuscation de programmes C Pourquoi obfusquer au niveau du langage C? Perte d information liée au passage du langage C au langage assembleur. Paramètres de fonctions Types des variables Structures de données accès calculés antérieurement par le compilateur etc. Le processus d optimisation peut avoir un impact sur l efficacité des obfuscations. Il faut être certain que le fichier binaire est bien transformé! Concevoir des transformations qui ne seront pas annulées lors de la compilation : Valider les obfuscations Mesurer le degré de résistance des transformations face au processus de compilation : Evaluer et comparer l efficacité des transformations

4 Architecture du processus de test Trois étapes : obfuscation, compilation et optimisation puis désassemblage

5 Sommaire Obfuscation Structures de données Compilation et optimisation Le compilateur GCC Optimisations dans GCC Fichiers d informations générés lors de la compilation Les optimisations à risques Réduction Scalaire des Agrégats Analyse des fichiers générés Elimination ou modification d expressions Analyse des fichiers générés Désassemblage IDA Pro Réduction Scalaire des Agrégats BinDiff Elimination ou modification d expressions

6 Obfuscation Structures de données Analyse Dynamique : masquer l emplacement des données l emplacement des données est modifié en temps réel Déplacées dynamiquement Analyse Statique : masquer les accès les accès sont remplacés par des appels à une fonction struct test{int a;int b;}; int main (void){ struct test t; t.a = 10; t.b = 20; int c = t.a + t.b; return c; } struct test {int a;int b;}; int compteur_acces; int tab_acces[4] = { 0, 1, 0, 1, }; int *tab_adresses[2]; int *accede(void) { } int main(void) { struct test t; int c; c = 0; *(tab_adresses + 1) = &t.b; *(tab_adresses + 0) = &t.a; *(accede())= 10; *(accede())= 20; c = *accede() + *accede(); return c; } Tableau d'adresses (tab_adresses) Tableau d'accès (tab_acces) Compteur d'accès (compteur_acces) Fonction d'accès (accede) :

Architecture du processus de test 7

8 Compilation et optimisation [GCC] Utilisation du compilateur Gcc Sources et documentation disponibles Fortement optimisant Optimisations dans GCC [GlekHubicka] Intra-procédurales Inlining Optimisations scalaires : éliminations de code morts propagation de copies etc. Réduction scalaire arguments de fonctions champs de structures etc. Optimisation de la gestion des exceptions etc. Construction du graphe d appel et de la liste des variables externes et statiques du programme [Briggs al.] Inter-procédurales Propagation de constantes Inlining Propagation de profil etc.

9 Compilation et optimisation Génération des fichiers d informations détaillés Pour les passes intra-procédurales : -fdump-tree-all-details Arbres originel & optimisé Vue globale sur les modification apportées Difficilement lisibles Forme Gimple et SSA Fichier de statistiques Détail sur les passes qui ont modifié le programme Permet d accéder aux fichiers intéressants Fichiers générés par les passes Informations précises (Arbre Gimple ou SSA et commentaires propres à l optimisation) Pour les passes inter-procédurales : -fdump-ipa-all-details Graphe d appel détaillé Informations sur les variables statiques et externes Fichiers générés par les passes Informations précises (Arbre Gimple et commentaires propres à l optimisation)

10 Compilation et optimisation Etude effectuée Analyse des optimisations au sein de la chaîne d optimisation Uniquement sur la partie intra-procédurale (étude en cours) Sélection d optimisations à risques : Obfuscation de structures Remplacement scalaire des agrégats Elimination de l élément modifié Remplacement d opérations scalaires simples par une suite d opérations complexes Optimisations scalaires Elimination de code mort Propagation de copies et de constantes Elimination des sous expressions communes Simplification des opérations liées à l obfuscation Tests effectués sur la suite de tests du compilateur

11 Les optimisations à risque Réduction Scalaire des Agrégats [Jambor] Remplace les champs des structures par des variables scalaire structures définies localement paramètres de fonctions Séquence de trois passes intra-procédurales Niveaux d optimisation O et O2 Implémentation dans GCC Tous les champs ne sont pas candidats à l optimisation nature des champs pas d adresse mémoire (ex : référence) remplaçable par une variable scalaire etc. Les champs candidats peuvent être disqualifiés nature des accès un accès au moins etc. struct simplestruct { int t1; int t2; }deuxentiers; int main (){ } int res; deuxentiers.t1 = 2; deuxentiers.t2 = 4; res = deuxentiers.t1+deuxentiers.t2; return res; Rejeté Champ Disqualifié Candidat int main (){ } Optimisé int res, _4, _5; _4 = 2; _5 = 4; res = _4 + _5; return res;

12 Réduction Scalaire des Agrégats Analyse des fichiers générés : - un champ obfusqué n est jamais optimisé les champs optimisés n ont pas été modifiés - un champ disqualifié est rejeté après obfuscation les champs disqualifié n ont pas été modifiés Un champ obfusqué est rejeté lors du processus d optimisation - Raison invoquée : needs to live in memory - Initialisation de tableaux, références ou variables globales Initialisation du tableau d adresses au début de l obfuscation Nom du Nombre de champs optimisés dans le programme non obfusqué Nombre de Nombre de champs optimisés dans le programme obfusqué programme de champs esra sra eipa_sra test obfusqués esra sra eipa_sra D O D O D O D O D O D O eipa-sra-1 0 1 0 1 0 1 2/3 0 0 0 0 0 0 eipa-sra-2 0 0 0 0 0 2 2/3 0 0 0 0 0 0 eipa-sra-3 2 0 0 0 0 2 4/6 0 0 0 0 0 0 sra-3 1 0 0 0 0 0 2/2 0 0 0 0 0 0 sra-6 6 6 0 0 0 0 12/24 0 0 0 0 0 0 sra-8 4 4 1 0 0 0 2/8 2 2 0 0 0 0 sra-9 2 1 2 0 0 0 3/4 1 0 0 0 0 0 sra-11 1 2 1 0 0 0 0 1 2 1 0 0 0 sra-12 5 0 0 0 0 0 10/10 0 0 0 0 0 0

13 Les optimisations à risque Elimination ou modification d expressions *Muchnick] Élimination de code mort Suppression des instructions qui n impactent pas la sortie du programme dépendances de branches et corps de boucles Propagation de constantes Remplacement des variables ayant une valeur constante par une constante prédicats des structures conditionnelles Propagation de copies Remplacement des copies de variables par la variable d origine Élimination des sous-expressions communes Remplacement des expressions identiques par une variable Appelées plusieurs fois

14 Analyse des fichiers générés Deux cas mis en avant : fonction d accès non-inlinée les accès aux champs doivent toujours s effectuer grâce à un appel la fonction d accès ne doit pas être trop simplifiées échange des données dans le tableau d adresses retour d une adresse lue à partir des deux tableaux fonction d accès inlinée échange des données à chaque accès (ou presque) lecture de l adresse à partir des deux tableaux Beaucoup plus d expressions optimisées lorsque la fonction d accès est inlinée cumul de plusieurs fonctions inlinées recopiées plusieurs fois augmentation du nombre d expressions optimisés en fonction du nombre de fonctions inlinées Moins d expressions optimisées lorsque la fonctions d accès n est pas inlinée expressions contenant des tableaux globaux ou des appels très peu optimisable Les expressions sur lesquelles repose l obfuscation ne sont pas supprimées échange de valeurs accès depuis les tableaux

Architecture du processus de test 15

16 Désassemblage Objectif : vérifier les résultats précédents Analyse des fichiers binaires générés (obfusqués et optimisés) Plus réaliste que le code assembleur généré par le compilateur IDA Pro (Hex Rays [HexRay]) Désassembleur interactif Listing assembleur. Généré automatiquement Amélioré par l utilisateur Modification Annotation Propagation des informations Construction des CFG et CG Facilité de navigation Interfaces spécifiques Chaines de caractères Fonctions (internes / externes) Structures Etc. Logo IDA Pro

IDA Pro 17

18 Désassemblage : Réduction Scalaire des Agrégats Vérifier que les structures sont toujours présentes Segment.data déclarées et définies globalement Pile d exécution définies localement Champs stockés séquentiellement Pointeur de structure identifiant conservé (option g) Accédés grâce à des offset constants Résultats conformes à ceux obtenus lors de l analyse des fichiers générés lors de la compilation champs rejetés

19 Désassemblage BinDiff (Zynamics [Zynamics]) Greffon au logiciel IDA pro Comparaison de deux binaires désassemblés Représentation du programme sous forme d un graphe d appel chaque nœud est le graphe de flot de contrôle d une fonction Correspondance entre les adresses des deux fichiers binaires désassemblés code couleur simple Calcul de pourcentage de similarité / différence entre les fonctions permet de repérer les fonctions très impactées

BinDiff 20

21 Désassemblage : Elimination ou modification d expressions Utilisation du greffon BinDiff pour comparer les fichiers binaires expressions modifiées ou supprimées Résultats observés similaires à ceux obtenus en analysant les fichiers d informations appels de fonctions non supprimés opérations sur les tableaux conservées Pas d impact sur la qualité de l obfuscation Les options de compilations d impactent pas l efficacité de l obfuscation

22 Conclusion Résistance de l obfuscation aux optimisations tableaux globaux appels de fonctions Vérifier ce résultat avec : inlining plus poussé les optimisations inter-procédurales des exemples plus réalistes Génération automatique de résultats : chaque transformation doit être vérifiée ainsi comparaison des transformations en fonction de leur degré de résistance aux optimisations

23 Bibliographie [HexRay] https://www.hex-rays.com [Zynamics] http://www.zynamics.com/bindiff.html [Gcc] http://www.gcc.gnu.org [GlekHubicka] Optimizing real-world applications with GCC Link Time Optimization, Taras Glek (Mozilla Corporation) et Jan Hubicka (SuSE CR s.r.o). [Jambor] Interprocedural optimizations of function parameters, Martin Jambor (SUSE Labs). [Briggs al.] WHOPR Fast and Scalable Whole Program Optimizations in GCC, Preston Briggs, Doug Evans, Brian Grant, Robert Hundt, William Maddox, Diego Noviollo, Seongbae Park, David Sehr, Ian Taylor, Olli Wild (Google). [Muchnick] Advanced Compiler Design Implementation, Steven S.Munchnick. [Collberg] Surreptitious Softawe, obfuscation, watermarking and tamperproofing, Christian Collberg and Jasvir Nagra