recherche de vulnérabilités
Recherche de vulnérabilités : les bases bas niveau
Récap du cours en 5 animations, x86 32 bits. Elles se lisent dans l'ordre : du processeur jusqu'à la pile, où naissent les buffer overflows.
1
Le CPU et le cycle d'une instruction
ALU, unité de contrôle, RAM, et le cycle fetch, decode, execute, writeback.
2Les registres x86
EAX, EBX… ESP, EBP, EIP, EFLAGS, et un petit programme pas à pas.
3Les opcodes
Comment mov ebp, esp devient 89 E5, octet par octet.
Le format ELF
Headers, sections, segments, et où chaque morceau atterrit en mémoire.
5La pile pendant un appel
Arguments, adresse de retour, prologue, leave et ret.
1. Le CPU
- L'unité de contrôle (CU) pilote tout, l'ALU calcule (add, sub, and, cmp…), les registres sont la mémoire ultra-rapide interne.
- Code et données sont dans la même RAM, reliée par le bus d'adresse et le bus de données.
- Chaque instruction suit le cycle : lire EIP, fetch (charger les octets), avancer EIP, decode, execute, écrire le résultat.
- Contrôler EIP = contrôler ce que le processeur exécute. C'est l'objectif de la plupart des exploits mémoire.
2. Les registres
| Registre | Rôle usuel |
|---|---|
EAX | accumulateur, valeur de retour d'une fonction, numéro du syscall |
EBX | registre « base », usage général, sauvegardé par l'appelé, 1er argument d'un syscall (int 0x80) |
ECX / EDX | compteur (boucles, rep) / données (partie haute de mul, div) |
ESI / EDI | index source / index destination des copies mémoire |
ESP / EBP | sommet de pile / base de la frame courante |
EIP | adresse de la prochaine instruction (non modifiable directement) |
EFLAGS | drapeaux ZF, SF, CF, OF positionnés par l'ALU, lus par les sauts conditionnels |
3. Les opcodes
- Une instruction assembleur = 1 à 15 octets : préfixes, opcode, octet ModR/M (quels registres, quelle mémoire), déplacement, valeur immédiate.
- À connaître par cœur :
90nop,C3ret,C9leave,55push ebp,CCint3,CD 80int 0x80,E8call,EBjmp court. - x86 est little endian :
0x08049000s'écrit00 90 04 08en mémoire. Indispensable pour écrire une adresse dans un payload. - Un shellcode n'est qu'une suite d'opcodes. Les octets
00le coupent souvent (fin de chaîne pourstrcpy).
4. Le format ELF
- ELF header (magic
7F 45 4C 46, 32/64 bits, endianness, point d'entrée), program headers (segments, pour le chargeur), section headers (sections, pour les outils). .textcode (R-X),.rodataconstantes,.dataglobales initialisées,.bssglobales à zéro (aucune place dans le fichier),.plt/.gotrésolution des fonctions de la libc.- En mémoire : le code aux adresses basses, puis les données, le tas qui grandit vers les adresses hautes, et la pile qui part des adresses hautes et grandit vers les basses.
- Outils :
file,readelf -h / -l / -S,objdump -d,checksec(NX, PIE, RELRO, canary).
5. La pile
- Elle grandit vers les adresses basses,
pushfaitESP -= 4. callempile l'adresse de retour, le prologue empile l'ancien EBP et réserve les locales.- Dans une fonction : retour à
[ebp+4], arguments à[ebp+8]…, locales à[ebp-4]…. retlit l'adresse de retour à ESP. Un buffer local qui déborde l'écrase et détourne EIP.