
Dans cet article, nous apprendrons à intercepter les données transférées entre la fonction de bibliothèque et le programme, à rappeler les descripteurs de fichiers et à résoudre les 6e et 9e tâches à 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.
La solution à la tâche aléatoire
Nous cliquons sur l'icône avec la signature au hasard, et on nous dit que nous devons nous connecter via SSH avec le mot de passe guest.

Une fois connecté, nous voyons la bannière correspondante.

Voyons quels fichiers se trouvent sur le serveur, ainsi que les droits dont nous disposons.
ls -l

Ainsi, nous pouvons lire le code source du programme, car il y a un droit de lecture pour tout le monde, et exécuter le programme au hasard avec les droits du propriétaire (le bit collant est défini). Voyons le résultat du code.

Le programme génère un nombre aléatoire, applique l'opération XOR (OU exclusif) et si le résultat de l'opération XOR est égal à la valeur de référence, il affiche un indicateur.
Le fait est que la fonction rand () est utilisée dans ce programme. Cette fonction génère un nombre pseudo-aléatoire, convertissant le «grain» généré par la fonction srand (). La fonction srand (nombre) doit être appelée à chaque fois avant d'appeler rand (). Si cela ne se produit pas, alors srand (1) est déclenché avant rand () par défaut.
Ainsi, dans ce programme, un générateur de nombres pseudo-aléatoires convertit à chaque fois le même «grain» selon le même algorithme. Nous devons trouver le nombre que la fonction rand () retourne et le proxy avec la valeur de référence. Puisque l'opération XOR est réversible, en passant ensuite la valeur reçue à l'entrée du programme, nous obtenons un drapeau.
Interceptons les données entre la fonction de bibliothèque rand () et notre programme. Pour ce faire, utilisez l'utilitaire ltrace.
ltrace ./random

Nous voyons avec quels paramètres la fonction rand () est appelée et quelle valeur elle retourne. Maintenant, proxoritez cette valeur avec la référence.

Nous soumettons le nombre résultant à l'entrée de notre programme.

Nous passons le drapeau et obtenons un point pour une tâche aussi simple.

Solution à l'erreur
Nous cliquons sur l'icône avec la signature d'erreur, et on nous dit que nous devons nous connecter via SSH avec le mot de passe guest.

Une fois connecté, nous voyons la bannière correspondante.

Voyons quels fichiers se trouvent sur le serveur, ainsi que les droits dont nous disposons.
ls -l

Ainsi, nous pouvons lire le code source du programme, car il y a un droit de lecture pour tout le monde, et exécuter un programme d'erreur avec les droits du propriétaire (le bit collant est défini). Voyons le résultat du code.

Au tout début du programme, un fichier est ouvert et un descripteur est créé. À propos des descripteurs de fichiers, j'ai déjà écrit en détail dans cet article. Mais le fait est que la condition a fait une erreur. Ainsi, une comparaison est d'abord effectuée, dont le résultat est un mensonge, puis l'affectation de ce faux résultat (c'est-à-dire 0) à la variable fd.

Ensuite, la fonction sleep est appelée et sans suggérer d'entrée dans la variable pw_buf, les données sont lues. Mais en raison d'une erreur dans la condition, ils ne sont pas lus à partir d'un fichier ouvert avec un mot de passe, mais à partir de l'entrée standard (handle 0).
Ensuite, nous saisissons 10 caractères, qui se querellent caractère par caractère avec 1 et sont comparés à un mot de passe.

Ainsi, nous entrons deux lignes dont les caractères devraient résulter d'un résultat de l'opération XOR. Nous trouverons deux caractères, si nous les procurons, nous obtenons 1.

Ce sont les caractères A et @. Entrez maintenant deux lignes dans le programme, l'un des 10 caractères «A» et l'autre - «@».

Nous remettons le drapeau et obtenons un point de plus.

Rendez-vous dans les articles suivants!
Nous sommes dans un canal de télégramme: un
canal dans Telegram .