ESET vs ME
Na tegorocznej edycji konferencji CONFidence 2009 ukazało się CrackMe przygotowane przez dzielnych pracowników polskiego oddziału firmy antywirusowej ESET.
Jako, że nie uczeszczam na tego typu zloty, dowiedziałem się o tym CrackMe ze wpisu na blogu Gynvaela, który opisał metodę jego złamania.
Zachęcony usunięciem moich negatywnych komentarzy z blogu Gynvaela, dotyczących metod zabezpieczeń zastosowanych w CrackMe, postanowiłem w ramach rozrywki i jednocześnie zemsty za cenzurę, opublikować moją analizę i jednocześnie dekompilację CrackMe.
Opis ogólny
CrackMe zostało stworzone w assemblerze pod MASMem w wersji 5 (czyli dość starej), celem jest odnalezienie właściwego hasła (samego, bez pary name/serial).
Użyte zabezpieczenia
Największym zabezpieczeniem CrackMe jest jego niekompatybilność ze wszystkimi innymi wersjami systemu Windows oprócz Windows XP. Na starszych wersjach systemu Windows nawet nie ma co go odpalać (brak mechanizmu obsługującego TLS Callbacks), Windows 2000 wisi, a na nowszych występuje problem z prawami administracyjnymi. Ale może od początku.
Dodatkowym zabezpieczeniem są debug messages, które zostawił programista (zapewne dla zmyłki), choć jak czytam na blogu Gyna, po prostu ich chłopaczyna zapomniał usunąć — biedne, zagubione dziecko.
TLS Callbacks
CrackMe po uruchomieniu wykorzystuje funkcje TLS Callbacks do pobrania adresów swoich funkcji API. Są one wywoływane przez loadera Windows przed wejśćiem w entrypoint, mechanizm ten jest wykorzystywany m.in. przez protektor ExeCryptor. Adresy funkcji API (tylko z biblioteki KERNEL32.dll) pobierane są poprzez liczenie sum kontrolnych wszystkich eksportowanych funkcji z KERNEL32.dll i porównywanie ich z zapisanymi sumami funkcji wykorzystywanych przez CrackMe.
Procedura obliczająca sumę kontrolną wydała mi się na tyle charakterystyczna, że od razu pomyślałem, żeby sprawdzić z jakiego wirusa została podprowadzona przez sprytnego kodera ESET. Po krótkim poszukiwaniu wśród archiwów magazynów virii, poniżej przedstawiam procedurę z CrackMe oraz 2 procedury CRC32 autorstwa Vecny, znanego twórcy wirusów z grupy 29A:
Zmieniona została jedynie wartość inicjalizacyjna CRC_POLY. Wnioski co do korzystania z kodów wirusów w CrackMe firmy antywirusowej pozostawiam czytelnikom.
Tracer
Po pobraniu adresów funkcji API, CrackMe uruchamia kopię swojego procesu w trybie debug (na wzór protektora Armadillo) i oczekuje na wyjątek.
Sprawdzanie hasła
Uruchomienie kopii swojego procesu w trybie debug wykorzystywane jest w procedurze sprawdzającej hasło, gdzie wpisany tekst jest szyfrowany a następnie porównywany z zaszyfrowanym wzorem poprawnego hasła.
Tutaj wchodzi do gry 2 kopia procesu, w pętli debugującej oczekuje na wyjątek. Procedura szyfrowania wpisanego hasła, przed przystąpieniem do samego szyfrowania ustawia flagę TRAP FLAG w rejestrze flag (używając instrukcji:
pushfd ; zapamiętaj stan flag na stosie
xor dword ptr ds:[esp], 100000000b ; ustaw flagę TRAP
popfd ; przywróć stan flag ze stosu
Ustawienie flagi TRAP FLAG sprawi, że wykonanie każdej następnej instrukcji spowoduję wyjątek single step exception (EXCEPTION_SINGLE_STEP) i kontrola zostanie przekazana do pętli debugującej.
O co w tym chodzi? Szyfrowanie wpisanego hasła wykorzystuje serię instrukcji ADD, SUB, XOR i LEA. Jednak przy ustawionej fladze śledzenia krokowego, przed wykonaniem kolejnych instrukcji szyfrujących, kontrola przekazywana jest do pętli debugującej, która sprawdza jaka ma być aktualnie wykonana instrukcja szyfrująca i w zależności co to będzie, dodatkowo modyfikuje wartość przed zaszyfrowaniem.
Wykrywane są 3 rodzaje instrukcji szyfrujących i przed ich wykonaniem modyfikowany jest rejestr EAX (w którym znajduje się fragment wpisanego hasła):
- XOR EAX, IMM32 -> EAX = EAX – 2
- SUB EAX,IMM32 -> EAX = EAX + 1
- ADD EAX,IMM32 -> EAX = EAX ^ 0x10101010
Cała pętla szyfrująca jest na bieżąco śledzona przez drugą kopię programu (cały czas odświeżana jest flaga TRAP FLAG), aż do momentu napotkania specjalnego markera (4 x NOP), który przerywa proces śledzenia, co oznacza, że całe hasło zostało zaszyfrowane, po czym jest porównywane z wzorcem oczekiwanego hasła i na tej podstawie stwierdzana jest jego poprawność.
Odtworzenie poprawnego hasła wymaga odwrócenia kolejności instrukcji szyfrujących oraz dodania dodatkowych instrukcji modyfikujących stan rejestru EAX (symulacja pętli debugującej), całość klepnąłem w PHP i jest dostępna na końcu.
Poprawne hasło to „You talkin’ to me?”.
Bug
CrackMe posiada również buga (feature?), który dzięki sprytnym panom z Microsoft jest poprawnie rozpoznawany przez Windows i nie powoduje zwiechy:
Dekompilacja
Dekompilacja crackme + dekoder i oryginalne 2 wersje crackme:
eset_crackme.zip (102 kB)
Fin
Wklepując w google frazę „ESET Polska” wyskakuje m.in. strona zapowiadająca:
ESET w Polsce: zatrudnimy wszystkich najlepszych specjalistów
Jeśli u was rzeczywiście pracują sami najlepsi, to czy całą resztę macie za idiotów?
PS.
I jeszcze krótka wiadomość dla panów z ESET, którzy odgrażali się, że zrobią mi CrackMe z jakimś RSA64 i zakazem patchowania:
Jak widzicie, takie mózgi jak wy zjadam na śniadanie 😛
;>>>
Nie cenzura a moderowanie btw ;D
Brawo!
@gyn: jakbys nie ozenzurowal to bym nawet tego nie pisal, bo by mi sie nie chcialo :), jak mozna byc tak neutralnym, juz bym bardziej sie cieszyl jakbys mnie tam pojechal w komentach, ze np. przegialem
@oakap: thnx dude, dawno sie nie widzielismy 😉
chlopcy z esetu pewno teraz zamiast klepania sygnaturek, klepia dla mnie jakies hardcorowe cm w swoim research center hehe, zdrowko chopcy 🙂
@bartek
Hehehe ja tam nie żałuje żeś to stworzył, ten obrazek jest przezabawny ;>>>
no tak, bez tutka gyna to chyba bys rady nie dal ? nie ziom ?
moze bys wydal wersje 2.0 swojego crackme pozbawiona bugow do usuwania plikow 😉
„ty jestes rodem z piekla, a ja jestem rodem z nieba, nic wiecej nie potrzeba, nic wiecej nam nie potrzeba”
no ziom, bez tutka gyna bym zginal w bezkresie tegoz skomplikowanego kodu! zdemaskowales mnie, czuje sie nagi…
zapomniales ze uzywasz prawie identycznej sumy kontrolnej w pelocku? dla przypomnienia bo srednio z twoja pamiecia (kod pelocka)
00390370 push esi
00390371 push ecx
00390372 mov esi,eax
00390374 or ecx,0FFFFFFFFh
00390377 mov al,byte ptr [esi]
00390379 inc esi
0039037a test al,al
0039037c je 00390392
0039037e xor cl,al
00390380 mov al,8
00390382 shr ecx,1
00390384 jae 0039038c
00390386 xor ecx,0EDB88320h
0039038c dec al
0039038e jne 00390382
00390390 jmp 00390377
00390392 mov eax,ecx
00390394 pop ecx
00390395 pop esi
00390396 ret
musiales sie bardzo nudzic zeby zabierac sie za to crackme dla poczatkujacych
to prawda, korzystam z wielu kodow zrodlowych, rowniez tych z wirusow, ale ja NIE PRACUJE w firmie antywirusowej, ktora walczy z tymi wirusami, a potem korzysta z ich kodu zrodlowego we wlasnych produkcjach…
bartek na RE znasz sie jak malo kto, ale wiekszego hipokryty od ciebie to nie znam:D pojechales po tym ziaku co to crackme pisal brakowale tylko zebys wspomnial ze pewnie miala dziadek z wehrmachtu. To tylko kawalek crackme z logo ESETu, a ty sie zachowujesz, jakby ziomek krzywdzil twoja matke. Z tego co wiem to w polskim odziale eset’u jest paru gosci co jakby ci zrobili crackme to z ta twoja dwoja maturalna z maty bys nawet z miejsca nie ruszyl ale nie ma to jak „dowalic malemu” i rozwalic crackme xor, add, sub;)
nie wiem czy czytales moj komentarz na blogu gyna (zanim go usunal), pisalem w nim wlasnie o niskim poziomie cm i pytalem czy pisal je jakis koles, ktory ma 60 lat i ostatnie co czytal to tutoriale z oscara
skoro faktycznie w tym ESET pracuja tacy zdolni ludzie, to dlaczego serwuja taki slaby kod, byle tylko sie pokazac?
czytalem twoje komentarze zanim gyn je usunol.
A slaby poziom crackme bo jak pisal ktos z esetu crackme mialo byc na pare godzin(chcociaz jak ktos mial skonfigurowane swoje narzedzia to chyba ponizej 1h by to zrobil). Zaserwowali slaby kod bo malo kto by siedzial nad czyms wiekszym bez odpowiedniej motywacji, moze nie kazdy mial IDA, a do tego sam debugger wystarczyl. Gyn prowadzi tutoriale(szkole) dla poczatkujacych wiec rozumie jego text ale zeby ktos taki jak ty pisal o crackme add, sub, xor chyba ostatni raz taki text to 10 lat temu napisales. Pewnie jacys slabi ludzie pracuja w ESET ale nie wrzucaj wszystkich do jednego worka.
Zbys: usunął****
to z nerwow urmel, wedlug niepotwierdzonych informacji to jakis pracownik eset (albo jego dziadek z wermachtu) 🙂
@ bartek
Smacznego śniadanka!
To w końcu rozumiem dlaczego niektórzy pracownicy polskiego Eset już nie posiadają tego organu;) A może to tylko straszny pech w obstawianiu stanowisk asystenckich???
PS.
A poziom analityków jest wprost proporcjonalny do poziomu zainteresowania tą posadką, więc nie ma się co dziwić, że na bezrybiu i rak ryba…
polityka i branża IT ma, widać, wiele wspólnego.
w obu przypadkach często dochodzi do polemiki, czasem nawet ostrej, czasami do większych flejmów.
ostatnio nie lubię tego.
to zapisz sie na kurs kitesurfingu 😉
Ale masz brzydką ceratę 😛
lol moja cerata zdissowana przez pracownika Comarchu :P, nie wiedzialem, ze programoboty Comarchu interesuja sie takimi tematami, chcecie mi zrobic crackme?