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 :
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.
À retenir
- EAX porte la valeur de retour d'une fonction (convention cdecl et suivantes), et le numéro de syscall avant
int 0x80. - Les fonctions doivent préserver EBX, ESI, EDI, EBP (sauvegardés par l'appelé). EAX, ECX, EDX peuvent être écrasés (sauvegardés par l'appelant).
- ESP et EBP structurent la pile, voir l'animation de la pile.
- EIP ne se modifie jamais avec un
mov: seulement parjmp,call,ret, les sauts conditionnels et les interruptions. Un exploit vise donc à corrompre ce que ces instructions vont lire. - Dans gdb :
info registers, oup $eax,x/4wx $esp.