[PYTHON] Errate das Passwort mit klee

Einführung

Ich habe gehört, dass es etwas gibt, das klee heißt, also habe ich versucht, das Passwort zu identifizieren, also hinterlasse ich ein Memorandum. Ich verstehe die Einzelheiten überhaupt nicht, also bin ich einfach umgezogen.

Problem zu lösen

Ich habe auf die Funktion "check_password ()" abgezielt, die in der Verwenden der symbolischen Umgebung des klee-Tutorials eingeführt wurde. Diese Funktion gibt 1 zurück, wenn das Passwort "Hallo" eingegeben wird, andernfalls 0.

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;
}

Das Tutorial erklärt, wie ein Testfall generiert wird, der Befehlszeilenargumente enthält. In diesem Artikel wollten wir jedoch tatsächlich nach einem Kennwort fragen.

Fragen Sie tatsächlich nach einem Passwort

Von hier aus wird das Passwort tatsächlich durch symbolische Ausführung erhalten.

Auszuführender Code

Diesmal werden zwei Klee-Funktionen verwendet.

Im Beispielcode wird das Befehlszeilenargument "char ** argv" verwendet, diesmal jedoch in "char pass [6]" umgeschrieben, da nur eine symbolische Ausführung erforderlich ist.

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;
}

Ausführungsmethode

Drücken Sie einfach den Befehl klee, nachdem Sie clang ausgeführt haben. Geben Sie im Teil / home / klee / klee_src / include den Pfad von klee entsprechend Ihrer Umgebung an. Wenn Sie Docker verwenden, können Sie das folgende Beispiel beibehalten.

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

Ausführungsergebnis und Passwort

Bei der Ausführung wird das folgende Ergebnis erhalten. image.png

An diesem Inhalt können Sie erkennen, dass das Ergebnis in das Verzeichnis "klee-out-0" ausgegeben wurde. image.png

Es werden mehrere Dateien mit der Bezeichnung ".ktest" ausgegeben, aber jede ist ein Testfall. Verwenden Sie den Befehl ktest-tool, um diese .ktest-Datei anzuzeigen.

Wenn in dem diesmal ausgeführten Code die Passwörter übereinstimmen, wird der Prozess mit "klee_assert" unterbrochen. Wenn Sie sich also den Testfall ansehen, in dem .assert.err existiert ( test000005.ktest), können Sie das Passwort erhalten. image.png

schließlich

Als ich es zum ersten Mal hörte, dachte ich, dass klee ein Tool wie angr ist, das es analysiert, wenn ich eine Binärdatei übergebe, aber diese Methode erfordert eine Prozedur, um dem Quellcode klee / klee.h usw. hinzuzufügen. Es scheint. Ich würde gerne herausfinden, ob es eine einfache Möglichkeit gibt, es zu verwenden, selbst wenn ich nur die Binärdatei habe.

Recommended Posts

Errate das Passwort mit klee
Geben Sie ein Passwort in das PDF ein
Setzen Sie den Debugger mit der Nase ein
Töte den Prozess mit sudo kill -9
gethostbyaddr () kommuniziert mit der Außenwelt
Schaben Nikkei Durchschnitt mit Dramatiker-Python
Überprüfen Sie den Code mit flake8
Kalibrieren Sie das Modell mit PyCaret
Rufen Sie die API mit python3 auf.
Passwortverwaltung per Python: Schlüsselbund
Spielen Sie mit dem Passwortmechanismus von GitHub Webhook und Python
QR-Code mit CNN entschlüsseln
Extrahieren Sie die xz-Datei mit Python
Extrahieren Sie den Maximalwert mit Pandas.
Färben Sie das Integrationsintervall mit matplotlib.pyplot
Verwenden Sie die Vorschaufunktion mit aws-cli
Folgen Sie der Dateihierarchie mit fts
Mit PyEphem ist der Weltraum gefährlich
Bereiten Sie die Straße mit Kombinationsoptimierung
Holen Sie sich das Wetter mit Python-Anfragen
Holen Sie sich das Wetter mit Python-Anfragen 2
Finden Sie die Bearbeitungsentfernung (Levenshtein-Entfernung) mit Python
Entdecken Sie das Labyrinth mit erweitertem Lernen
Mit OpenCV die einfachsten Fehler finden
Klicken Sie mit Python auf die Etherpad-Lite-API
Installieren Sie das Python-Plug-In mit Netbeans 8.0.2
Anrufdiagramm mit PyCallGraph ausgeben
Installieren Sie die Datendatei mit setup.py
Laden Sie die mit appcfg.py bereitgestellte Datei herunter
Debuggen Sie das Skript mit Sakura Editor
Ich mochte den Tweet mit Python. ..
[Python] Generiere ein Passwort mit Slackbot
Passwort für Lehrbuch mit Python generieren
Beherrsche den Typ mit Python [Python 3.9 kompatibel]
Drücken Sie den obersten Befehl mit htop
Versuchen Sie, das Bild mit opencv2 zu verwischen
Validieren Sie das Trainingsmodell mit Pylearn2
Datei mit Standard-App öffnen
Bereiten Sie die Entwicklungsumgebung mit anyenv vor