web-dev-qa-db-fra.com

Comment les pointeurs de graisse sont-ils une bonne protection?

J'apprends les débordements de tampon et j'ai l'idée d'un gros pointeur, mais ce que je ne comprends pas vraiment, c'est comment sont-ils une bonne protection? Si vous pouviez modifier le pointeur pour qu'il pointe vers une autre adresse, ne seriez-vous pas en mesure de modifier la base obj et la section de fin obj du pointeur gras afin que le pointeur semble toujours valide?

16
Pixel

Les débordements de tampon ne consistent pas à définir le pointeur pour qu'il pointe vers une autre adresse arbitraire.

Un débordement de tampon se produit lorsqu'une entrée entraîne une exécution apparemment correcte de votre programme (par exemple "increment(): déplacez le pointeur de 256 octets") trop souvent, de sorte que le le pointeur se déplace hors de la structure/du tableau de données voulu et vers un autre objet.

Un "gros pointeur" contient des informations sur la structure des données/la taille du tableau. Cela signifie que increment() peut avoir des contrôles de sécurité dans son code, pour s'assurer que le pointeur se trouve dans les limites appropriées. Vous avez encore besoin de contrôles de sécurité quelque part dans votre code, mais cela vous permet de le centraliser.

38
cloudfeet

Il semble que vous pensiez au type de bufferoverflow qui se produit généralement sur le tas. Là, les morceaux de mémoire alloués sont généralement stockés en tant qu'éléments, avec des métadonnées, qui incluent des pointeurs vers l'élément suivant et précédent, dans des listes doublement liées. En théorie, en débordant le tampon, vous seriez en mesure d'écraser les métadonnées du prochain bloc de mémoire et si celui-ci est libéré, vous pourriez écraser un pointeur de fonction, conduisant à l'exécution de code arbitraire. Pour plus d'informations sur l'exploitation voir ce site

Les pointeurs volumineux pourraient vous protéger de cela: en vérifiant simplement chaque opération sur le tableau, comme lire ou écrire sur l'emplacement, une vérification interne des limites, si le décalage/index donné est valide, sera effectuée et si et seulement si les limites la vérification est réussie, l'opération sera exécutée. (Comme @cloudfeet l'a déjà dit.) Cela signifie que vous ne pourrez pas écrire après les limites de votre mémoire et que vous ne pourrez donc pas écraser des choses comme les métadonnées du prochain bloc de mémoire ou un pointeur sur la pile.

3
Sebastian Walla