Reverse Engineering

Prowadzący

Michał Kowalczyk

Opis

Na warsztatach zajmiemy się reverse engineeringiem kodu (inżynierią wsteczną aplikacji). Jest to analiza skompilowanego kodu programu w celu zbadania jego funkcjonalności/rekonstrukcji kodu źródłowego. Głównym celem warsztatów będzie analiza jakiegoś wirusa/malware'u (którego będziemy testować na wirtualnej maszynie), czyli m.in dokładne określenie jego zachowania - gdzie i co zapisuje, które części systemu operacyjnego modyfikuje, jeśli zbiera dane - to jakie i gdzie je wysyła. Będziemy pracować na Windowsie, preferowany XP/7.

Podstawowych problemem w reverse engineeringu jest brak kodu źródłowego, dostępny mamy jedynie skompilowany kod programu, czyli kod maszynowy. Jest on zapisany zazwyczaj w plikach PE (np .exe, Windows) oraz ELF (linux). Nauczymy się efektywnie go analizować oraz wyciągnąć z niego tyle informacji, ile to możliwe.

Program zajęć

1. dzień:
- Budowa pliku PE 32 (czyli 32 bitowy plik .exe)
- Jak wygląda ładowanie exeków przez system, jak działa pamięć wirtalna itp.
- Omówienie narzędzi używanych do analizy plików binarnych/wykonywalnych(np .exe) - ollydbg, IDA, hexplorer, PEInfo, PEView i wiele innych
- Ogólnie jak podchodzić do analizy programów, rozwiązywanie prostych zadań crackme

2. dzień:
- Zabezpieczenia anti-debug itp. w programach (np. wykrywanie czy proces jest debugowany, utrudnianie analizy kodu) oraz jak ominąć, bardzo ważne w przypadku wirusów, które często są zabezpieczone przed analizą.
- Łamanie kolejnych crackme oraz keygenme
- Radzenie sobie z packerami oraz protektorami, kilka podstawowych metod oraz przykładów

3. dzień:
- Analiza wirusa który dam uczestnikom (będzie prawdziwy i mam nadzieję że ciekawy ;) )

Lista programów (razem z linkami) które warto było by zainstalować przed warsztatami (ale w razie czego przyniosę zestaw instalek):
- Ollydbg 2.01 alpha 4
- IDA pro free 5.0 (w razie jakby link nie działał: klik)
- Hexplorer
- PEInfo
- PEView
- PEiD
- ImpRec
- ProcMon
- VirtualBox - zainstalujcie na nim XP, w ostateczności win7

Wymagania

- Znajomość assemblera x86 na poziomie umożliwiającym czytanie i rozumienie kodu (przygotują do tego zadania kwalifikacyjne)
- Znajomość C i C++
- Jako taka znajomość i ogarnianie Windowsa
- Pomysłowość
- Mile widziana wiedza o budowie systemów operacyjnych ;)

Zadania kwalifikacyjne

1. Obrazek (1 pkt)
Pliki: http://securitytraps.no-ip.pl/ImageReader1.rar
Pod tym linkiem znajduje się program otwierający obrazki w formacie .img1 (jest to format wymyślony na potrzeby tego zadania ;) ) oraz przykładowy obrazek.
Twoje zadanie polega na wysłaniu mi tego obrazka, tylko do góry nogami, tak by załączony program go poprawnie wyświetlił.
Do rozwiązania nie jest potrzebna analiza kodu programu. Wystarczy przyjrzeć się danym w pliku i pokminić czym są ;)
W razie problemów polecam poczytać o różnych prawdziwych formatach plików, np BMP.

2. Obrazek v2 (2 pkt)
Pliki: http://securitytraps.no-ip.pl/ImageReader2.rar
Trudniejsza wersja poprzedniego zadania. Polecam przyjrzeć się programowi, ale niekoniecznie pod kątem kodu ;)

W razie problemów z uruchomieniem tych programów zainstalujcie Microsoft Visual C++ 2010 Redistributable Package

3. Funkcja (1 pkt)
Napisz odpowiednik tej funkcji napisanej w assemblerze w C++ (im bardziej uprościsz kod, tym lepiej - ta funkcja liczy coś konkretnego, tylko trochę "na około"):

mov eax, [esp+4]
mov ecx, [esp+8]
and eax, ecx
not eax
mov edx, [esp+4]
not edx
not ecx
and edx, ecx
sub eax, edx
retn

//thx dla Mawekla, za pomysł ;)

4. Crackme (2 pkt)
Twoje zadanie polega na napisaniu programu, który wczytuje hasło i sprawdza czy jest poprawne. Jeśli tak, to wypisuje jakiś tajny tekst, jeśli nie to coś w stylu "złe hasło". Moje zadanie polega na znalezieniu/odtworzeniu tego tajnego tekstu ;) Jako rozwiązanie wyślij tylko plik .exe.
Twoim zadaniem jest tak napisać ten program, by:
- Istniało poprawne hasło, które program akceptuje i wypisuje tajną wiadomość
- Nie było możliwe odzyskanie tajnej wiadomości bez znajomości hasła
- Hasła nie dało się odtworzyć (nie licząc brute-force, dlatego polecam hasła dłuższe niż np 6 znaków)
- Program nie może używać danych zewnętrznych (łączyć się z internetem itp)
- Nie może być klucza, który daje inną wiadomość niż te dwie (tajny tekst i "błędne hasło")
Punktacja:
1 pkt - zabezpieczenie będzie sensowne
2 pkt - nie będzie się dało złamać, lub po prosu mi się to nie uda ;)
Uwaga:
Zadanie da się rozwiązać, bez jakiś strasznie wyszukanych pomysłów, tak by odtworzenie wiadomości nie było możliwe.

Materiały pomocnicze (właściwie to obowiązkowe, jeśli masz problemy z zadaniami kwalifikacyjnymi)

Seria Reverse Craft: http://re.coldwind.pl/
Zestaw bardzo dobrych video-tutoriali o RE, w dodatku po polsku ;)
Dla nieznających asma:
- W powyższej serii są też odcinki o asmie.
- http://4programmers.net/Assembler/Instrukcje_procesor%C3%B3w_8086-Pentium - opisy sporej części instrukcji asma x86 (jak działają)
- Jak nie wystarczy, to poszukajcie jakiś kursów asma (chociaż niestety większość jest o asmie 16 bitowym)

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License