Ich habe das Programm der
Check Point Security Academy auf Habré mehrmals erwähnt: Das Wesentliche ist, dass das Unternehmen
Check Point im Sommer einen Wettbewerb im Format Capture the Flag angekündigt hat, bei dem die Erfahrungen des Teilnehmers in der Vergangenheit nicht wichtig sind, sondern nur seine Fähigkeit, das Cyber zu enträtseln Rätsel. Basierend auf den Ergebnissen dieses Wettbewerbs rekrutierte das Unternehmen zwanzig Teilnehmer für einen dreimonatigen professionellen Kurs in Cybersicherheit. Alle Teilnehmer erhalten von Beginn des Kurses an das volle Gehalt eines Spezialisten für KB, der verpflichtet ist, zwei Jahre nach Ende des Kurses im Unternehmen zu arbeiten.
In einem CTF-Wettbewerb kann eine Flagge sogar ein Bild wie dieses sein.Die Auswahl der Teilnehmer wurde im August abgeschlossen, aber die Website des Wettbewerbs wird bis zum nächsten Sommer weiter funktionieren, und ich lade diejenigen ein, die sich registrieren und sich aus sportlichen Gründen versuchen möchten. Der Wettbewerb besteht aus 12 Puzzles unterschiedlicher Komplexität mit einer Bewertung von 10 bis 150 Punkten.
Hier möchte ich das Puzzle "Test My Patience" aus der Kategorie "Surprise" analysieren. Sie hat einen mittleren Schwierigkeitsgrad (50 Punkte) und hier ist ihr vollständiger Text:
Hallo zusammen
Wir haben diese ausführbare Datei auf dem Computer des lokalen Uhrmachers gefunden.
Es wird gemunkelt, dass der Uhrmacher irgendwie die einzige Person war, die es geschafft hat, es zu knacken.
Denken Sie, Sie sind so gut wie der Uhrmacher?
Hinweis: Diese Datei ist in keiner Weise schädlich
Als Referenz - eine 32-Bit-Binärdatei für Windows, auf die
einige Virenschutzprogramme schwören , aber wenn Sie sie noch ausführen, sieht sie folgendermaßen aus:

Innerhalb der Binärdatei ist verschlüsselt; Es weigert sich, unter dem Debugger zu laufen; Wenn Sie versuchen, einen Debugger während der Ausführung mit ihm zu verbinden, wird er sofort beendet. Wahrscheinlich haben Spezialisten von Check Point ihr Puzzle in einen Kryptopacker gewickelt, der von einer Art Malvari entlehnt wurde.
Wie werden wir die Zahl des Uhrmachers erraten?
Es gibt zwei Möglichkeiten. Das erste kann bedingt als "es gibt Macht, kein Verstand" bezeichnet werden: Wenn das Programm nicht live debuggt werden kann, werden wir das tote debuggen!
Starten Sie den 32-Bit-Task-Manager (\ Windows \ SysWOW64 \ taskmgr.exe), klicken Sie mit der rechten Maustaste auf den mysteriösen Prozess und wählen Sie Dump-Datei erstellen. (Der 64-Bit-Task-Manager für 32-Bit-Prozesse erstellt einen Speicherauszug des wow64cpu-Emulators, mit dem schwieriger zu arbeiten ist.)
Wir schauen in den Dump und sehen, dass zumindest die darin enthaltenen Zeilen bereits entschlüsselt sind:

Die Linien mit der versteckten Nummer oder der Flagge sind jedoch noch nicht sichtbar.
Wir wenden uns der Waffe des Hauptkalibers zu: WinDbg (X86) -> Open Crash Dump ...

Wo im Gedächtnis ist die Zeile, die wir sehen wollen, gedruckt - "Gute Arbeit, mein Freund!"?
Mit dem Befehl
lm
können Sie feststellen, dass die Binärdatei von
01140000
bis
015b2000
geladen ist. dann
sa 01140000 015b2000 "Good job my friend!"
findet die
0115a0d0
bei
0115a0d0
:

Lassen Sie uns nun herausfinden, wo diese Zeile gedruckt wird: Vielleicht enthält ein Befehl Bytes
d0 a0 15 01
, die der Adresse der
d0 a0 15 01
Zeile entsprechen. (
sb 01140000 015b2000 d0 a0 15 01
)
Viel Glück! - Ein solches Team wurde gefunden:

Wie lautet der Code für diesen Befehl? (
ub 011412f7; u 011412f7
)

Wir sehen, dass abhängig vom Ergebnis der Funktion
01141180
entweder die gewünschte Nachricht gedruckt wird oder "Falsche ..."
Der Funktionscode
01141180
belegt drei Bildschirme. Es ist ziemlich leicht zu erkennen, dass dies eine Implementierung von
strcmp()
, in der ein Aufruf von
Sleep(700)
hinzugefügt wurde. Es ist noch nicht klar, warum es
Sleep()
gibt
Sleep()
; Das Ergebnis der Funktion wird jedoch nicht beeinflusst. Daher sollten wir besser herausfinden, welche Zeichenfolgen verglichen werden:

Es werden zwei Zeiger übergeben, die
ebp-14h
und
ebp-24h
. Der zweite von ihnen wurde als
011410b0
an die Funktion
011410b0
.
Ist das nicht die Funktion, die nach der versteckten Nummer fragt? Überprüfen wir den Aufrufstapel (
k
):

Ja, sie ist es!
Das allgemeine Schema des Puzzles ist jetzt klar: Die
ebp-24h
des Benutzers wird bei
ebp-24h
gespeichert, die Zahl bei
ebp-14h
, dann werden sie verglichen und entweder "Gute Arbeit, mein Freund!" Oder "Falsche ..." gedruckt.
Alles was bleibt ist, die versteckte Nummer aus dem Stapelrahmen zu ziehen. Wir kennen sein
ebp
aus dem Call Stack:

Komm schon, komm schon ...

Erfolg! Sie können etwas Leckeres entkorken.
Drei mysteriöse Dinge blieben jedoch ohne Erklärung:
- Warum wird hier im
strcmp()
Sleep(700)
ein Aufruf zum Sleep(700)
strcmp()
? - Warum hat das Programm bei Eingabe der versteckten Nummer zehn Sekunden lang eingefroren, bevor "Gute Arbeit, mein Freund!" Gedruckt wurde?
- Was hat der Uhrmacher mit diesem Puzzle zu tun?
Es stellt sich also heraus, dass es einen zweiten - intelligenteren - Weg gibt, die erratene Zahl zu erraten. Wenn Sie nur zufällig die Zahlen 0-9 versuchen, ist es leicht zu bemerken, dass bei den Neunern das Programm ein wenig „hängt“. Wenn Sie die Nummern 90-99 ausprobieren, können Sie sehen, dass das Programm auf der Nummer 98 doppelt so lange "einfriert". (Nachdem wir den Mut aufgedeckt haben, wissen wir bereits, worum es geht: Ein erfolgreicher Vergleich jedes Zeichenpaars führt zu einer Verzögerung von 0,7 s.) Um das Rätsel zu lösen, ohne den Debugger zu starten, genügte es, jede nächste Ziffer auszuwählen, sodass die Verzögerung vor der Antwort zunahm - entweder manuell mit einer genauen Stoppuhr oder einem einfachen Skript. Daher wiesen die Compiler auf eine
langjährige Methode zum Angriff auf kryptografische Algorithmen hin , wenn die Zeit bis zur Fehlermeldung gemessen und analysiert wird.
Aber zu lernen, wie man Programme aufnimmt, die in unbekannten Kryptopackern verpackt sind, ist meiner Meinung nach sowohl interessanter als auch wertvoller :-)
Beachten Sie, dass wir nicht herausfinden mussten, wie die Binärdatei verschlüsselt ist oder wie die Zeichenfolge mit der angezeigten Nummer auf dem Stapel angezeigt wird (wir haben im Speicherauszug gesehen, dass sie nicht zu den Zeichenfolgenkonstanten gehört) - wir haben es geschafft, sowohl fertig als auch bereit zu sein, und dafür Etwa ein Dutzend WinDbg-Befehle reichten aus.