Download - StHack 2014 - Ninon Eyrolles Obfuscation 101
OBFUSCATION 101Ou : � Pourquoi faire simple quand on peut faire complique ? �
Ninon Eyrolles
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Plan
1 IntroductionQu’est-ce que l’obfuscation ?
2 Obfuscation du flot de controle
3 Obuscation du flot de donnees
4 Obfuscation Python
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Prelude
1 def checkauth(password):2 if (password == "chunkybacon"):3 print("Here’s some super private information ...")4 else:5 print("Wrong password , go away!")
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
L’obfuscation, ou � obscurcissement � de code
Definition
L’obfuscation consiste a rendre l’analyse de code la plus complexe et laplus couteuse possible, tout en conservant le comportement original (lasemantique observable) du programme.
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
L’obfuscation, ou � obscurcissement � de code
Definition
L’obfuscation consiste a rendre l’analyse de code la plus complexe et laplus couteuse possible, tout en conservant le comportement original (lasemantique observable) du programme.
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
L’obfuscation, ou � obscurcissement � de code
Definition
L’obfuscation consiste a rendre l’analyse de code la plus complexe et laplus couteuse possible, tout en conservant le comportement original (lasemantique observable) du programme.
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Definition plus formelle
On peut definir obfuscateur ideal O ainsi (pour tout programme P) :
1. Fonctionnalite : P et sa version obfusquee O(P) doivent avoir lememe comportement au niveau des entrees / sorties.
2. Efficacite : le temps d’execution et la taille de O(P) ne doivent pasetre trop grands par rapport a ceux de P.
3. Obfuscation : on ne peut pas apprendre plus de l’analyse de O(P)que de l’observation de ses entrees et sorties.
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Definition plus formelle
On peut definir obfuscateur ideal O ainsi (pour tout programme P) :
1. Fonctionnalite : P et sa version obfusquee O(P) doivent avoir lememe comportement au niveau des entrees / sorties.
2. Efficacite : le temps d’execution et la taille de O(P) ne doivent pasetre trop grands par rapport a ceux de P.
3. Obfuscation : on ne peut pas apprendre plus de l’analyse de O(P)que de l’observation de ses entrees et sorties.
→ Un tel obfuscateur n’existe pas pour tous les programmes ! a
aOn the (Im)possibility of Obfuscating Programs, Barack et al.
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Pourquoi, ou et comment obfusquer ?
Motivations
protection du code sensible : dissimuler des cles embarquees dans lecode par exemple
protection d’algorithme : question de propriete intellectuelle
Differents niveaux
Problemes poses
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Pourquoi, ou et comment obfusquer ?
Motivations
Differents niveaux
code source
langage intermediaire (IR)
code assembleur
Problemes poses
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Pourquoi, ou et comment obfusquer ?
Motivations
Differents niveaux
Problemes poses
→ on veut obfusquer de facon automatique→ il faut trouver un compromis performances / obfuscation
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Plusieurs types d’obfuscation
obfuscation du flot de controle (control flow)
obfuscation du flot de donnees (data flow)
reecriture des symboles : nom de variable, de fonction...
chiffrement du code, packing...
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Plusieurs types d’obfuscation
obfuscation du flot de controle (control flow)
obfuscation du flot de donnees (data flow)
reecriture des symboles : nom de variable, de fonction...
chiffrement du code, packing...
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Plan
1 Introduction
2 Obfuscation du flot de controleDefinitionsObfuscation du control flowApplatissement de code
3 Obuscation du flot de donnees
4 Obfuscation Python
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Definitions
Le flot de controle (control flow)
represente le flot d’execution d’un programme : les differentschemins possibles lors de l’execution
on retrouve les boucles (for, while), les conditions (if), lesappels a d’autres fonctions...
on le modelise grace a un Control Flow Graph (CFG), qui representeles basic blocks et les liaisons entre eux
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Definitions
Le flot de controle (control flow)
x = 10y = 0
while(x ≥ 0)
y = y + 2x = x − 1
return y
true false
Figure : CFG de pseudo-code source
Figure : CFG de code assembleur
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche a transformer le CFG :
deroulage des boucles for
inlining de fonctions
insertion de junk code
predicats opaques
applatissement de flot de controle (ou control flow flattening)
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche a transformer le CFG :
deroulage des boucles for
inlining de fonctions
insertion de junk code
predicats opaques
applatissement de flot de controle (ou control flow flattening)
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche a transformer le CFG :
deroulage des boucles for
inlining de fonctions
insertion de junk code
predicats opaques
applatissement de flot de controle (ou control flow flattening)
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche a transformer le CFG :
deroulage des boucles for
inlining de fonctions
insertion de junk code
predicats opaques
applatissement de flot de controle (ou control flow flattening)
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche a transformer le CFG :
deroulage des boucles for
inlining de fonctions
insertion de junk code
predicats opaques
applatissement de flot de controle (ou control flow flattening)
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche a transformer le CFG :
deroulage des boucles for
inlining de fonctions
insertion de junk code
predicats opaques
applatissement de flot de controle (ou control flow flattening)
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Applatissement de code
Definition
Applatissement de flot de controle
transformer la structure du programme pour rendre la reconstructiondu CFG plus difficile
coder les informations du flot de controle et cacher le resultat dansle flot de donnees
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Applatissement de code
Principe
Implementation
les basic blocks sont numerotes
un dispatcher gere l’execution
une variable determine quelbloc doit etre execute apres lebloc courant
a chaque fin de bloc, cettevariable est remise a jour, et onva vers le dispatcher quiredirige vers le bloc suivant.
INITval = 1
DISPATCHERswitch(val)
block 1
some codeval = 2
block 2
some codeval = 3
block 3
some codereturn
Figure : Principe de l’applatissement decode
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Applatissement de code
Exemple
Figure : CFG original
Figure : CFG apres applatissement duflot de controle
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Plan
1 Introduction
2 Obfuscation du flot de controle
3 Obuscation du flot de donneesDefinitionQuelques techniques d’obfuscation du flot de donneesLa Whitebox
4 Obfuscation Python
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Definition
Analyse du flot de donnees
Plusieurs axes
informations fournies par les donnees du programme : chaınes decaracteres, entiers...
relations entre les donnees ou entre les entrees et sorties (duprogramme, d’une fonction, d’un basic block)
interactions entre le programme et les donnees : lectures, ecritures,emplacement des donnees dans la memoire...
notions plus formelles : variables � vivantes �(live), equations de flotde donnees, analyse avant et arriere...
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques techniques d’obfuscation du flot de donnees
Exemples
Pour complexifier l’analyse des donnees :
encoder les constantes (chaınes de caracteres par exemple)
insertion de donnees inutiles (proche du junk code)
complexification des operations arithmetiques sur les donneesx + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
modifier la facon dont sont stockees / manipulees les donnees :eclater les tableaux, changer la convention d’appel des fonctions...
encoder les donnees lors des lectures et ecritures
f (x)
MEMORYx xf f −1
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques techniques d’obfuscation du flot de donnees
Exemples
Pour complexifier l’analyse des donnees :
encoder les constantes (chaınes de caracteres par exemple)
insertion de donnees inutiles (proche du junk code)
complexification des operations arithmetiques sur les donneesx + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
modifier la facon dont sont stockees / manipulees les donnees :eclater les tableaux, changer la convention d’appel des fonctions...
encoder les donnees lors des lectures et ecritures
f (x)
MEMORYx xf f −1
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques techniques d’obfuscation du flot de donnees
Exemples
Pour complexifier l’analyse des donnees :
encoder les constantes (chaınes de caracteres par exemple)
insertion de donnees inutiles (proche du junk code)
complexification des operations arithmetiques sur les donneesx + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
modifier la facon dont sont stockees / manipulees les donnees :eclater les tableaux, changer la convention d’appel des fonctions...
encoder les donnees lors des lectures et ecritures
f (x)
MEMORYx xf f −1
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques techniques d’obfuscation du flot de donnees
Exemples
Pour complexifier l’analyse des donnees :
encoder les constantes (chaınes de caracteres par exemple)
insertion de donnees inutiles (proche du junk code)
complexification des operations arithmetiques sur les donneesx + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
modifier la facon dont sont stockees / manipulees les donnees :eclater les tableaux, changer la convention d’appel des fonctions...
encoder les donnees lors des lectures et ecritures
f (x)
MEMORYx xf f −1
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques techniques d’obfuscation du flot de donnees
Exemples
Pour complexifier l’analyse des donnees :
encoder les constantes (chaınes de caracteres par exemple)
insertion de donnees inutiles (proche du junk code)
complexification des operations arithmetiques sur les donneesx + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
modifier la facon dont sont stockees / manipulees les donnees :eclater les tableaux, changer la convention d’appel des fonctions...
encoder les donnees lors des lectures et ecritures
f (x)
MEMORYx xf f −1
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques techniques d’obfuscation du flot de donnees
Exemples
Pour complexifier l’analyse des donnees :
encoder les constantes (chaınes de caracteres par exemple)
insertion de donnees inutiles (proche du junk code)
complexification des operations arithmetiques sur les donneesx + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
modifier la facon dont sont stockees / manipulees les donnees :eclater les tableaux, changer la convention d’appel des fonctions...
encoder les donnees lors des lectures et ecritures
f (x)
MEMORYx xf f −1
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
La Whitebox
Definition d’une Whitebox
Algorithme cryptographique
prend en entree un message et une cle
fournit un message chiffre en sortie
Whitebox
Whitebox attack context (WBAC)
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
La Whitebox
Definition d’une Whitebox
Algorithme cryptographique
Whitebox
implementation particuliere d’un algorithme cryptographique
la cle est incorporee dans l’algorithme
Whitebox attack context (WBAC)
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
La Whitebox
Definition d’une Whitebox
Algorithme cryptographique
Whitebox
Whitebox attack context (WBAC)
l’attaquant a tous les privileges, il a acces a l’implementation del’algorithme
il peut observer l’execution du programme (avec des cles instanciees)
les details internes de l’algorithme sont visibles et modifiables
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
La Whitebox
Definition d’une whitebox
White-box AES
etapes de l’AES = SubBytes, ShiftRows, MixColumns etAddRoundKey
on decrit les etapes de l’AES avec des tables (lookup-tables)
on applique des encodages pour masquer les entrees et les sorties
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
La Whitebox
Definition d’une whitebox
White-box AES
etapes de l’AES = SubBytes, ShiftRows, MixColumns etAddRoundKey
on decrit les etapes de l’AES avec des tables (lookup-tables)
on applique des encodages pour masquer les entrees et les sorties
S(x ⊕ k r−1i,j )F−1 G G−1 MC(x) H
Figure : Principe d’encodage des lookup-tables
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
La Whitebox
Definition d’une whitebox
White-box AES
etapes de l’AES = SubBytes, ShiftRows, MixColumns etAddRoundKey
on decrit les etapes de l’AES avec des tables (lookup-tables)
on applique des encodages pour masquer les entrees et les sorties
F−1 ◦ S(x ⊕ k r−1i,j ) ◦ G G−1 ◦MC(x) ◦ H
Figure : Principe d’encodage des lookup-table
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Plan
1 Introduction
2 Obfuscation du flot de controle
3 Obuscation du flot de donnees
4 Obfuscation PythonPourquoi obfusquer du code Python ?Comment obfusquer du code Python ?Obfuscation source a sourceQuelques codes d’exemples
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Pourquoi obfusquer du code Python ?
Contexte
applications developpees en Python (DropBox par exemple) : uninterpreteur modifie est livre avec l’application
creations de � packeurs �pour complexifier l’acces de l’utilisateur aucode source
trois axes d’obfuscation :
- l’interpreteur modifie pour rendre difficile l’analyse des fichierscompiles
- differentes mesures pour rendre la decompilation plus difficile- l’obfuscation source a source dans le cas ou le code est retrouve
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Comment obfusquer du code Python ?
Obfuscations propres a Python
Modification de l’interpreteur
compilation statique du programme et des modules necessaires
permutation des opcodes du code compile
Prevention de la decompilation
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Comment obfusquer du code Python ?
Obfuscations propres a Python
Modification de l’interpreteur
Prevention de la decompilation
insertion d’opcodes inutiles
transformation des operateurs lors de l’execution
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation source a source
L’arbre syntaxique abstrait
Arbre syntaxique abstrait (ou AbstractSyntax Tree) : representation abstraite d’unprogramme par un arbre.
les nœuds representent les operateurs
les feuilles representent les operandes
×
+
x y
z
Figure : Representation del’AST de (x + y) × z
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation source a source
Le module ast
def func(x):a = 0;for i in range (0,10):
a = a + xreturn a
Module(body=[
FunctionDef(name=’func’,args=Name(id=’x’)body=[
Assign(Name(id=’a’), value=Num(n=0)),For(
Name(id=’i’),Call(Name(id=’range’),
args=[Num(n=0), Num(n=10)])body=[
Assign(Name(id=’a’), value=BinOp(
left=Name(id=’a’),op=Add(),right=Name(id=’x’)))])
Return(value=Name(id=’a’)])
Figure : Exemple de code Python et son AST (simplifie) obtenu avec le moduleast
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation source a source
Le source a source en Python
Principe
Figure : Flot de compilation pour le source-a-source Python
Exemples d’obfuscation
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Obfuscation source a source
Le source a source en Python
Principe
Exemples d’obfuscation
transformation du flot de controle : boucles for en boucleswhile, instructions if en boucles while, modification de la creationde certains objets comme les list comprehension
transformation du flot de donnees : encodage des chaınes decaracteres, insertion d’expressions booleennes-arithmetiques
transformation des symboles : remplacement des noms defonctions et variables par des chaınes de caracteres aleatoires
transformation � facon programmation fonctionnelle � : lesfonctions sont remplacees par des fonctions lambda
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques codes d’exemples
Obfuscation de flot de controle
1 for i in range (0,10):2 a = a + x
1 uijjpf = (range(0, 10)).__iter__ ()2 try:3 while 1:4 i = uijjpf.next()5 a = (a + x)6 except StopIteration:7 pass
Figure : Exemple d’obfuscation de boucle for
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques codes d’exemples
Obfuscation de flot de controle
1 res = [i[0] for i in2 [j for j in3 [[1 ,2] ,[3 ,4] ,[5 ,6]]]]
1 def baizvc ():2 uskewh = []3 fyxvcb = ([[1, 2], [3, 4], [5,
6]]).__iter__ ()4 try:5 while 1:6 j = fyxvcb.next()7 uskewh.append(j)8 except StopIteration:9 pass
10 return uskewh1112 def rphfuq ():13 ueovat = []14 gmivjw = baizvc ().__iter__ ()15 try:16 while 1:17 i = gmivjw.next()18 ueovat.append(i[0])19 except StopIteration:20 pass21 return ueovat22 res = rphfuq ()
Figure : Exemple d’obfuscation de declaration de list comprehension
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Quelques codes d’exemples
Obfuscation facon programmation fonctionnelle
def ack1(M, N):if M == 0:
return N + 1elif N == 0:
return ack1(M - 1, 1)else:
return ack1(M - 1,ack1(M, N - 1))
ack1 = (lambda M, N: (lambda _: ((lambda _: (_.__setitem__(’$’,((_[’N’] if (’N’ in _) else
N) + 1)), _)[(-1)])(_) if ((_[’M’] if (’M’ in _) else M)== 0) else (lambda _: ((lambda _: (_.__setitem__(’$’,(_[’ack1’] if (’ack1’ in _)
else ack1)(((_[’M’] if (’M’in _) else M) - 1), 1)), _)[(-1)])(_) if ((_[’N’] if (’N’ in _) else N) == 0) else (lambda _: (_.__setitem__(’$’,(_[’ack1’] if (’ack1’ in _)
else ack1)(((_[’M’] if (’M’in _) else M) - 1), (_[’ack1’] if (’ack1’ in _) else ack1)((_[’M’] if (’M’ in _) else M), ((_[’N’] if (’N’ in _)else N) - 1)))), _)[(-1)])(_)))(_)))({’M’: M, ’N’: N, ’$’:None})[’$’])
Figure : Obfuscation de la fonction d’Ackermann
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Conclusion
L’obfuscation
utilisee pour rendre l’analyse de code plus difficile
obfuscation de flot de controle, de flot de donnees
obfuscation Python : mise en pratique des techniques
Travaux futurs
generateur d’expressions booleennes-arithmetiques
mise au point d’un module d’obfuscation
nouvelles techniques d’obfuscation Python ?
[email protected] I @quarkslab.com
Questions?
Remerciements : Serge Guelton pour l’obfuscation Python, et toutel’equipe de Quarkslab
Introduction Obfuscation du flot de controle Obuscation du flot de donnees Obfuscation Python
Table des matieres
1 IntroductionQu’est-ce que l’obfuscation ?
2 Obfuscation du flot de controleDefinitionsObfuscation du control flowApplatissement de code
3 Obuscation du flot de donneesDefinitionQuelques techniques d’obfuscation du flot de donneesLa Whitebox
4 Obfuscation PythonPourquoi obfusquer du code Python ?Comment obfusquer du code Python ?Obfuscation source a sourceQuelques codes d’exemples