Problemlösung mit pwnable.kr 03 - bof. Pufferüberlauf auf Stapel

Bild

In diesem Artikel analysieren wir eine solche Art von Sicherheitsanfälligkeit wie einen Pufferüberlauf auf dem Stapel und lösen die dritte Aufgabe von der Site pwnable.kr .

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.

Pufferüberlauf


Ein Pufferüberlauf ist eine Sicherheitsanfälligkeit in Computerprogrammen, die auf der Fähigkeit beruht, Daten außerhalb des im Speicher zugewiesenen Puffers zu schreiben. Dies tritt in der Regel aufgrund des unkontrollierten Empfangs und der unkontrollierten Verarbeitung von Daten von außerhalb auf. Die Verwendung der High-Level-Stack-Frame-Technologie durch Sprachen führt zum Mischen von Steuerdaten und Programmdaten.

In diesem Artikel analysieren wir nur den Pufferüberlauf auf dem Stapel. Diese Art des Pufferüberlaufs wird als Stack Smashing bezeichnet und kann auf folgende Arten ausgenutzt werden:

  • Überschreiben einer lokalen Variablen im Speicher in der Nähe des Puffers;
  • Schreiben Sie die Rücksprungadresse in den Stapelrahmen um.
  • Umschreiben eines Funktionszeigers oder eines Ausnahmebehandlers;
  • Überschreiben eines Parameters aus einem anderen Stapelrahmen.

Diese Aufgabe verwendet die Methode zum Umschreiben einer lokalen Variablen. Betrachten Sie das Wesentliche im folgenden Beispiel:

#include <stdio.h> #include <string.h> int main(){ char pass[9] = "p@ssw0rd\x00"; char buf[9]; printf("Input password: "); scanf("%s", buf); if(!strcmp(pass, buf)) printf("Login ok!!!\n"); else printf("FAIL...\n"); return 0; } 

Da die Passvariable früher definiert wurde, die Buf- Variable, ist es möglich, sie zu überlaufen. Wenn Sie mehr als 9 Bytes in buf eingeben , werden die Daten in der Passvariablen überschrieben. So ist es möglich, das Passwort in Ihr eigenes zu ändern, indem Sie das Programm übergeben, beispielsweise eine solche Zeile 11111111 \ x0011111111 \ x00 .

Bild

Bild

Lösung des Jobs bof


Wir klicken auf das Symbol mit der Signatur bof und erhalten den Quellcode, das Programm selbst sowie die Adresse und den Port für die TCP-Verbindung.

Bild

Schauen wir uns den Quellcode an.

Bild

Aus dem Code folgt, dass das Programm die Zeichenfolge akzeptiert, aber den bereits verdrahteten Schlüssel mit dem Steuerwert vergleicht. Da die Eingabe jedoch nicht gesteuert wird und der Schlüssel vor unserem Puffer definiert wird, können wir den Puffer überlaufen und den Schlüssel überschreiben. Dazu ist es notwendig, die relativen Positionen der Variablen im Speicher zu bestimmen.

Ich werde Cutter verwenden , um das Programm zu analysieren. Öffnen Sie Cutter und geben Sie den Pfad zur ausführbaren Datei an.

Bild

Bild

Bild

Cutter schickt uns sofort zum Einstiegspunkt. Wählen Sie in der Liste der Funktionen main aus.

Bild

In der Regel sehen wir einen Aufruf unserer Funktion, öffnen Sie ihn durch Doppelklick auf den Namen der Funktion.

Bild

Vor dem Funktionscode befindet sich ein Kommentar, der die in der Funktion verwendeten Variablen und ihre Adressen relativ zur Basis des aktuellen Stapelrahmens (ebp) widerspiegelt. Wie Sie feststellen können, ist unser Puffer die Variable var_2ch und der Schlüssel ist arg_8h .

Bild

Bild

Wir berechnen, wie viele Bytes wir überschreiben müssen. Finden Sie dazu einfach den Unterschied zwischen den Adressen.

Bild

Daher müssen wir dem Programm 0x34 beliebige Bytes senden und dann den Referenzwert für ein Beispiel hinzufügen. Der Einfachheit halber verwende ich die pwntools- Bibliothek.

 from pwn import * conn = remote('pwnable.kr', 9000) payload = 'A' * 0x34 payload += '\xbe\xba\xfe\xca' conn.send(payload) conn.interactive() 

Wir holen die Muschel und sehen uns die Flagge an.

Bild

Als Ergebnis bekommen wir unsere Punkte.

Bild

In diesem Artikel haben wir uns ein Beispiel für das Ausnutzen eines Pufferüberlaufs auf einem Stapel angesehen und das Cutter-Tool und die pwntools-Bibliothek kennengelernt. Im nächsten Artikel werden wir über das Packen ausführbarer Dateien sprechen und die vierte Aufgabe lösen. Wir sehen uns in den folgenden Artikeln.

Wir befinden uns in einem Telegrammkanal: einem Kanal im Telegramm .

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


All Articles