The general purpose of software obfuscation is to make the analysis of software as difficult and expensive as possible, while keeping the original behaviour of the program. Its main applications are the protection of sensitive code and/or intellectual property. This talk will show you the two major types of obfuscation (control flow, data flow), several techniques of these two categories, and then concrete examples of "source-to-source" obfuscation applied to the Python langage.
Bio : Native of Bordeaux, Ninon Eyrolles completed her studies at Bordeaux 1 University (Master Cryptologie et Sécurité Informatique), and did an internship in the LaBRI. Then she exiled herself to Paris for her final internship, and stayed there to start a thesis on software obfuscation.
StHack 2014 - Jerome "@funoverip" Nokin Turning your managed av into my botnet
StHack 2014 - Ninon Eyrolles Obfuscation 101
1. OBFUSCATION 101
Ou : Pourquoi faire simple quand on peut faire compliqu´e ?
Ninon Eyrolles
2. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Plan
1 Introduction
Qu’est-ce que l’obfuscation ?
2 Obfuscation du flot de contrˆole
3 Obuscation du flot de donn´ees
4 Obfuscation Python
3. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Pr´elude
1 def checkauth(password):
2 if (password == chunkybacon ):
3 print(Here ’s some super private information ...)
4 else:
5 print(Wrong password , go away!)
4. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
L’obfuscation, ou obscurcissement de code
D´efinition
L’obfuscation consiste `a rendre l’analyse de code la plus complexe et la
plus coˆuteuse possible, tout en conservant le comportement original (la
s´emantique observable) du programme.
5. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
L’obfuscation, ou obscurcissement de code
D´efinition
L’obfuscation consiste `a rendre l’analyse de code la plus complexe et la
plus coˆuteuse possible, tout en conservant le comportement original (la
s´emantique observable) du programme.
6. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
L’obfuscation, ou obscurcissement de code
D´efinition
L’obfuscation consiste `a rendre l’analyse de code la plus complexe et la
plus coˆuteuse possible, tout en conservant le comportement original (la
s´emantique observable) du programme.
7. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
D´efinition plus formelle
On peut d´efinir obfuscateur id´eal O ainsi (pour tout programme P) :
1. Fonctionnalit´e : P et sa version obfusqu´ee O(P) doivent avoir le
mˆeme comportement au niveau des entr´ees / sorties.
2. Efficacit´e : le temps d’ex´ecution et la taille de O(P) ne doivent pas
ˆetre 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 entr´ees et sorties.
8. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
D´efinition plus formelle
On peut d´efinir obfuscateur id´eal O ainsi (pour tout programme P) :
1. Fonctionnalit´e : P et sa version obfusqu´ee O(P) doivent avoir le
mˆeme comportement au niveau des entr´ees / sorties.
2. Efficacit´e : le temps d’ex´ecution et la taille de O(P) ne doivent pas
ˆetre 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 entr´ees et sorties.
→ Un tel obfuscateur n’existe pas pour tous les programmes ! a
aOn the (Im)possibility of Obfuscating Programs, Barack et al.
9. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Pourquoi, o`u et comment obfusquer ?
Motivations
protection du code sensible : dissimuler des cl´es embarqu´ees dans le
code par exemple
protection d’algorithme : question de propri´et´e intellectuelle
Diff´erents niveaux
Probl`emes pos´es
10. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Pourquoi, o`u et comment obfusquer ?
Motivations
Diff´erents niveaux
code source
langage interm´ediaire (IR)
code assembleur
Probl`emes pos´es
11. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Pourquoi, o`u et comment obfusquer ?
Motivations
Diff´erents niveaux
Probl`emes pos´es
→ on veut obfusquer de fa¸con automatique
→ il faut trouver un compromis performances / obfuscation
12. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Plusieurs types d’obfuscation
obfuscation du flot de contrˆole (control flow)
obfuscation du flot de donn´ees (data flow)
r´e´ecriture des symboles : nom de variable, de fonction...
chiffrement du code, packing...
13. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Qu’est-ce que l’obfuscation ?
Plusieurs types d’obfuscation
obfuscation du flot de contrˆole (control flow)
obfuscation du flot de donn´ees (data flow)
r´e´ecriture des symboles : nom de variable, de fonction...
chiffrement du code, packing...
14. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Plan
1 Introduction
2 Obfuscation du flot de contrˆole
D´efinitions
Obfuscation du control flow
Applatissement de code
3 Obuscation du flot de donn´ees
4 Obfuscation Python
15. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
D´efinitions
Le flot de contrˆole (control flow)
repr´esente le flot d’ex´ecution d’un programme : les diff´erents
chemins possibles lors de l’ex´ecution
on retrouve les boucles (for, while), les conditions (if), les
appels `a d’autres fonctions...
on le mod´elise grˆace `a un Control Flow Graph (CFG), qui repr´esente
les basic blocks et les liaisons entre eux
16. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
D´efinitions
Le flot de contrˆole (control flow)
x = 10
y = 0
while(x ≥ 0)
y = y + 2
x = x − 1
return y
true false
Figure : CFG de pseudo-code source
Figure : CFG de code assembleur
17. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche `a transformer le CFG :
18. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche `a transformer le CFG :
d´eroulage des boucles for
19. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche `a transformer le CFG :
d´eroulage des boucles for
inlining de fonctions
20. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche `a transformer le CFG :
d´eroulage des boucles for
inlining de fonctions
insertion de junk code
21. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche `a transformer le CFG :
d´eroulage des boucles for
inlining de fonctions
insertion de junk code
pr´edicats opaques
22. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation du control flow
Diverses techniques
On cherche `a transformer le CFG :
d´eroulage des boucles for
inlining de fonctions
insertion de junk code
pr´edicats opaques
applatissement de flot de contrˆole (ou control flow flattening)
23. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Applatissement de code
D´efinition
Applatissement de flot de contrˆole
transformer la structure du programme pour rendre la reconstruction
du CFG plus difficile
coder les informations du flot de contrˆole et cacher le r´esultat dans
le flot de donn´ees
24. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Applatissement de code
Principe
Impl´ementation
les basic blocks sont num´erot´es
un dispatcher g`ere l’ex´ecution
une variable d´etermine quel
bloc doit ˆetre ex´ecut´e apr`es le
bloc courant
`a chaque fin de bloc, cette
variable est remise `a jour, et on
va vers le dispatcher qui
redirige vers le bloc suivant.
INIT
val = 1
DISPATCHER
switch(val)
block 1
some code
val = 2
block 2
some code
val = 3
block 3
some code
return
Figure : Principe de l’applatissement de
code
25. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Applatissement de code
Exemple
Figure : CFG original
Figure : CFG apr`es applatissement du
flot de contrˆole
26. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Plan
1 Introduction
2 Obfuscation du flot de contrˆole
3 Obuscation du flot de donn´ees
D´efinition
Quelques techniques d’obfuscation du flot de donn´ees
La Whitebox
4 Obfuscation Python
27. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
D´efinition
Analyse du flot de donn´ees
Plusieurs axes
informations fournies par les donn´ees du programme : chaˆınes de
caract`eres, entiers...
relations entre les donn´ees ou entre les entr´ees et sorties (du
programme, d’une fonction, d’un basic block)
interactions entre le programme et les donn´ees : lectures, ´ecritures,
emplacement des donn´ees dans la m´emoire...
notions plus formelles : variables vivantes (live), ´equations de flot
de donn´ees, analyse avant et arri`ere...
28. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques techniques d’obfuscation du flot de donn´ees
Exemples
Pour complexifier l’analyse des donn´ees :
29. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques techniques d’obfuscation du flot de donn´ees
Exemples
Pour complexifier l’analyse des donn´ees :
encoder les constantes (chaˆınes de caract`eres par exemple)
30. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques techniques d’obfuscation du flot de donn´ees
Exemples
Pour complexifier l’analyse des donn´ees :
encoder les constantes (chaˆınes de caract`eres par exemple)
insertion de donn´ees inutiles (proche du junk code)
31. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques techniques d’obfuscation du flot de donn´ees
Exemples
Pour complexifier l’analyse des donn´ees :
encoder les constantes (chaˆınes de caract`eres par exemple)
insertion de donn´ees inutiles (proche du junk code)
complexification des op´erations arithm´etiques sur les donn´ees
x + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
32. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques techniques d’obfuscation du flot de donn´ees
Exemples
Pour complexifier l’analyse des donn´ees :
encoder les constantes (chaˆınes de caract`eres par exemple)
insertion de donn´ees inutiles (proche du junk code)
complexification des op´erations arithm´etiques sur les donn´ees
x + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
modifier la fa¸con dont sont stock´ees / manipul´ees les donn´ees :
´eclater les tableaux, changer la convention d’appel des fonctions...
33. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques techniques d’obfuscation du flot de donn´ees
Exemples
Pour complexifier l’analyse des donn´ees :
encoder les constantes (chaˆınes de caract`eres par exemple)
insertion de donn´ees inutiles (proche du junk code)
complexification des op´erations arithm´etiques sur les donn´ees
x + y ⇔ (x ⊕ y) + 2 ∗ (x ∧ y)
modifier la fa¸con dont sont stock´ees / manipul´ees les donn´ees :
´eclater les tableaux, changer la convention d’appel des fonctions...
encoder les donn´ees lors des lectures et ´ecritures
f (x)
MEMORYx xf f −1
34. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
La Whitebox
D´efinition d’une Whitebox
Algorithme cryptographique
prend en entr´ee un message et une cl´e
fournit un message chiffr´e en sortie
Whitebox
Whitebox attack context (WBAC)
35. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
La Whitebox
D´efinition d’une Whitebox
Algorithme cryptographique
Whitebox
impl´ementation particuli`ere d’un algorithme cryptographique
la cl´e est incorpor´ee dans l’algorithme
Whitebox attack context (WBAC)
36. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
La Whitebox
D´efinition d’une Whitebox
Algorithme cryptographique
Whitebox
Whitebox attack context (WBAC)
l’attaquant a tous les privil`eges, il a acc`es `a l’impl´ementation de
l’algorithme
il peut observer l’ex´ecution du programme (avec des cl´es instanci´ees)
les d´etails internes de l’algorithme sont visibles et modifiables
37. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
La Whitebox
D´efinition d’une whitebox
White-box AES
´etapes de l’AES = SubBytes, ShiftRows, MixColumns et
AddRoundKey
on d´ecrit les ´etapes de l’AES avec des tables (lookup-tables)
on applique des encodages pour masquer les entr´ees et les sorties
38. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
La Whitebox
D´efinition d’une whitebox
White-box AES
´etapes de l’AES = SubBytes, ShiftRows, MixColumns et
AddRoundKey
on d´ecrit les ´etapes de l’AES avec des tables (lookup-tables)
on applique des encodages pour masquer les entr´ees et les sorties
S(x ⊕ kr−1
i,j )F−1
G G−1 MC(x) H
Figure : Principe d’encodage des lookup-tables
39. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
La Whitebox
D´efinition d’une whitebox
White-box AES
´etapes de l’AES = SubBytes, ShiftRows, MixColumns et
AddRoundKey
on d´ecrit les ´etapes de l’AES avec des tables (lookup-tables)
on applique des encodages pour masquer les entr´ees et les sorties
F−1
◦ S(x ⊕ kr−1
i,j ) ◦ G G−1
◦ MC(x) ◦ H
Figure : Principe d’encodage des lookup-table
40. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Plan
1 Introduction
2 Obfuscation du flot de contrˆole
3 Obuscation du flot de donn´ees
4 Obfuscation Python
Pourquoi obfusquer du code Python ?
Comment obfusquer du code Python ?
Obfuscation source `a source
Quelques codes d’exemples
41. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Pourquoi obfusquer du code Python ?
Contexte
applications d´evelopp´ees en Python (DropBox par exemple) : un
interpr´eteur modifi´e est livr´e avec l’application
cr´eations de packeurs pour complexifier l’acc`es de l’utilisateur au
code source
trois axes d’obfuscation :
- l’interpr´eteur modifi´e pour rendre difficile l’analyse des fichiers
compil´es
- diff´erentes mesures pour rendre la d´ecompilation plus difficile
- l’obfuscation source `a source dans le cas o`u le code est retrouv´e
42. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Comment obfusquer du code Python ?
Obfuscations propres `a Python
Modification de l’interpr´eteur
compilation statique du programme et des modules n´ecessaires
permutation des opcodes du code compil´e
Pr´evention de la d´ecompilation
43. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Comment obfusquer du code Python ?
Obfuscations propres `a Python
Modification de l’interpr´eteur
Pr´evention de la d´ecompilation
insertion d’opcodes inutiles
transformation des op´erateurs lors de l’ex´ecution
44. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation source `a source
L’arbre syntaxique abstrait
Arbre syntaxique abstrait (ou Abstract
Syntax Tree) : repr´esentation abstraite d’un
programme par un arbre.
les nœuds repr´esentent les op´erateurs
les feuilles repr´esentent les op´erandes
×
+
x y
z
Figure : Repr´esentation de
l’AST de (x + y) × z
45. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation source `a source
Le module ast
def func(x):
a = 0;
for i in range (0 ,10):
a = a + x
return 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 (simplifi´e) obtenu avec le module
ast
46. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees 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
47. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Obfuscation source `a source
Le source `a source en Python
Principe
Exemples d’obfuscation
transformation du flot de contrˆole : boucles for en boucles
while, instructions if en boucles while, modification de la cr´eation
de certains objets comme les list comprehension
transformation du flot de donn´ees : encodage des chaˆınes de
caract`eres, insertion d’expressions bool´eennes-arithm´etiques
transformation des symboles : remplacement des noms de
fonctions et variables par des chaˆınes de caract`eres al´eatoires
transformation fa¸con programmation fonctionnelle : les
fonctions sont remplac´ees par des fonctions lambda
48. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques codes d’exemples
Obfuscation de flot de contrˆole
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
49. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques codes d’exemples
Obfuscation de flot de contrˆole
1 res = [i[0] for i in
2 [j for j in
3 [[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 uskewh
11
12 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 pass
21 return ueovat
22 res = rphfuq ()
Figure : Exemple d’obfuscation de d´eclaration de list comprehension
50. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Quelques codes d’exemples
Obfuscation fa¸con programmation fonctionnelle
def ack1(M, N):
if M == 0:
return N + 1
elif 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
51. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Conclusion
L’obfuscation
utilis´ee pour rendre l’analyse de code plus difficile
obfuscation de flot de contrˆole, de flot de donn´ees
obfuscation Python : mise en pratique des techniques
Travaux futurs
g´en´erateur d’expressions bool´eennes-arithmetiques
mise au point d’un module d’obfuscation
nouvelles techniques d’obfuscation Python ?
53. Introduction Obfuscation du flot de contrˆole Obuscation du flot de donn´ees Obfuscation Python
Table des mati`eres
1 Introduction
Qu’est-ce que l’obfuscation ?
2 Obfuscation du flot de contrˆole
D´efinitions
Obfuscation du control flow
Applatissement de code
3 Obuscation du flot de donn´ees
D´efinition
Quelques techniques d’obfuscation du flot de donn´ees
La Whitebox
4 Obfuscation Python
Pourquoi obfusquer du code Python ?
Comment obfusquer du code Python ?
Obfuscation source `a source
Quelques codes d’exemples