{{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 ▷]]