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


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.

Regardons le code source.

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.



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

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

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 .


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

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.

En conséquence, nous obtenons nos points.

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 .