plus sérieusement, tu as des données dans ES/DS et ta pile dans SS.
explique moi comment tu peux sortir de SS mais pas de ES/DS par overflow ?
si je ne m'abuse [SS:SP] est incremental et donc le pointeur de retour n'est pas accessible si l'on copie trop de données dans la pile.
Mais c'est pas ça, le principe d'une attaque par buffer overflow! Le principe, c'est justement de profiter de certaines données allouées sur la pile, donc dans le segment pointé par SS, pour écraser l'adresse de retour d'une fonction. La quantité de données qui y est copiée n'influe que sur la taille du buffer overflow nécessaire à l'attaque.
sinon, NX a à voir avec un modele plat de mémoire, ou ( de "ou bien" ) des segments données/code qui se superposent.
une page non executable qui se retrouvent dans CS ne sera pas executé ( fear ). NX palie juste au fait que le modele segmenté n'est plus mis en oeuvre dans les OS pour des soucis de portabilité et de facilité de developpement.
Ah, là, on est d'accord.
pour ce qui est de la pagination, tu proposais l'exception de gestion de faute de page et non de faute de segment ... je te disais juste que tu te trompais d'exception.
(C'est le manuel du programmeur système sur i386).
Tu y verras (page 5-44) que, dans un modèle plat paginé, en cas d'écriture à une adresse non autorisée, c'est bien l'exception 14 qui est levée; et les noyaux d'UNIX récupèrent cette exception pour envoyer un SIGSEGV au processus fautif.
sinon pour obtenir une faute sur un segment ... il te faut des segments ( c'est d'une logique assez vile je l'admet ), que le segment soit un segment de mémoire alloué "physiquement" ( LDT / GDT ) ou "logiquement" ( table d'allocation noyau geré a coup de malloc/free ). dans le cas où l'allocation "logique" n'est pas contrainte par une allocation "physique" je vois mal comment le systeme peut gerer cela ( à moins d'utiliser des appels systemes pour acceder aux zones mémoire qui fait qu'il peut y avoir des controles de dépassement ).
Ah, ben voilà! Je n'avais pas compris que nous n'avions tout simplement pas la même définition du segment (je n'y incluais pas les segments logiques gérés par pagination). Effectivement, dans cette définition-là, je suis entièrement d'accord avec toi.
PS. : Pour ce qui est des bouquins, laisse tomber ceux liés au 286, d'abord, c'est un processeur 16 bits, ensuite, je crois bien qu'il ne comporte pas de pagination.
[^] # Re: archi IA32
Posté par CoinKoin . En réponse au journal question : est-ce que la zone de code est modifiable. Évalué à 1.
plus sérieusement, tu as des données dans ES/DS et ta pile dans SS.
explique moi comment tu peux sortir de SS mais pas de ES/DS par overflow ?
si je ne m'abuse [SS:SP] est incremental et donc le pointeur de retour n'est pas accessible si l'on copie trop de données dans la pile.
Mais c'est pas ça, le principe d'une attaque par buffer overflow! Le principe, c'est justement de profiter de certaines données allouées sur la pile, donc dans le segment pointé par SS, pour écraser l'adresse de retour d'une fonction. La quantité de données qui y est copiée n'influe que sur la taille du buffer overflow nécessaire à l'attaque.
sinon, NX a à voir avec un modele plat de mémoire, ou ( de "ou bien" ) des segments données/code qui se superposent.
une page non executable qui se retrouvent dans CS ne sera pas executé ( fear ). NX palie juste au fait que le modele segmenté n'est plus mis en oeuvre dans les OS pour des soucis de portabilité et de facilité de developpement.
Ah, là, on est d'accord.
pour ce qui est de la pagination, tu proposais l'exception de gestion de faute de page et non de faute de segment ... je te disais juste que tu te trompais d'exception.
Oui, mais non, pas en modèle plat paginé...
Voilà le fichier de référence dont je me sers sur la question : ftp://download.intel.com/design/PentiumII/manuals/24319202.pdf(...)
(C'est le manuel du programmeur système sur i386).
Tu y verras (page 5-44) que, dans un modèle plat paginé, en cas d'écriture à une adresse non autorisée, c'est bien l'exception 14 qui est levée; et les noyaux d'UNIX récupèrent cette exception pour envoyer un SIGSEGV au processus fautif.
sinon pour obtenir une faute sur un segment ... il te faut des segments ( c'est d'une logique assez vile je l'admet ), que le segment soit un segment de mémoire alloué "physiquement" ( LDT / GDT ) ou "logiquement" ( table d'allocation noyau geré a coup de malloc/free ). dans le cas où l'allocation "logique" n'est pas contrainte par une allocation "physique" je vois mal comment le systeme peut gerer cela ( à moins d'utiliser des appels systemes pour acceder aux zones mémoire qui fait qu'il peut y avoir des controles de dépassement ).
Ah, ben voilà! Je n'avais pas compris que nous n'avions tout simplement pas la même définition du segment (je n'y incluais pas les segments logiques gérés par pagination). Effectivement, dans cette définition-là, je suis entièrement d'accord avec toi.
PS. : Pour ce qui est des bouquins, laisse tomber ceux liés au 286, d'abord, c'est un processeur 16 bits, ensuite, je crois bien qu'il ne comporte pas de pagination.