Résolution de problèmes avec pwnable.kr 03 - bof. Débordement de tampon sur la pile

image

Dans cet article, nous analyserons un type de vulnérabilité tel qu'un débordement de tampon sur la pile, et résoudrons la troisième tâche à partir du site pwnable.kr .

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.

Débordement de tampon


Le débordement de tampon est une vulnérabilité des programmes informatiques basée sur la capacité d'écrire des données en dehors du tampon alloué en mémoire, ce qui survient, en règle générale, en raison de la réception et du traitement incontrôlés des données de l'extérieur. L'utilisation de la technologie de trame de pile de haut niveau par les langues conduit au mélange des données de contrôle et des données de programme.

Dans cet article, nous analysons uniquement le dépassement de tampon sur la pile. Ce type de débordement de tampon est connu sous le nom d'écrasement de pile et peut être exploité de la manière suivante:

  • écraser une variable locale située en mémoire près du tampon;
  • réécrire l'adresse de retour dans le cadre de pile;
  • réécriture d'un pointeur de fonction ou d'un gestionnaire d'exceptions;
  • écraser un paramètre d'une autre trame de pile.

Cette tâche utilise la méthode de réécriture d'une variable locale. Considérez son essence dans l'exemple suivant:

#include <stdio.h> #include <string.h> int main(){ char pass[9] = "p@ssw0rd\x00"; char buf[9]; printf("Input password: "); scanf("%s", buf); if(!strcmp(pass, buf)) printf("Login ok!!!\n"); else printf("FAIL...\n"); return 0; } 

Puisque la variable pass est définie plus tôt, la variable buf , il est possible de la déborder. Si vous entrez plus de 9 octets dans buf , ils écraseront les données dans la variable pass . Ainsi, il est possible de «changer» le mot de passe en votre propre en passant le programme, par exemple, une telle ligne 11111111 \ x0011111111 \ x00 .

image

image

Solution du job bof


On clique sur l'icône avec la signature bof, et on nous fournit le code source, le programme lui-même, ainsi que l'adresse et le port pour la connexion TCP.

image

Regardons le code source.

image

Il résulte du code que le programme accepte la chaîne, mais compare la clé déjà câblée avec la valeur de contrôle. Mais comme l'entrée n'est pas contrôlée et que la clé est définie avant notre tampon, nous pouvons déborder le tampon et écraser la clé. Pour cela, il est nécessaire de déterminer les positions relatives des variables en mémoire.

J'utiliserai Cutter pour analyser le programme. Ouvrez Cutter, spécifiez le chemin d'accès au fichier exécutable.

image

image

image

Cutter nous envoie immédiatement au point d'entrée. Dans la liste des fonctions, sélectionnez principal.

image

En général, nous voyons un appel à notre fonction, ouvrez-le en double-cliquant sur le nom de la fonction.

image

Il y a un commentaire avant le code de la fonction, qui reflète les variables utilisées dans la fonction et leurs adresses par rapport à la base du cadre de pile actuel (ebp). Comme vous pouvez le déterminer, notre tampon est la variable var_2ch et la clé est arg_8h .

image

image

Nous calculons le nombre d'octets que nous devons écraser. Pour ce faire, il suffit de trouver la différence entre les adresses.

image

Ainsi, nous devons envoyer le programme 0x34 tous les octets, puis ajouter la valeur de référence pour un exemple. Pour plus de commodité, j'utilise la bibliothèque pwntools .

 from pwn import * conn = remote('pwnable.kr', 9000) payload = 'A' * 0x34 payload += '\xbe\xba\xfe\xca' conn.send(payload) conn.interactive() 

Nous obtenons la coquille et voyons le drapeau.

image

En conséquence, nous obtenons nos points.

image

Dans cet article, nous avons examiné un exemple d'exploitation d'un débordement de tampon sur une pile, en découvrant l'outil Cutter et la bibliothèque pwntools. Dans le prochain article, nous parlerons de l'empaquetage des fichiers exécutables et résoudrons la quatrième tâche. Rendez-vous dans les articles suivants.

Nous sommes dans un canal de télégramme: un canal dans Telegram .

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


All Articles