0x200
Programmation
Le terme hacker désigne à la fois celui qui écrit du code et celui qui l’exploite.
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 l’ordina-
teur pour contourner la sécurité en empruntant des chemins non balisés. Les hacks
en programmation sont similaires en cela qu’ils emploient également les règles de
l’ordinateur de manière novatrice et inventive, mais l’objectif nal recherché est
l’ef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 l’ingé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 l’augmentation 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égèrement plus rapide et plus économeen
mémoire n’a pas vraiment de sens dans l’industrie. 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
l’objectif est l’argent, passer du temps sur des hacks, uniquement pour une question
d’optimisation, n’a aucun sens.
La véritable appréciation de l’élégance d’un programme est laissée aux hackers:
des mordus de l’informatique dont l’objectif est non pas de gagner de l’argent mais
de tirer le meilleur de chaque bit de leur vieux Commodore 64, des auteurs d’ex-
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 l’idé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é d’un morceau de code élégant ou
l’ingéniosité d’un hack. Puisque comprendre la programmation est indispensable à
la compréhension de l’exploitation des programmes, c’est par elle que nous allons
commencer.
0x210 Qu’est-ce que programmer?
Programmer est un concept très naturel et intuitif. Un programme n’est rien d’autre
qu’une 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 l’ADN 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, puisqu’elles sont écrites en français. Nous sommes d’accord, 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 d’un ordinateur n’est 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 d’octets et diffère d’une architecture à l’autre. Pour écrire un
programme en langage machine pour un processeur Intel x86, vous devez déterminer
la valeur associée à chaque instruction, l’effet de chaque instruction et une myriade
de détails de bas niveau. Ce type de programmation demande beaucoup de soin et
reste lourde. Elle n’est 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 s’agit d’un
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 d’un 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 s’exé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 l’architec-
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 qu’une 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) qu’un 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 d’une autre forme de langage de programmation,
appelée pseudo-code. Un pseudo-code n’est rien d’autre que du français intégré
à une structure semblable à un langage de haut niveau. Il n’est pas compris par
les compilateurs, les assembleurs ou les ordinateurs, mais il permet au program-
meur d’organiser ses instructions. Le pseudo-code n’est pas déni avec précision.
En réalité, la plupart des gens l’écrivent de manière légèrement différente. Il s’agit
d’une 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 qu’une suite d’instructions
exécutées séquentiellement. Si cela peut convenir pour des programmes très simples,
la plupart d’entre eux, comme l’exemple d’indications d’une 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 d’exécution du programme. Elle n’est 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 d’indications de direction, Main Street peut être en travaux.
Une suite d’instructions particulières prend en charge ce cas. Sinon les instructions
normales doivent être suivies. Ces cas particuliers sont traités dans un programme
avec l’une 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 d’instructions 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 d’instruc-
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 d’autres langages de programmation impose la présence du mot clé
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. Lorsqu’un programmeur comprend les concepts convoyés par ces
langages, l’apprentissage 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, n’oubliez pas que le pseudo-code peut
prendre de nombreuses formes.
En C, lorsqu’un bloc d’instructions entourées d’accolades n’est constitué que d’une
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 d’indenter cette instruction, même si la syntaxe ne l’exige
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 d’instructions 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 d’une 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
d’autres 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 d’arrêt de la boucle, an qu’elle 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 l’instruction
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%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!