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.
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.
Von hier aus wird das Passwort tatsächlich durch symbolische Ausführung erhalten.
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;
}
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
Bei der Ausführung wird das folgende Ergebnis erhalten.
An diesem Inhalt können Sie erkennen, dass das Ergebnis in das Verzeichnis "klee-out-0" ausgegeben wurde.
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.
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