0x200
Programmation
Le terme hacker désigne à la fois celui qui écrit du code et celui qui lexploite.
Même si ces deux groupes de hackers ont des objectifs différents, ils emploient
des techniques similaires pour résoudre les problèmes. Puisque comprendre la
programmation aide ceux qui exploitent et que comprendre les exploits aide ceux
qui programment, de nombreux hackers mènent ces deux activités. Il existe des
astuces intéressantes dans les techniques employées pour écrire du code élégant et
dans celles servant à exploiter des programmes. Le hacking consiste simplement à
trouver une solution astucieuse et non intuitive à un problème.
Les hacks rencontrés dans les exploits se servent généralement des règles de lordina-
teur pour contourner la sécurité en empruntant des chemins non balisés. Les hacks
en programmation sont similaires en cela quils emploient également les règles de
lordinateur de manière novatrice et inventive, mais lobjectif nal recherché est
lefcacité ou un code source plus petit, pas nécessairement une atteinte à la sécu-
rité. Il est possible décrire une innité de programmes pour accomplir une tâche
donnée, mais la plupart de ces solutions seront inutilement longues, complexes et
mal faites. Les quelques solutions restantes seront petites, efcaces et propres. Les
programmes qui présentent ces qualités sont qualiés délégants, tandis que lessolu-
tions astucieuses et novatrices qui conduisent à cette efcacité sont appelées hacks.
Les hackers apprécient la beauté du code élégant et lingéniosité des hacks.
Dans le monde professionnel, il est plus important de produire du code opérationnel
en série que de rechercher des hacks et lélégance. Avec laugmentation de la puis-
sance des ordinateurs et de la quantité de mémoire disponible, passer cinq heures
supplémentaires à créer un bout de code lérement plus rapide et plus économeen
mémoire na pas vraiment de sens dans lindustrie. Alors que les optimisations
entemps et en mémoire ne sont remarquées que par les utilisateurs les plus sophis-
tiqués, une nouvelle fonctionnalité présente une valeur commerciale. Lorsque
lobjectif est largent, passer du temps sur des hacks, uniquement pour une question
doptimisation, na aucun sens.
La véritable appréciation de légance dun programme est laissée aux hackers:
des mordus de linformatique dont lobjectif est non pas de gagner de largent mais
de tirer le meilleur de chaque bit de leur vieux Commodore 64, des auteurs dex-
ploits qui doivent écrire des morceaux de code minuscules et stupéants pour se
2536_Hacking.indb 7 07/06/12 18:41
© 2012 Pearson France – Techniques de hacking, 2e éd. – Jon Erickson
8Techniques de hacking
glisser dans les étroites failles de sécurité, et quiconque apprécie lidée et le dé de
trouver la meilleure solution possible. Ces personnes sont fortement attirées par la
programmation et apprécient pleinement la beauté dun morceau de code élégant ou
lingéniosité dun hack. Puisque comprendre la programmation est indispensable à
la compréhension de lexploitation des programmes, cest par elle que nous allons
commencer.
0x210 Qu’est-ce que programmer?
Programmer est un concept très naturel et intuitif. Un programme nest rien dautre
quune suite d’instructions écrites dans un langage précis. Les programmes sont
partout et même les technophobes en utilisent tous les jours. Indiquer une direc-
tion, cuisiner une recette, jouer au football et lADN constituent des formes de
programmes. Voici un exemple de programme pour indiquer une direction:
Sur Main Street, allez vers l’est. Continuez sur Main Street jusqu’à voir
une église sur votre droite. Si la rue est bloquée par des travaux, tournez
à droite sur la 15e rue, à gauche sur Pine Street et à droite sur la 16e rue.
Sinon, vous pouvez simplement avancer et tourner à droite sur la 16e rue.
Descendez la 16e rue et tournez à gauche sur Destination Road. Continuez
votre route pendant 5 kilomètres. Vous verrez alors la maison sur la droite.
L’adresse est 743 Destination Road.
Toutes les personnes qui connaissent le français peuvent comprendre et suivre ces
indications, puisquelles sont écrites en français. Nous sommes daccord, elles ne
sont pas éloquentes, mais chaque instruction est claire et facile à comprendre, tout
au moins pour ceux qui lisent le français.
Cependant, la langue maternelle dun ordinateur nest pas le français; il comprend
uniquement le langage machine. Pour expliquer à un ordinateur comment effectuer
une opération, les instructions doivent lui être données dans sa propre langue. Cepen-
dant, un langage machine est mystérieux et il est difcile de travailler avec–il est
constitué de bits et doctets et diffère dune architecture à lautre. Pour écrire un
programme en langage machine pour un processeur Intel x86, vous devez déterminer
la valeur associée à chaque instruction, leffet de chaque instruction et une myriade
de détails de bas niveau. Ce type de programmation demande beaucoup de soin et
reste lourde. Elle nest en aucun cas intuitive.
Pour contourner la complexité du langage machine, nous avons besoin d’un traduc-
teur. Un assembleur est une forme de traducteur de langage machine–il sagit dun
programme qui convertit le langage assembleur en code lisible par la machine. Le
langage assembleur est moins énigmatique que le langage machine, car il utilise des
noms pour les différentes instructions et variables, à la place des valeurs. Cependant,
il est encore loin d’être intuitif. Les noms des instructions sont très ésotériques et
le langage est propre à chaque architecture. Tout comme un langage machine pour
les processeurs Intel x86 est différent dun langage machine pour les processeurs
Sparc, un langage assembleur x86 diffère de son homologue pour Sparc. Chaque
2536_Hacking.indb 8 07/06/12 18:41
© 2012 Pearson France – Techniques de hacking, 2e éd. – Jon Erickson
Programmation 9
0x200
programme écrit en utilisant un langage assembleur pour une architecture de proces-
seur ne fonctionnera pas sur une autre architecture. Si un programme est écrit en
langage assembleur x86, il doit être récrit pour pouvoir sexécuter sur une architec-
ture Sparc. Par ailleurs, si vous voulez écrire un programme efcace en langage
assembleur, vous devez connaître de nombreux détails de bas niveau sur larchitec-
ture du processeur cible.
Tous ces problèmes peuvent être allégés par une autre forme de traducteurs appelés
compilateurs. Un compilateur convertit un langage de haut niveau en langage machine.
Les langages de haut niveau sont beaucoup plus intuitifs que leslangagesmachine
et peuvent être traduits en différents langages machine pour différentes architec-
tures de processeurs. Autrement dit, si un programme est écrit dans un langage
de haut niveau, il ne doit lêtre quune seule fois; le même morceau de code peut
être compilé dans le langage machine propre à différentes architectures. C, C++ et
Fortran sont des exemples de langages de haut niveau. Un programme écrit dans un
tel langage est beaucoup plus facile à lire (en anglais) quun langage assembleur ou
un langagemachine, mais les instructions doivent suivre des règles très strictes pour
que le compilateur les comprenne.
0x220 Pseudo-code
Les programmeurs disposent dune autre forme de langage de programmation,
appelée pseudo-code. Un pseudo-code nest rien dautre que du français intégré
à une structure semblable à un langage de haut niveau. Il nest pas compris par
les compilateurs, les assembleurs ou les ordinateurs, mais il permet au program-
meur dorganiser ses instructions. Le pseudo-code nest pas déni avec précision.
En réalité, la plupart des gens lécrivent de manière légèrement différente. Il sagit
dune forme de chaînon manquant entre le français et les langages de programmation
de haut niveau, comme C. Le pseudo-code est parfaitement adapté à la présentation
des concepts de programmation universels.
0x230 Structures de contrôle
Sans les structures de contrôle, un programme ne serait quune suite dinstructions
exécutées séquentiellement. Si cela peut convenir pour des programmes très simples,
la plupart dentre eux, comme lexemple d’indications dune direction, ne sont pas
aussi simples. Dans notre exemple, nous avons utilisé des instructions comme Conti-
nuez sur Main Street jusquà voir une église sur votre droite et Si la rue est bloquée
par des travaux... Ces instructions sont des structures de contrôle qui peuvent modi-
er le ux dexécution du programme. Elle nest plus forcément séquentielle mais
peut suivre un chemin plus complexe et plus utile.
2536_Hacking.indb 9 07/06/12 18:41
© 2012 Pearson France – Techniques de hacking, 2e éd. – Jon Erickson
10 Techniques de hacking
0x231 If-Then-Else
Dans notre exemple dindications de direction, Main Street peut être en travaux.
Une suite d’instructions particulres prend en charge ce cas. Sinon les instructions
normales doivent être suivies. Ces cas particuliers sont traités dans un programme
avec lune des structures de contrôle les plus naturelles, la structure if-then-else
(si-alors-sinon). Elle prend la forme générale suivante:
If (condition) then
{
Instructions à exécuter lorsque la condition est satisfaite;
}
Else
{
Instructions à exécuter lorsque la condition n’est pas satisfaite;
}
Dans cet ouvrage, nous utiliserons un pseudo-code de type C. Chaque instruction
se termine donc par un point-virgule et les blocs dinstructions sont placés entre des
accolades et indentés. Voici un pseudo-code avec la structure if-then-else pour les
indications de direction précédentes:
Continuez sur Main Street;
If (la rue est bloquée)
{
Tournez à droite sur la 15e rue;
Tournez à gauche sur Pine Street;
Tournez à droite sur la 16e rue;
}
Else
{
Tournez à droite sur la 16e rue;
}
Chaque instruction se trouve sur sa propre ligne et les différents blocs dinstruc-
tions conditionnelles sont placés entre des accolades et indentés an d’en faciliter
la lecture. Dans le langage de programmation C, ainsi que d’autres, le mot clé
then
est implicite et donc omis, ce que nous avons fait dans le pseudo-code précédent.
La syntaxe dautres langages de programmation impose la présence du mot c
then
, par exemple BASIC, Fortran ou Pascal. Ces différences syntaxiques dans les
langages de programmation ne sont que supercielles; la structure sous-jacente
reste identique. Lorsquun programmeur comprend les concepts convoyés par ces
langages, lapprentissage des variantes syntaxiques pose peu de difcultés. Puisque
C sera utilisé dans les sections ultérieures, le pseudo-code donné dans cet ouvrage
respectera une syntaxe de type C. Cependant, noubliez pas que le pseudo-code peut
prendre de nombreuses formes.
En C, lorsquun bloc dinstructions entourées d’accolades nest constitué que dune
seule instruction, ces accolades sont facultatives. Pour des raisons de facilité de
2536_Hacking.indb 10 07/06/12 18:41
© 2012 Pearson France – Techniques de hacking, 2e éd. – Jon Erickson
Programmation 11
0x200
lecture, il reste préférable dindenter cette instruction, même si la syntaxe ne lexige
pas. Les indications de direction précédentes peuvent donc être récrites de la manière
suivante:
Continuez sur Main Street;
If (la rue est bloquée)
{
Tournez à droite sur la 15e rue;
Tournez à gauche sur Pine Street;
Tournez à droite sur la 16e rue;
}
Else
Tournez à droite sur la 16e rue;
Cette règle concernant les blocs dinstructions est valide pour toutes les structures
de contrôle mentionnées dans cet ouvrage. La règle elle-même peut être décrite par
du pseudo-code:
If (le bloc d’instructions n’en contient qu’une seule)
Les accolades pour regrouper les instructions sont facultatives;
Else
{
Les accolades sont obligatoires;
Puisqu’un regroupement logique de ces instructions est nécessaire;
}
La description dune syntaxe peut être elle-même vue comme un programme simple.
Il existe plusieurs variantes de la structure if-then-else, comme les instructions
select
/
case
, mais la logique de base ne change pas: si (if) cela se produit, effec-
tuer ces opérations, sinon (else) effectuer ces autres opérations (qui peuvent inclure
dautres structures if-then-else).
0x232 Boucles while/until
Le concept de programmation élémentaire suivant est la structure de contrôle while,
qui représente un type de boucle. Très souvent, le programmeur souhaite exécuter
plusieurs fois les mêmes instructions. Pour cela, il utilise une boucle, mais il doit
donner lesconditions darrêt de la boucle, an quelle ne se poursuive pas indéni-
ment. Une boucle while précise que les instructions données doivent être exécutées
dans une boucle tant que (while) la condition reste vraie. Voici un programme simple
pour une souris affamée:
While (tu as faim)
{
Cherche de la nourriture;
Mange la nourriture;
}
Les deux lignes qui suivent linstruction
while
sont répétées tant que la souris est
affamée. La nourriture trouvée par la souris à chaque tour de boucle peut aller de
2536_Hacking.indb 11 07/06/12 18:41
© 2012 Pearson France – Techniques de hacking, 2e éd. – Jon Erickson
1 / 14 100%