web-dev-qa-db-fra.com

Que signifie EIP?

Il y a une tonne de questions ici qui font référence au eip:

Qu'est-ce que l'EIP? Comment est-il utilisé, à la fois comme cible d'exploit et en code bénin?

17
Ares

EIP est un registre dans les architectures x86 (32 bits). Il contient le "pointeur d'instruction étendue" pour la pile. En d'autres termes, il indique à l'ordinateur où aller ensuite pour exécuter la commande suivante et contrôle le flux d'un programme.

Recherchez le langage d'assemblage pour mieux comprendre le fonctionnement des registres. Skull Security a une bonne introduction.

18
HashHazard

Un des éléments de base dont un ordinateur a besoin pour garder une trace est l'endroit où se trouvent en mémoire les instructions en cours d'exécution.

Ceci est normalement fait par le CPU en utilisant ce qui est souvent connu sous le nom de pointeur d'instruction ou compteur de programmeregistre . Le nom exact dépend de l'architecture, mais le concept se généralise dans toutes les architectures. Cela s'appelle le pointeur d'instructions sur les processeurs Intel, et c'est le terme que j'utiliserai dans cette réponse. Le pointeur d'instructions est incrémenté en continu pendant l'exécution des instructions à partir de la mémoire, et également mis à jour chaque fois qu'une instruction de saut quelconque est exécutée. Les architectures de CPU modernes avec plusieurs pipelines d'exécution parallèle et plusieurs cœurs rendent ce qui se passe réellement à l'intérieur du CPU plus complexe, mais pour un observateur externe, l'explication simple suffit pour comprendre ce qui se passe et le but des registres pertinents.

En raison des anciens processeurs 16 bits Intel 8086/8088, 80186 et 80286, le pointeur d'instruction était normalement exprimé sous la forme d'une paire de valeurs 16 bits connues sous le nom de segment de code (code sélecteur dans le 80286, mais sauf en mode protégé, les sélecteurs fonctionnent de manière très similaire aux segments) et le pointeur d'instruction. Dans le langage assembleur, CS:IP où les deux points indiquent l'appariement d'un segment et un décalage en tant que paire pour former une adresse mémoire. CS et IP sont ici registres CP, de minuscules emplacements de mémoire dans la puce CPU elle-même, dans ce cas particulier, tous les 16 bits. (Vous aviez aussi des choses comme DS:DX qui était classiquement l'emplacement où lire ou écrire des données en mémoire; DS était segment de données et DX est un registre à usage général qui dans ce cas contenait le décalage du segment de données. Il y avait à l'origine quatre registres destinés à un usage général, appelés respectivement AX, BX, CX et DX, chacun pouvant être traité en termes de moitié haute - AH, par exemple - ou de moitié basse - AL, plus un petit nombre de registres à usage général qui avaient des Les processeurs modernes ont beaucoup, beaucoup plus de registres, avec des dizaines de registres communs et plus d'une centaine pas inconnus.)

Lors de la fabrication du processeur 80386 à la fin des années 1980, Intel a apporté de nombreux changements, notamment en étendant l'espace d'adressage à 32 bits tout en conservant les sélecteurs comme concept. Pour cette raison, les anciennes valeurs de 16 bits n'étaient plus suffisantes et le pointeur d'instruction a été étendu à 32 bits. Afin de maintenir une compatibilité descendante complète (à ce stade, Intel avait probablement appris la leçon du 80286 qui était plus compatible à sens unique; il était facile de passer des 8086/8088 mode réel dans le 80286 mode protégé, mais revenir en arrière était beaucoup plus difficile, et cela s'est avéré être un problème dans la pratique), cela nécessitait un nouveau registre pour que le CPU conserve le pointeur d'instruction lorsqu'il fonctionnait en 32- mode bit.

Dans le 80386, les registres étendus (32 bits) étaient nommés Exx tandis que les registres 16 bits correspondants étaient comme précédemment appelés xx. Ainsi, vous obtiendrez par exemple l'ancien registre d'accumulateur 16 bits AX plus le registre d'accumulateur étendu 32 bits EAX (avec les moitiés 16 bits EAH et EAL). Conformément à cette convention de dénomination, le registre Extended Instruction Pointer était appelé EIP.

En aparté, le plus souvent, la valeur correcte n'est pas simplement EIP, mais CS: EIP, car la valeur d'EIP reste un offset ​​à partir d'un emplacement de départ qui est défini par le sélecteur de code.

13
a CVn

EIP est un registre d'exécution de programme de base.

-En tant que cible d'exploit, je pense pg. 81 du manuel Intel dit tout

Le registre EIP n'est pas accessible directement par logiciel; il est contrôlé implicitement par des instructions de transfert de contrôle (telles que JMP, Jcc, CALL et RET), des interruptions et des exceptions. La seule façon de lire le registre EIP est d'exécuter une instruction CALL puis de lire la valeur du pointeur d'instruction de retour à partir de la pile de procédures. Le registre EIP peut être chargé indirectement en modifiant la valeur d'un pointeur d'instruction de retour sur la pile de procédures et en exécutant une instruction de retour

Comprendre le rôle joué par EIP dans l'exécution du programme semble simple mais complexe quand on considère que la combinaison du registre de segment de code (CS) avec EIP crée cette "adresse logique" et parce que tous les CPU x86 utilisent la prélecture, une instruction lue depuis le bus ne être ce qui est dans le registre EIP. La partie simple est que la valeur dans EIP est utilisée pour déterminer l'emplacement de l'instruction suivante, que cela vous renvoie à une instruction précédente ou en avant en code linéaire. Les résultats de vos instructions précédentes sont stockés dans EAX.

-et en code bénin?

Eh bien, à chaque fois que votre code exécute un algorithme ou appelle une fonction, vous utiliserez certainement ce registre.

1
Robert Houghton