Problemlösung mit pwnable.kr 24 - einfaches Login. Stapelrahmenüberlagerung

Bild

In diesem Artikel lösen wir die 24. Aufgabe auf der Website pwnable.kr und erfahren, wie Sie den Stapelrahmen stapeln.

Organisationsinformationen
Speziell für diejenigen, die etwas Neues lernen und sich in einem der Bereiche Informations- und Computersicherheit entwickeln möchten, werde ich über die folgenden Kategorien schreiben und sprechen:

  • PWN;
  • Kryptographie (Krypto);
  • Netzwerktechnologien (Netzwerk);
  • Reverse (Reverse Engineering);
  • Steganographie (Stegano);
  • Suche und Ausnutzung von WEB-Schwachstellen.

Darüber hinaus werde ich meine Erfahrungen in den Bereichen Computerforensik, Analyse von Malware und Firmware, Angriffe auf drahtlose Netzwerke und lokale Netzwerke, Durchführung von Pentests und Schreiben von Exploits teilen.

Damit Sie sich über neue Artikel, Software und andere Informationen informieren können, habe ich in Telegram einen Kanal und eine Gruppe eingerichtet, um alle Probleme im Bereich ICD zu diskutieren . Außerdem werde ich Ihre persönlichen Anfragen, Fragen, Vorschläge und Empfehlungen persönlich prüfen und alle beantworten .

Alle Informationen werden nur zu Bildungszwecken bereitgestellt. Der Autor dieses Dokuments übernimmt keine Verantwortung für Schäden, die jemandem durch die Verwendung von Kenntnissen und Methoden entstehen, die durch das Studium dieses Dokuments erworben wurden.

Einfache Login-Job-Lösung


Wir setzen den zweiten Abschnitt fort. Ich werde gleich sagen, dass es schwieriger ist als das erste und wir nicht mit dem Quellcode der Anwendungen versorgt werden. Vergessen Sie nicht die Diskussion hier . Fangen wir an.

Klicken Sie auf das Symbol mit dem einfachen Login der Signatur. Wir erhalten die Adresse und den Anschluss für die Verbindung sowie das Programm selbst.

Bild

Laden Sie alles herunter, was sie uns geben, überprüfen Sie die Binärdatei.

Bild

Dies ist ein 32-Bit-Elf mit installiertem kanarischen und nicht ausführbaren Stapel. Wir dekompilieren in IDA Pro.

Bild

Im Programm werden Benutzerdaten von base64 dekodiert. Die Variable v7 speichert die Länge der decodierten Zeichenfolge. Ferner wird v7 mit 12 verglichen. Wenn die Prüfung bestanden wird, wird die decodierte Zeichenfolge in die Eingabevariable kopiert, und dann wird die Auth-Funktion aufgerufen, in die die Länge der decodierten Zeichenfolge als Parameter übergeben wird. Und wenn wir die Authentifizierung bestehen, wird die richtige Funktion aufgerufen. Schauen wir uns die Auth-Funktion an.

Bild

Es sieht aus wie ein Pufferüberlauf. Schauen Sie sich den Stapel an.

Bild

Nein. Wir können den Puffer nicht überlaufen lassen, da dies mehr als 12 Bytes erfordert. Interessant sind die Adressen, an denen der Wert der Variablen gespeichert ist, insbesondere die v4-Variable, in die kopiert wird.

Bild

Dies ist die Adresse [ESP + 32]. Schauen Sie sich den Code dafür in zerlegter Form an.

Bild

Die folgenden Anweisungen sind erforderlich, um den Stapelrahmen zu speichern.
push ebp
mov ebp, esp

Verwenden Sie die Anweisung Leave, um den Stapel wiederherzustellen. Womit wir die inversen Operationen durchführen.

Bild

Am interessantesten ist die dritte Anweisung, sub esp, 28h .

Somit tritt eine Überlappung auf: esp nimmt um 40 ab, und die v2-Variable befindet sich bei esp + 32 und benötigt 12 Bytes. Das heißt, nach dem Verschieben des Werts von esp nach ebp wird die Adresse der letzten vier Bytes der Variablen v2 in ebp gespeichert. Wenn die Leave- und Retn-Anweisungen ausgeführt werden, befinden sich die letzten vier Bytes der v2-Variablen jetzt im oberen Frame des Stapels.

Lassen Sie uns die Eingabezeile QUFBQUFBQUFCQkJC überprüfen und angeben.

Bild

Wenn unsere Annahme richtig ist, ist nach dem Ausführen von retn in der Auth-Funktion die Adresse "BBBB" die Spitze des Stapels.

Bild

Führen Sie nun Urlaub aus.

Bild

Es gibt "BBBB" in EBP und jetzt, nachdem Urlaub in der Hauptfunktion main ausgeführt wurde, stürzt das Programm ab. Somit können wir vor der Adresse der Oberseite des Stapels stehen, an der sich die Adresse befindet, zu der wir gehen möchten. Dann wird die Last wie folgt aussehen: 4 beliebige Bytes + Adresse, an die wir gehen + Adresse zum Anfang der Ladung.

Schreiben Sie zunächst eine Vorlage.
 from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() r.interactive() 

Jetzt finden wir die Adresse heraus, an die wir gehen möchten - dies ist 0x8049284 innerhalb der richtigen Funktion.

Bild

Diese Adresse wird der zweite Teil unserer Ladung sein. Der dritte Teil der Last ist die Adresse der Eingangsvariablen (Ladeadresse).

Bild

Wir setzen die Last im Code zusammen. Vergessen Sie nicht, in base64 zu codieren:
 payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) 

Vollständiger Code.
 from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) r.send(payload+"\n") r.interactive() 

Bild

Und hol dir deine Punkte. Ehrlich gesagt war diese Aufgabe für mich nicht sehr einfach.

Bild

Und wir fahren fort: im nächsten Artikel - Forensik. Sie können sich uns per Telegramm anschließen .

Source: https://habr.com/ru/post/de468761/


All Articles