ESET crackme

ESETESET 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).

ESET crackme

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:

ESET crackme CRC32

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.

ESET crackme tracer

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

ESET crackme trapflag

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:

ESET crackme bug

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:

Zjadam was na śniadanie

Jak widzicie, takie mózgi jak wy zjadam na śniadanie 😛

Gulczas, a jak myślisz…

Wskutek ucieczki w kompletnych ciemnościach przed goniącym mnie kumplem z ketchupem i bliskim zderzeniu piszczeli z betonową doniczką jestem unieruchomiony i zmuszony do wykonywania zaległej pracy, a po pracy czas na relaks, zaglądam więc na IMDB na listę najpopularniejszych filmów kryminalnych, żeby znaleźć coś ciekawego, przewijam całą listę, a na końcu niespodzianka, polski klasyk z gwiazdami pierwszego Big Brothera.

gulczas

Zawsze wiedziałem, że z polska kinematografią jest kiepsko, ale żeby zrobić najgorszy film kryminalny NA ŚWIECIE (mimo małej liczby głosów, ale hej – inni to widzą!) to chyba trzeba się bardzo postarać 🙂

http://www.imdb.com/title/tt0314134/

TrueCrypt v6.2a

Ukazała się nowa wersja oprogramowania do szyfrowania całych dysków i tworzenia zaszyfrowanych partycji TrueCrypt v6.2a.

Zmiany to:

  • poprawiono tworzenie woluminów na maszynach mających problemy z zapisem bloków większych niż 64 KB (Windows)
  • błąd ’Device not ready’ nie będzie się więcej pojawiał po zakończeniu deszyfrowania partycji / dysku (Windows)
  • inne ulepszenia i poprawki (Windows, Mac OS X i Linux)

Strona domowa projektu — http://www.truecrypt.org

CRYPTO-GRAM 15/06/2008

Wyszedł nowy numer newslettera CRYPTO-GRAM, w którym znajdziecie:

  • Obama’s Cybersecurity Speech
  • „Lost” Puzzle in Wired Magazine
  • Last Month’s Terrorism Arrests
  • News
  • Me on Full-Body Scanners in Airports
  • Schneier News
  • The Doghouse: Net1
  • Cloud Computing
  • The Second Interdisciplinary Workshop on Security and
  • Human Behaviour
  • Comments from Readers

Dostępny online pod adresem:
https://www.schneier.com/crypto-gram-0906.html

Top 10 narzędzi do reversingu

Moja lista ulubionych i najczęściej wykorzystywanych narzędzi w reverse engineeringu.

1. HIEW

Bezapelacyjnie pierwsze miejsce. Narzędzie (w tym wypadku nie można mówić o nim jak o zwykłym hexedytorze), z którego najczęściej korzystam do edycji plików, kodu, do szybkiego odnajdywania tego co potrzeba.

Mimo konsolowego GUI jest to prawdziwy kombajn, bez którego nie wyobrażam sobie pracy w reversingu.

HIEW

http://www.hiew.ru/

2. OllyDbg

Kiedyś wpisałbym tutaj SoftICE, jednak jego lata panowania już minęły. OllyDbg mimo pewnych niedogodności względem SoftICE, godnie go zastąpił, głównie ze względu na system wtyczek, które bez wątpienia stanowią dzisiaj o sile tego debuggera (np. ODBScript, dzięki któremu można robić cuda i dzięki któremu na nowo odnalazłem radochę z pracy).

Również duża liczba zmodyfikowanych wersji OllyDbg świadczy o ogromnej rzeszy fanów tego debuggera.

OllyDbg

http://www.ollydbg.de/

3. IDA

Najlepszy deasembler na świecie, bez niego nie ma mowy o analizie plików binarnych ani prowadzenia projektu, który wymaga kilku miesięcy pracy przy modyfikacji jakiegoś oprogramowania.

Posiada wbudowany system wtyczek, język skryptowy, rozpoznawanie znanych funkcji z całej rzeszy kompilatorów i ich bibliotek oraz masę zaawansowanych funkcji ułatwiających analizę statyczną oraz dynamiczną.

IDA Pro

https://www.hex-rays.com/idapro/

4. FileMon i RegMon

Ex aequo na tym samym miejscu. Narzędzia, dzięki którym zaoszczedziłem kupę pracy przy śledzeniu działania aplikacji. Wystarczy odpalić, ustawić filtry i mamy wszystko co potrzeba, potem wystarczy znaleźć odpowiedni ciąg znaków w aplikacji, xref (you know the drill) itd.

Przy okazji nie wiem jak wy, ale do mnie zupełnie nie przemówiło zintegrowane narzędzie ProcMon.

RegMon

Linki — FileMon RegMon ProcMon

5. Hex Workshop

To czego nie ma HIEW ma Hex Workshop, główną zaletą Hex Workshop jest praca na wielu plikach, co znacznie ułatwia kopiowanie danych z jednego pliku do drugiego, porównywanie binarne plików.

Dodatkowe funkcje umilające życie to m.in. wbudowane hashowanie, przeglądanie zdefiniowanych struktur danych. Bardziej rozbudowanym hexedytorem, który mógłby zastąpić Hex Workshop w mojej bazie narzędzi jest WinHex, jednak zawsze był dla mnie zbyt toporny, aby stał się narzędziem, które klikam w pierwszej kolejności.

Hex Workshop

http://www.hexworkshop.com/

6. LordPE

Process viewer i dumper, który mimo już swojego zaawansowanego wieku, nadal jest przydatnym narzędziem, które umożliwia szybki zrzut pamięci wybranego procesu (oraz jego pamięci wirtualnej), odbudowę uszkodzonych struktur plików PE czy też szybką edycję flag sekcji exeków.

LordPE

LordPE

7. Universal Extractor i MultiExtractor

Czasami zdarza się, że trzeba rozpakować pliki instalatora, albo z binarki wyciągnąć wszystkie jego zasoby, te 2 narzędzia pozwalają sprawnie i szybko rozpakować wszystkie rodzaje instalatorów stosowane w dystrybucji oprogramowania oraz wyciągnąć chyba wszystkie multimedialne formaty plików ukryte w innych plikach binarnych.

Universal Extractor

Universal Extractor — http://legroom.net/software/uniextract

MultiExtractor v2.80a

MultiExtractor — http://www.multiextractor.com

8. .NET Reflector i JAD

Rozwój techniki sprawił, że nie da się już przejść obojętnie obok aplikacji .NET oraz tych w Javie, dlatego te 2 narzędzia prędzej czy później wylądują u każdego, kto zajmuje się reversingiem.

.NET Reflector

.NET Reflector — http://www.red-gate.com/products/reflector/
JAD — http://www.varaneckas.com/jad

9. eXeScope

Prosty i szybki viewer zasobów plików wykonywalnych, mimo, że są już zdecydowanie lepsze narzędzia (jak np. te wbudowane w Visual Studio), eXeScope przydaje się gdy trzeba szybko znaleźć coś w zasobach.

eXeScope

eXeScope

10. ImpREC

Narzędzie, bez którego nie obejdzie się żaden unpacking, w pewnym momencie i tak się przyda 🙂

ImpREC

ImpREC

Gdzie szukać innych narzędzi?

Jeśli szukasz narzędzi, odwiedź te strony:

Wykop wpis Zagłosuj na ten wpis na Wykopie