Analiza FentCat's c/c++ Crackme

Spróbujmy rozłożyć na czynniki pierwsze takie oto CrackMe:

https://crackmes.one/crackme/68ff622c2d267f28f69b78de

Hasło do rozpakowania pliku ZIP standardowe, jak dla wszystkich CrackMe z crackmes.one 😉

Najpierw zobaczmy co to właściwie jest. Uruchamiam Detect It Easy i otwieram plik. 

zrzut ekranu 20251119 180444

Po „File type: PE64” widzę, że jest to aplikacja 64-bitowa, więc będziemy używać x64dbg. Zgodnie z nazwą CrackMe została napisana w C/C++. Jest to aplikacja konsolowa.

Zatem uruchommy plik. Pierwsza rzecz, którą zauważyłem przy testowaniu: po wpisaniu testowego kodu pojawia się wiadomość z błędem.

zrzut ekranu 20251119 180141

Zobaczmy w x64dbg, o co tutaj chodzi. Otwieram plik w debuggerze, klikam „Run”, aż dojdziemy do Entry Point. Wyszukuję „Error” w String References (Shift+D)

zrzut ekranu 20251119 181056

Przechodzę do miejsca, gdzie ten string się pojawia, scrollując wyżej, szukam początku funkcji i odpalam graf. Tutaj już coś więcej widać.

zrzut ekranu 20251119 181646

Mamy tutaj kilka funkcji, które sprawdzają obecność debuggera, ale w naszym przypadku nie jest on wykrywany, więc zupełnie je pomijam.

Dużo ciekawszy jest ten fragment:

zrzut ekranu 20251119 181945

Ten call ustawia RAX na , przez co później następuje skok do kodu wyświetlającego wiadomość z błędem. Przyjrzyjmy się temu.

zrzut ekranu 20251119 182206

Ewidentnie mamy tutaj próbę detekcji maszyn wirtualnych, a tak się składa, że w takiej uruchamiam program.

Najlepiej będzie zrobić prosty patch:

pasted file

Instrukcję JNE pod callem sprawdzającym obecność maszyny wirtualnej zamienię na NOP. Potem zpatchuję plik.

zrzut ekranu 20251119 183646

Zpatchowany plik wykonuje się poprawnie 😀 Brak jakichkolwiek błędów.

zrzut ekranu 20251119 182649

Mamy to! Teraz tylko zostało dojść do tego, jaki jest klucz… Wyszukujemy znowu String (Shift+D), ale tym razem szukamy „Enter serial key”, przełączamy na graf i analizujemy, co tu się dzieje… Ewidentnie w kilku miejscach pojawia się porównanie długości wprowadzonego ciągu znaków z (czyli 32 w systemie dziesiętnym).

zrzut ekranu 20251119 184112

Spróbujmy wprowadzić 32-znakowy kod.

Po analizie w debuggerze okazuje się, że takiej długości kod powoduje, że wykonujemy kolejne poprawne skoki (i unikamy niepoprawnych) w stronę sukcesu. Wychodzi na to, że można wprowadzić dowolny ciąg znaków o długości 32 i dostaniemy poprawną wiadomość!

zrzut ekranu 20251119 184504

Mam nadzieję, że taka krótka analiza prostego CrackMe się podobała 😀 W krótce pojawi się więcej tego typu analiz.