Grüße an alle habrachitateli. Drei Wochen sind vergangen, seit ich
denjenigen vorgeschlagen habe, die meine CTF lösen möchten, und ich denke, es ist Zeit, die Analyse der Aufgaben zu veröffentlichen. Aus eigener Erfahrung weiß ich, dass es eine Schande ist, in einer Situation zu sein, in der ich viel Zeit mit einer Aufgabe verbracht habe, aber keine Lösung gefunden habe. Deshalb poste ich die Analyse der Aufgaben. Die Lösungen sind in Schritte unterteilt und unter einem Spoiler versteckt, sodass Sie nach jedem Schritt versuchen können, die Aufgabe selbst zu erledigen und einen schwierigen Moment zu überwinden.
XT_CTF_01XT_TASK_101Schritt 1Öffnen Sie das Archiv und sehen Sie lange Ordnernamen. Der letzte Ordner enthält Dateien, deren Inhalt jedoch ohne Kennwort nicht verfügbar ist.
Wir schreiben die Namen der Ordner auf:
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
2346ad27d7568ba9896f1b7da6b5991251debdf2
e3cbba8883fe746c6e35783c9404b4bc0c7ee9eb
bef21e9bfcf9fab0a5aebd46a735efe5434da96b
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
Wir steuern die Sequenzen in Google und stellen schnell fest, dass dies sha1 ist, und zwar anhand der folgenden Wörter:
password
hash
1000
letters
a
Alles in allem nehmen wir an, dass das Passwort ein Hash von 1000 Buchstaben 'a' ist. Wenn sha1 für Wörter verwendet wurde, werden wir es hier versuchen - 291e9a6c66994949b57ba5e650361e98fc36b1ba. Wir extrahieren die Dateien und stellen sicher, dass das Passwort korrekt ist.
Schritt 2Die Untersuchung der Dateien zeigt, dass sie alle nach einem ungefähr allgemeinen Prinzip zusammengesetzt sind: dem Namen des xt-Formats + der Zahl, dem Inhalt einiger Zeilen, wobei der erste ein paar Buchstaben und der zweite eine Folge von Hexadezimalzeichen ist. Es ist ziemlich uninteressant, hexadezimale Sequenzen zu betrachten, da sie jeweils 79 Zeichen enthalten (mit Ausnahme der Datei xt121785230414240585522142219912, in der es 58 davon gibt) - dies sind definitiv keine Hashes und nichts Codiertes.
Da es überall gleich ist und nur eine Datei weniger enthält, kann davon ausgegangen werden, dass alle Hex-Sequenzen kombiniert werden müssen und der kleinere Teil nur der letzte Teil ist. Es bleibt die Reihenfolge zu verstehen. Sie könnten mit den Namen spielen, aber Sie werden nichts Interessantes bekommen. Wenn Sie jedoch auf die ersten Zeilen der Dateien achten, können Sie auch mithilfe des Blicks ein Muster finden.
Hier werde ich einige Zeilen angeben: er, li, n, o, ne, mg, si, ca, cu, zn, br, kr, ag ...
Wenn sie sich in der Nähe befinden, ist es viel einfacher, die Bezeichnung chemischer Elemente in ihnen zu erkennen. Wir öffnen das Periodensystem und sammeln die Hex-Sequenz in einer Datei (es gibt insgesamt 53 Dateien, dies ist die Nummer des letzten Teils mit dem Symbol i, das Yod entspricht, 53 Elemente).
Das Ergebnis ist eine PNG-Datei mit einem grünen Rechteck.
Schritt 3Es ist unwahrscheinlich, dass die Metadaten in klarer Form in der Datei enthalten sind, da alle Bytes in der Hex-Darstellung angezeigt werden. Daher werden wir mit dem Bild selbst arbeiten. Möglicherweise stellen Sie fest (natürlich nicht mit dem Auge, sondern mit Werkzeugen), dass tatsächlich mehr als eine Farbe verwendet wird. Wir werden die Füllung verwenden und die Anleitung zum nächsten Schritt lesen.

Schritt 4Wir hash sha1 alle Dateinamen und ordnen sie in der Reihenfolge aus dem vorherigen Schritt.
696e7400b8a8c7da1c52e63550ddfdf8ae03be73
206d6100f4eb7c768890e8502db2bdeb81718301
696e2800f1c5c0df7676667ffca16856e808f9dd
297b69008e0d05b67df33c751da3c6f17a3fdb9d
6e742000bf96cea16e609731aa7397ac2b9f7b15
613d3400d2fedbf43ad7c43d678382d2ef83dde8
36303900b909f396c69c6d47ccb623cc83d5e2ea
313132007f6fdde9d3abad5545f44b2d2661b0be
3b696e0002582f22cab7aeaf730680b87780279a
74206200267e505a621cf264e303d3df63222fa7
3d343600ac031f166103b5319a273a867d5247ae
36393700d9e521b0e0d488b47fde51e5f5f9650d
37323b00bdf3caa241b2936f0355ad89e420389c
696e7400a1f9f8e62cd64c8e25d852e433bda80c
20633d009932d3b69b7a74296c7b75894bcddbc1
373639000ca31548a80fe28adf263bbe89f03069
33393400f56920f247d4d66798bb2c54e3db668c
373b6900222283ee79a5e7e3e79d55d4b159ffb1
6e742000fac60ac1f78aa90201e98b30a9c4adbc
643d3700b55bc0dda8bd748983716018b29fbd6f
38323300176db95a8aa4aaf1770346c353fd4753
32313400644e234a3899bd84e9f7d61a12bfecab
3b696e00654b4b7d8fb3b022777c6346342eba91
742065009720d2693f833788e69a6641e8de22f6
3d363800b1e40956ec8ca6a64013c8a651eff0f7
3435340008b5419f5139553c85b605009e3fb343
38393b004e5d66b6980c7cf14dc9bf0acf09e444
696e7400e648ffad4cde46b4d845f1ffad075da5
20663d00b9bdab8cb8721581f5aa8a2c2522d9de
3334330054fb4abaf144e818ec1199b7b4ffec47
34353900378490c3ba53a356327af1bbb2d2c8b0
313b69008803024e711baf3695402d3a13e0c905
6e7420006434f491ab51a923995a3daf56a65f5e
673d3800c5198ae1565cc5744d23ac492f6d2506
3231380000217a2c380bf9c9a6e122b1c01e90ea
373339003ef4f423f0d9c54ea5d8fbe4d8bf518c
3b70720073caad02c9cba60debf81f72c0ac23ad
696e7400d9ddb857a7608947aae60ed6d054c039
6628220061a3a81dcc20ce43903a18cea28b77db
2573250065285f647ed3e22a9233974ac24509a1
73257300678138427cc07ee072c987583db2fc5e
25732500d183d5303ed6bda0606eb5e4ccc1e7c8
73257300c5e9d7bfdb76b5fee122fe57bc8aa81a
25735c003675c4f732d95ae6a0d9bcc6769f94ca
6e222c0088503423d1f56148bbf2573a6e2e0518
26612c007c8d1d6b90d252fa7b2084bd8695a8f9
26622c00ec96a4edbdeb286484af38395a3fc928
26632c004a1db36cdef743283e6bc853b6995555
26642c00dd66db502138413e272deb2da78d4f57
26652c00bb1785b4e41444da4230b602f1860557
26662c00e739c24f55c0899b8eae2a948622c7d7
26672900f4b4843d0056571d293bec879cd1968f
3b7d20006750ebb44ffd784dc8afdd5b0f76816a
Wenn Sie alles mit Stiften machen, werden Sie ziemlich schnell feststellen, dass 4 Bytes immer Null sind und links davon einige gedruckte Zeichen stehen. Wir lassen nur sie, sammeln in einer Zeile.
Wir erhalten die folgende Zeile:
int main(){int a=4609112;int b=4669772;int c=7693947;int d=7823214;int e=6845489;int f=3434591;int g=8218739;printf("%s%s%s%s%s%s%s\n",&a,&b,&c,&d,&e,&f,&g);}
Wir führen diesen Code in C aus , als Ergebnis erhalten wir ein Flag. Wir überprüfen den Hash, um noch einmal sicherzustellen - ja, dies ist das gewünschte Flag.
XT_TASK_102Schritt 1Öffnen Sie das Archiv und sehen Sie sofort die Dateinamen im Hex. Dateiinhalt nicht verfügbar, da Kennwort erforderlich ist. Beginnen wir mit dem Verdrehen der Namen.
Alle Namen sind gleich lang, mit Ausnahme einer Datei mit der Erweiterung 64F00000 (sie ist kürzer). Im Allgemeinen sind Erweiterungen seltsam und untypisch. Es ist jedoch leicht zu erkennen, dass alle Dateien unterschiedliche Erweiterungslängen haben und zwischen 1 und 7 liegen. Der Name mit der längsten Erweiterung ist der kürzeste. Es ist logisch anzunehmen, dass Sie alle Hex-Sequenzen entsprechend der Länge der Dateierweiterungen kombinieren müssen.
Wir speichern die Folge von Bytes separat und verstehen, dass dies ein 7z-Archiv ist, da die ersten beiden Bytes (0x37 0x7a - 7z).
Schritt 2Das zweite Archiv ist wieder passwortgeschützt, aber diesmal haben wir kurze Dateinamen und kleine Dateiinhalte. Es ist gut, dass der Archiv-Viewer Dateimetadaten anzeigt, nämlich deren Prüfsummen.
Trotz der Tatsache, dass crc ziemlich schlecht gegoogelt ist, können Sie immer noch alle Sequenzen überprüfen und feststellen, dass es auf Anfrage von crc 90c1667d immer noch einen Prototyp von „vier“ gibt. Oder bruten Sie einfach eine Drei-Byte-Sequenz für die kürzesten Dateien. Jede der Methoden führte dazu, dass der Inhalt der Dateien leicht installiert werden konnte - dies waren die englischen Ziffern „eins“, „zwei“, „drei“, „vier“, „fünf“ und „sechs“. Wir haben keine andere Wahl, als die Dateinamen in dieser Reihenfolge zu verbinden. Wir bekommen VVNFIENSQzMy. Wir überprüfen als Passwort das erste Archiv - es passt.
Schritt 3Das Beobachten von Lösern, noch vor dem Kennwort, konnte feststellen, dass crc32 aus den Archivdateien eine ziemlich spezifische Form hat, nämlich 0xC0DExxxx. Es gibt keine solchen Übereinstimmungen in CTFs.
Die Dateien selbst sind PNG-Bilder mit Text. Da wir bei jedem Schritt crc32 in Betracht gezogen haben, lohnt es sich, dies fortzusetzen. Nachdem Sie den ersten Text aus dem Bild überprüft haben (z. B. qnGyaQBc), wird klar, dass wir auf dem richtigen Weg sind, da crc32 0xc0de0831 ist. Wir betrachten crc von allem, was noch übrig ist, und sammeln es auf einem Haufen.
CRC aus Bildern:
0xc0de094e
0xc0de054e
0xc0de0d7d
0xc0de0343
0xc0de0b52
0xc0de0734
0xc0de0154
CRC aus Text:
0xc0de0831
0xc0de0430
0xc0de0c35
0xc0de027b
0xc0de0a33
0xc0de0654
0xc0de0058
Wir werfen den gemeinsamen Teil weg, wir sehen, dass aus dem Wert des ersten Bytes der beiden Läufe von 0x00 bis 0x0d. Es sieht aus wie es eine Seriennummer ist. Wir sammeln, wir erhalten eine Flagge. Wir überprüfen sha1 und stellen zusätzlich sicher, dass alles korrekt ist.
XT_QUEST_103list1Gegeben eine Folge von Zahlen. Wir nehmen einfach die Zeichen mit den angegebenen Zahlen von der Karte, nummerieren von Grund auf neu und überspringen Zeilenumbrüche. Es ist sinnvoll, diese Aktion zu skripten - sie wird mehr als einmal benötigt.
Antwort: awEs0me_sTart
list2Viele Zahlen. Der Name der Datei legt nahe, dass Sie die Anzahl der Ziffern kennen müssen. 5. Wir zählen nicht nur die Anzahl der fünf, sondern im Allgemeinen alle Ziffern von 0 bis 7. Wir erhalten die Reihenfolge: 135, 95, 61, 27, 58, 57, 85, 190. Wir legen die Karte auf, Wir bekommen die Antwort.
Antwort: b1g_sTEp
list3Wir sehen ein Bild mit einem Polynom. Wir ersetzen n von Null durch 9, da wir den Dateinamen angeben, erhalten wir eine Sequenz, die, wenn sie auf die Karte gelegt wird, eine Antwort gibt.
Antwort: coOl2math!
list4Seltsamer Dateiname und seltsamer Inhalt. Wenn Sie fdhvdu googeln, finden Sie unter den irrelevanten Ergebnissen einen Hinweis darauf, dass dieses von Caesars Chiffre codierte Wort Caesar eine alphabetische Verschiebung von 3 Zeichen ist. Nachdem wir den Inhalt entschlüsselt haben, sehen wir römische Zahlen. Ich denke, es ist klar, was mit einer Folge von Zahlen zu tun ist.
Antwort: dOinG_w3ll
list5Der Inhalt der Aufgabe sagt buchstäblich selbst, was zu tun ist. Hash die Datei, wir erhalten 20 Bytes, die als eine Folge von Zahlen für die Karte interpretiert werden können.
Antwort: exceLlenT_impECc4ble
visual1Wir überlagern den Aufgabentext mit dem Kartentext und „überlagern“ ihn im wörtlichen Sinne.
Antwort: fa5t! Eins
visual2Der Text des Problems enthält 840 Nullen und Einsen. Da das Thema visuell ist, versuchen wir, eine visuelle Darstellung zu erhalten. Wenn der Text in 5 Zeilen mit jeweils 168 Zeichen unterteilt ist, können Sie die Reihenfolge sehen, die zur Antwort führt.

Antwort:
go_fUrth6r visual3Der Dateiname sagt ganz direkt über Dominosteine aus. Wir versuchen, die Sechskantknöchel zu verbinden und zwei Ketten zu bekommen. Einer ist kreisförmig und nicht interessant, der zweite kann als Folge von Zahlen für eine Karte betrachtet werden. Das Ergebnis ist entweder eine Antwort oder eine Antwort in umgekehrter Reihenfolge.
Antwort: heRoic_effOr7s
visual4Wir erhalten sechzehn Hexadezimalzahlen, in denen es eindeutig viele Biteinheiten gibt. Wir übersetzen die Zahlen mit einem Taschenrechner und "verhängen" wieder wörtlich. Bit-Nullen markieren die gewünschten Zeichen. Wir lesen die Symbole von oben nach unten, von links nach rechts.
Antwort: ih8BiTs!
visual5Der Dateiname gibt wieder einen Hinweis. "B3s23" ist die Bezeichnung der Konfiguration für das Spielleben. Wir nehmen einen Online-Simulator, geben den ursprünglichen Speicherort ein, warten auf fünf Züge und lesen die Anzahl der lebenden Zellen in den Zeilen (was Sie tun müssen, sagt nur noch den Dateinamen).
Antwort: jUsT_9ood
prog1Im Text des Problems sehen wir so etwas wie eine zweidimensionale Turing-Maschine, die nur gemacht werden muss.
Antwort: k1l0_Byte
prog2Die Aufgabe stellt explizit den Code für Brainfuck bereit. Wenn Sie ihn jedoch auf dem Emulator ausführen, zeigt das Programm die Meldung an, dass es sich bei der Aufgabe nicht um Brainfuck handelt. Ja, Sie müssen nur die Anzahl der Zeichen in jeder Zeile berechnen und auf die Karte anwenden.
Antwort: l1kEl1On!
prog3Wieder Brainfuck, aber diesmal stimmt die Schlussfolgerung mit uns überein. Die gewünschte Reihenfolge für die Karte liegt im Speicher.
Antwort: moRe_1nfO2me
prog4Und dann Brainfuck. Wir starten und das Programm zeigt uns eine Meldung an, dass kein Passwort vorhanden ist. Auch im Gedächtnis nichts Interessantes. Muss den Code verstehen.
Der Code besteht aus drei Zeilen. Der erste legt einige Werte fest, der zweite und der dritte zeigen den Speicherstatus auf dem Bildschirm an.
Wir entfernen die zweite Zeile, laufen und erhalten die Sequenz für die Karte.
Antwort: nO_baRr13rs
prog5Die letzte Aufgabe. Wieder Brainfuck-Code. Wir sehen einen Hinweis darauf, dass wir eine Funktion aus einer Zeile der Karte und des Codes berechnen müssen. Wir führen den Code aus, der einen Hinweis im Speicher hinterlässt, dass die gewünschte Funktion base64 decodiert. Wir überprüfen die Linien der Karte auf das, was passieren wird, wenn sie von base64 dekodiert werden. Plötzlich wird die Zeichenfolge KysrWz4rPis8PC1d in +++ [> +> + << -] dekodiert. Wir führen den Code mit diesem Zusatz aus und sehen die Anweisung, alle Zeichen in jede Zeile der Karte zu sticken. Das Ergebnis ist das letzte Passwort.
Antwort: ofF1ci4l! SuCceSs
Das ist alles. An alle, die teilgenommen haben - danke, wenn Sie Fragen haben, stellen Sie sie in den Kommentaren.