J'ai essayé de comprendre le code du langage d'assemblage généré par GCC et je rencontre fréquemment cette instruction au début de nombreuses fonctions, y compris _start (), mais je n'ai trouvé aucun guide expliquant son objectif
31-0000000000001040 <_start>:
32: 1040: f3 0f 1e fa endbr64
33- 1044: 31 ed xor ebp,ebp
Il signifie "End Branch 64 bit" - ou plus précisément, Terminate Indirect Branch in 64 bit
Intel a un document sur cette instruction .
Voici l'opération:
IF EndbranchEnabled(CPL) & EFER.LMA = 1 & CS.L = 1
IF CPL = 3
THEN
IA32_U_CET.TRACKER = IDLE
IA32_U_CET.SUPPRESS = 0
ELSE
IA32_S_CET.TRACKER = IDLE
IA32_S_CET.SUPPRESS = 0
FI
FI;
L'instruction est par ailleurs considérée comme un NOP
.
La fonction CET
est utilisée pour s'assurer que vos branches indirectes se rendent réellement à un emplacement valide. Cela permet une sécurité supplémentaire. Voici le paragraphe d'Intel à ce sujet:
ENDBRANCH (voir la section 73 pour plus de détails) est une nouvelle instruction qui est utilisée pour marquer les adresses cibles de saut valides des appels indirects et des sauts dans le programme. Cet opcode d'instruction est sélectionné pour être un NOP sur les machines héritées de sorte que les programmes compilés avec la nouvelle instruction ENDBRANCH continuent de fonctionner sur les anciennes machines sans l'application CET. Sur les processeurs qui prennent en charge CET, ENDBRANCH est toujours un NOP et est principalement utilisé comme instruction de marqueur par le pipeline de processeur pour détecter les violations de flux de contrôle. Le CPU implémente une machine d'état qui suit les instructions jmp et d'appel indirectes. Lorsqu'une de ces instructions s'affiche, la machine d'état passe de l'état IDLE à l'état WAIT_FOR_ENDBRANCH. Dans l'état WAIT_FOR_ENDBRANCH, l'instruction suivante dans le flux de programme doit être un ENDBRANCH. Si un ENDBRANCH n'est pas vu, le processeur provoque une exception de protection de contrôle (#CP), sinon la machine d'état revient à l'état IDLE.