recherche de vulnérabilités / 2. les registres

Les registres x86 (32 bits)

Les registres sont les quelques cases mémoire internes au CPU. Toute instruction lit ou écrit au moins l'un d'eux. Clique sur un registre pour voir son rôle.

Dans le cours, EBX était présenté comme la « valeur source ». En réalité le registre source est ESI (Source Index), avec EDI en destination. EBX est un registre général dit « base », que les fonctions doivent préserver.

Un registre, plusieurs tailles

Pour des raisons historiques (le 8086 était en 16 bits), on peut adresser une partie d'EAX. Avec EAX = 0x12345678 :

Découpage d'EAX EAX fait 32 bits, AX en est la moitié basse, AH et AL les deux octets de AX. bit 31bit 0 EAX 12 34 56 78 AX 56 78 AH 56 AL 78 16 bits hauts : pas de nom Pareil pour EBX (BX, BH, BL), ECX et EDX. ESI, EDI, ESP, EBP n'ont qu'une version 16 bits (SI, DI, SP, BP).

En exploitation, ça sert à éviter les octets nuls dans un shellcode : mov al, 0x0b s'encode B0 0B, alors que mov eax, 0x0b donne B8 0B 00 00 00.

Les registres en action

Une petite fonction qui calcule 3 + 2 + 1 avec une boucle. Suis ECX (le compteur), EAX (le résultat) et le drapeau ZF, qui décide du saut.

Exécution d'une boucle Code assembleur à gauche avec l'instruction courante surlignée, valeurs des registres à droite.

À retenir

← 1. Le CPU3. Les opcodes →