{{tag>cours informatique dev sécurité}} ====== RIP : Rétro-Ingénierie de Programmes ====== Notes prises lors de la participation au MOOC [[https://www.fun-mooc.fr/fr/cours/rip-retro-ingenierie-de-programmes/|RIP : Rétro-Ingénierie de Programmes]] proposé par L'Université de Lille sur la plateforme [[https://www.fun-mooc.fr/fr/|FUN Mooc]]. ====== Module 1 : Rappels de compilation ===== ===== Génération d'un exécutable ===== La compilation produit un code binaire exécutable par la machine à partir du code source écrit par le développeur. Compilation = Code Source → Programme (binaire) Sur une distribution GNU/Linux de type Debian, pour pouvoir compiler en C, il faut installer le paquet ''build-essential'' : apt install -y build-essential Crééer le fichier source C ''hello.c'' : mkdir -p ~/dev/hello vim ~/dev/hello/hello.c Ci-dessous le contenu du fichier : #include int main(void){ printf("Hello World!!!\n"); return 0; } Pour compiler le code source : cd ~/dev/hello gcc -o hello hello.c Le dossier contient un nouveau fichier exécutable nommé hello : tree hello/ hello/ |-- hello `-- hello.c Pour éxécuter le programme : ./hello Hello World!!! ===== Qu'est ce qu'un programme compilé ? ===== Le fichier produit contient environ 16000 caractères : ls -lh hello -rwxrwxr-x 1 yoann yoann 16K Jan 25 14:16 hello Si on essaie d'afficher le contenu du fichier ''hello'' avec la commande **cat**, on s’aperçoit que la plupart des caractères ne sont pas imprimables : ce n'est donc pas un fichier au format texte. {{afficher-binaire-via-cat.png}} Pour observer le contenu du fichier, on va utiliser le programme **xxd** : # Installer xxd apt install -y xxd xxd hello On peut filtrer les caractères imprimables contenus dans le binaire via la commande strings : strings hello Si on observer le contenu du fichier hello via **objdump** : objdump -d -M Intel hello # Equivalent objdump --disassemble --disassembler-options=Intel hello objdump -s -M Intel hello # Equivalent objdump --full-contents --disassembler-options=Intel hello ===== Structure globale du format ELF ===== **ELF** signifie **E**xecutable and **L**inkable **F**ormat [[cours:informatique:dev:retro-ingenierie-de-programme:000_start|⌂ Retour au sommaire]] | [[cours:informatique:dev:retro-ingenierie-de-programme:120-format-elf|Suivant ▷]]