Devinez le mot de passe avec klee

introduction

J'ai entendu dire qu'il y avait quelque chose qui s'appelle klee, alors j'ai essayé d'identifier le mot de passe, alors je laisse un mémorandum. Je ne comprends pas du tout les détails, alors je viens de déménager.

Problème à résoudre

J'ai ciblé la fonction check_password () introduite dans Utilisation de l'environnement symbolique du tutoriel klee. Cette fonction renvoie 1 lorsque le mot de passe «bonjour» est saisi, et 0 sinon.

password.c


#include <stdio.h>

int check_password(char *buf) {
  if (buf[0] == 'h' && buf[1] == 'e' &&
      buf[2] == 'l' && buf[3] == 'l' &&
      buf[4] == 'o')
    return 1;
  return 0;
}

int main(int argc, char **argv) {
  if (argc < 2)
     return 1;
  
  if (check_password(argv[1])) {
    printf("Password found!\n");
    return 0;
  }

  return 1;
}

Le didacticiel explique comment générer un scénario de test qui inclut des arguments de ligne de commande, mais dans cet article, nous visions à demander un mot de passe.

En fait, demandez un mot de passe

A partir de là, le mot de passe est en fait obtenu par exécution symbolique.

Code à exécuter

Il y a deux fonctions klee utilisées cette fois.

Dans l'exemple de code, l'argument de ligne de commande char ** argv est pris, mais cette fois il est réécrit en char pass [6] car il est bon que l'exécution symbolique puisse être effectuée.

password.c


#include <stdio.h>
#include "klee/klee.h"

int check_password(char *buf) {
    if (buf[0] == 'h' && buf[1] == 'e' &&
        buf[2] == 'l' && buf[3] == 'l' &&
        buf[4] == 'o')
        return 1;
    return 0;
}

int main(void) {
    char pass[6];

    klee_make_symbolic(pass, sizeof(pass[0]) * 6, "pass");
    if (check_password(pass)) {
        printf("Password found!\n");
    	klee_assert(0);
        return 0;
    }
    return 1;
}

Méthode d'exécution

Appuyez simplement sur la commande klee après avoir exécuté clang. Dans la partie / home / klee / klee_src / include, spécifiez le chemin de klee en fonction de votre environnement. Si vous utilisez docker, vous pouvez conserver l'exemple ci-dessous.

$ clang -I /home/klee/klee_src/include -emit-llvm -c -g -O0 -Xclang -disable-O0-optnone password.c
$ klee password.bc

Résultat d'exécution et mot de passe

Une fois exécuté, le résultat suivant sera obtenu. image.png

À partir de ce contenu, vous pouvez voir que le résultat a été sorti dans le répertoire klee-out-0, alors jetez un œil. image.png

Plusieurs fichiers appelés .ktest sont générés, mais chacun est un cas de test. Utilisez la commande ktest-tool pour voir ce fichier .ktest.

Dans le code exécuté cette fois, si les mots de passe correspondent, le processus est interrompu avec klee_assert. Donc, si vous regardez le cas de test où .assert.err existe ( test000005.ktest), vous pouvez obtenir le mot de passe. image.png

à la fin

Quand je l'ai entendu pour la première fois, j'ai pensé que klee était un outil comme angr qui l'analyserait si je passais un binaire, mais cette méthode nécessite une procédure pour ajouter klee / klee.h etc. au code source. Il semble. J'aimerais savoir s'il existe un moyen simple de l'utiliser même si je n'ai que le binaire.

Recommended Posts

Devinez le mot de passe avec klee
Mettez un mot de passe sur le PDF
Insérez le débogueur avec le nez
Tuez le processus avec sudo kill -9
gethostbyaddr () communique avec l'extérieur
Gratter la moyenne du Nikkei avec le dramaturge-python
Vérifiez le code avec flake8
Calibrer le modèle avec PyCaret
Appelez l'API avec python3.
Gestion des mots de passe avec python: trousseau de clés
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Décrypter le code QR avec CNN
Extraire le fichier xz avec python
Extraire la valeur maximale avec les pandas.
Colorez l'intervalle d'intégration avec matplotlib.pyplot
Utilisez la fonction de prévisualisation avec aws-cli
Suivez la hiérarchie des fichiers avec fts
L'espace est dangereux avec PyEphem
Paver la route avec l'optimisation des combinaisons
Obtenez la météo avec les requêtes Python
Obtenez la météo avec les requêtes Python 2
Trouvez la distance d'édition (distance de Levenshtein) avec python
Explorez le labyrinthe avec l'apprentissage augmenté
Trouver les erreurs les plus simples avec OpenCV
Accédez à l'API Etherpad-lite avec Python
Installer le plug-in Python avec Netbeans 8.0.2
Graphique d'appel de sortie avec PyCallGraph
Installez le fichier de données avec setup.py
Téléchargez le fichier déployé avec appcfg.py
Déboguer le script avec l'éditeur Sakura
J'ai aimé le tweet avec python. ..
[Python] Générer un mot de passe avec Slackbot
Générer un mot de passe pour le manuel avec python
Maîtriser le type avec Python [compatible Python 3.9]
Frappez la commande supérieure avec htop
Essayez de brouiller l'image avec opencv2
Validez le modèle d'entraînement avec Pylearn2
Ouvrir le fichier avec l'application par défaut
Préparez l'environnement de développement avec anyenv