AW2Exec - GOT/PLT

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS HackTricks)!

Autres façons de soutenir HackTricks :

Informations de base

GOT : Global Offset Table

La Table des décalages globale (GOT) est un mécanisme utilisé dans les binaires liés de manière dynamique pour gérer les adresses des fonctions externes. Comme ces adresses ne sont pas connues avant l'exécution (en raison du lien dynamique), la GOT fournit un moyen de mettre à jour dynamiquement les adresses de ces symboles externes une fois qu'elles sont résolues.

Chaque entrée dans la GOT correspond à un symbole dans les bibliothèques externes que le binaire peut appeler. Lorsqu'une fonction est appelée pour la première fois, son adresse réelle est résolue par le lien dynamique et stockée dans la GOT. Les appels ultérieurs à la même fonction utilisent l'adresse stockée dans la GOT, évitant ainsi le surcoût de la résolution de l'adresse à nouveau.

PLT : Procedure Linkage Table

La Table de liaison de procédure (PLT) fonctionne en étroite collaboration avec la GOT et sert de trampoline pour gérer les appels aux fonctions externes. Lorsqu'un binaire appelle une fonction externe pour la première fois, le contrôle est passé à une entrée dans le PLT associée à cette fonction. Cette entrée PLT est responsable d'inviter le lien dynamique à résoudre l'adresse de la fonction si elle n'a pas déjà été résolue. Après la résolution de l'adresse, elle est stockée dans la GOT.

Par conséquent, les entrées de la GOT sont utilisées directement une fois que l'adresse d'une fonction ou d'une variable externe est résolue. Les entrées PLT sont utilisées pour faciliter la résolution initiale de ces adresses via le lien dynamique.

Obtenir l'exécution

Vérifier la GOT

Obtenez l'adresse de la table GOT avec : objdump -s -j .got ./exec

Observez comment après le chargement de l'exécutable dans GEF, vous pouvez voir les fonctions qui sont dans la GOT : gef➤ x/20x 0xDIR_GOT

En utilisant GEF, vous pouvez démarrer une session de débogage et exécuter got pour voir la table got :

GOT2Exec

Dans un binaire, la GOT contient les adresses des fonctions ou de la section PLT qui chargera l'adresse de la fonction. L'objectif de cette écriture arbitraire est de remplacer une entrée de la GOT d'une fonction qui sera exécutée plus tard avec l'adresse du PLT de la fonction system par exemple.

Idéalement, vous remplacerez la GOT d'une fonction qui va être appelée avec des paramètres contrôlés par vous (vous pourrez ainsi contrôler les paramètres envoyés à la fonction système).

Si system n'est pas utilisé par le script, la fonction système n'aura pas d'entrée dans le PLT. Dans ce scénario, vous devrez d'abord divulguer l'adresse de la fonction system puis écraser la GOT pour pointer vers cette adresse.

Vous pouvez voir les adresses PLT avec objdump -j .plt -d ./vuln_binary

One Gadget

pageOne Gadget

Protections

La protection FullRELRO vise à protéger contre ce type de technique en résolvant toutes les adresses des fonctions lorsque le binaire est démarré et en rendant la table GOT en lecture seule après cela :

pageRelro

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS HackTricks)!

Autres façons de soutenir HackTricks :

Dernière mise à jour