Obscurcissement, injection et shellcode: Le hacking sous l’oeil de l’assembleur x64 – Book Review

This review is in french because the book only exists in french 😎

J’avais vu l’annonce de ce livre Ă  en septembre 2023 via LinkedIn et je l’avais commandĂ© sur Amazon en me disant que je le lirai plus tard. Etant coincĂ© chez moi toute la semaine Ă  cause d’un mal de dos Ă©pouvantable, j’en ai profitĂ© pour dĂ©vorer cet ouvrage en quelques heures.

Cet ouvrage est l’oeuvre de Hugo BITARD, docteur en Physique qui est ensuite tombĂ© dans la cyber sĂ©curitĂ© en 2018, et qui reste trĂšs discret sur les rĂ©seaux sociaux (X, LinkedIn 
). Il a pour but de donner au lecteur des bases et exemples concrets sur diffĂ©rentes mĂ©thodes d’obscurcissement (obfuscation) et d’injection de code, et sur le fonctionnement des shellcodes, tout ça en assembleur 64 bits.

Voici un aperçu de la table des matiÚres :

  1. Introduction
    • 1.1 – Pourquoi coder en assembleur
    • 1.2 – Notions de base
    • 1.3 – Mise en place d’un environnement de test
  2. Premiers pas en assembleur
    • 2.1 – Mon premier programme – Linux
    • 2.2 – Mon premier programme – Windows
    • 2.3 – Hello World – Linux
    • 2.4 – Hello World – Windows
    • 2.5 – Hello World, un dĂ©but d’obscurcissement
    • 2.6 – Reverse Shell TCP – Linux
    • 2.7 – Reverse Shell TCP – Windows
    • 2.8 – Communication inter-processus – Windows
    • 2.9 – Conclusion
    • 2.10 – Annexe
  3. Format de fichier éxecutable
    • 3.1 – Structure d’un PE
    • 3.2 – DĂ©veloppement d’un PE avec NASM – Linux
    • 3.3 – DĂ©veloppement d’une DLL avec MASM – Windows
    • 3.4 – DĂ©veloppement d’un service avec MASM – Windows
    • 3.5 – Conclusion
  4. Obscurcissement
    • 4.1 – Chevauchement de code
    • 4.2 – Une autre façon d’utiliser le mnĂ©monique RET
    • 4.3 – Utilisation du Thread Local Storage (TLS)
    • 4.4 – Utilisation de la gestion des exceptions
    • 4.5 – Appel indirect de fonction
    • 4.6 – Recherche d’adresses de fonctions via leurs nombres ordinaux
    • 4.7 – Trouver les adresses de LoadLibrary() et GetProcAddress()
    • 4.8 – Recherche d’adresses de fonctions via leurs condensats
    • 4.9 – VĂ©rification des indicateurs de NtGlobalFlag
    • 4.10 – Utilisation de la fonction IsDebuggerPresent()
    • 4.11 – Process Masquerading
    • 4.12 – Parent PID Spoofing
    • 4.13 – L’utilisation d’encideur
    • 4.14 – Conclusion
  5. Injection de Code
    • 5.1 – Injection de DLL via la fonction CreateRemoteThread()
    • 5.2 – Injection de DLL via la fonction NtCreateThreadEx()
    • 5.3 – Injection de DLL via la fonction RtlCreateUserThread()
    • 5.4 – Injection de DLL par la mĂ©thode des “direct SYSCALL”
    • 5.5 – Injection de DLL via la fonction QueueUserAPC()
    • 5.6 – Injection de code via la fonction SetThreadContext()
    • 5.7 – Injection de code via la mĂ©thode Process Hollowing
    • 5.8 – Injection de code via la mĂ©thode Early Bird
    • 5.9 – Mise en place de hook via la fonction SetWindowsHookExA()
    • 5.10 – Injection de code Ă  l’aide de hook dans l’IAT
    • 5.11 – Conclusion
  6. Développement et analyse de code auto-suffisant : shellcode
    • 6.1 – Execution de shellcode
    • 6.2 – Reverse Engineering de shellcode
    • 6.3 – MĂ©thode de dĂ©veloppement
    • 6.4 – Conclusion

Dans le premier chapitre, l’auteur nous rappelle les bases de l’assembleur et ses instructions et explique comment mettre en place l’environnement de dĂ©veloppement qui sera utilisĂ© pour mettre en pratique tous les exemples du livre (en gros une VM Windows avec VS Code et MASM). Bien qu’assez dĂ©taillĂ©, le rappel des bases de l’assembleur implique que vous ayez dĂ©jĂ  une idĂ©e de comment ça fonctionne.

Dans le deuxiĂšme chapitre, l’auteur nous lance de le grand bain, on commence les premiers programmes en 100% assembleur, d’abord un simple affichage Ă©cran, jusqu’à un reverse shell TCP. Tout est trĂšs clair.

Dans le troisiĂšme chapitre, on y apprends comment un PE est structurĂ©, encore une fois c’est un rappel et il est quand mĂȘme conseillĂ© d’avoir une vague idĂ©e de la chose avant d’attaquer le livre.

QuatriĂšme chapitre, c’est parti. Outre quelques mĂ©thode d’obscurcissement, on y voit comment appeler des fonctions sans qu’elles apparaissent dans les imports, ainsi que plein d’autres mĂ©thodes pour rendre l’analyse du code plus compliquĂ©e, sachant que ces mĂ©thodes sont retrouvĂ©es dans la grande majoritĂ© des malwares actuels, il est extrĂȘmement important de comprendre comment elles fonctionnes.

CinquiĂšme chapitre, ou comment executer notre code sans se faire dĂ©tecter par les anti-virus (et certains EDR). Pleins de mĂ©thodes sont expliquĂ©es en dĂ©tails, et le code source est fourni. La courbe d’apprentissage est excellente, on commence par des exemples basiques et on progresse vers des mĂ©thodes plus compliquĂ©es et exotiques, nĂ©anmoins efficaces et qu’on retrouvera dans plein de malwares actuels.

SixiĂšme chapitre, pas envie de crĂ©e un PE complet ? Voyons comment crĂ©er un shellcode et l’injecter discrĂštement dans un autre processus pour rester en dessous du radar. Encore une fois la courbe d’apprentissage est excellente, les premiers exemples sont simples, les derniers plus complets, ouvrants la porte Ă  plein de possibilitĂ©s !

J’ai trouvĂ© quelques fautes de frappes au long du livre, mais rien de terrible (et j’ai oubliĂ© de noter oĂč 
).

Pour celles et ceux qui ont la flemme de tout taper, on retrouve les sources du livres sur le GitHub de JarVices.

En conclusion : un excellent ouvrage technique dans la langue de MoliĂšre, BRAVO !

Leave a Comment

Your email address will not be published. Required fields are marked *