Czas trwania:
36 minut (opublikowano 2009-10-28)
Credits:
Autor: Gynvael Coldwind
Intro: Sebastian "Xa" Rosik (grafika) i Samlis Coldwind (dźwięk)
Dodatkowe konsultacje: Icewall
Opis:
Odcinek szósty, w którym poruszam problematykę lokalizacji OEP (oryginalnego punktu wejścia) oraz omawiam kolejne narzędzia do wykonywania zrzutów pamięci.
Linki do video:
- UW-Team.org (flash player/download)
- Vimeo (flash player/download)
Materiały:
- Slajdy - slajdy użyte w videoarcie
- Lista ćwiczeń - lista ćwiczeń dla osób zainteresowanych; rozwiązania można wysyłać mi na e-mail (potem zrobię do tego odpowiedni panelik), w celu weryfikacji/pochwalenia się/innym (e-mail: michael MAŁPA hispasec KROPKA com); gdybym nie wysłał potwierdzenia odbioru w ciągu 5 dni, proszę o przypomnienie / kontakt w celu sprawdzenia co się stało
- TotalDump/HiperDump/TraceDump - autorskie narzędzia użyte w niniejszym odcinku, wraz z kodem źródłowym (raczej niestarannie napisanym ;>)
Informacje uzupełniające:
Istnieje jeszcze jedna ciekawa metoda (thx Bartek), o której nie powiedziałem w odcinku, a o której należy wspomnieć. Nie przedłużając, metoda polega na wykonaniu zrzutu obrazu PE nie szukając OEP (czyli w dowolnym momencie po rozpakowaniu, np. przy okazji jakiegoś breakpointu, lub przed zakończeniem procesu), a następnie przeskanowaniu dump'a na występowanie sygnatury (za równo jako binarnego wzorca, jak i charakterystycznego kodu czy sekwencji mnemoników) jakiegoś popularnego kompilatora (Delphi / Microsoft Visual C++ / MinGW GCC / etc). Gdy znaleźliśmy prolog, wystarczy odpalić aplikację jeszcze raz, ustawić hardware breakpoint na znaleziony OEP (oczywiście pierwsza instrukcja prologu to OEP), ponownie wykonać zrzut i jesteśmy w domu. Jak można się domyślić, metoda nie zadziała jeśli aplikacja skompilowana została z jakimś niestandardowym prologiem lub prolog uległ zmianie. W takim wypadku pozostaje jeszcze możliwość zbudowania drzewa cross-refów, i poszukanie funkcji leżącej na samej górze drzewa, czyli właśnie prologa.
Zostało jeszcze jedno pytanie: skąd wziąć sygnatury? Z tego co pamiętam, IDA Pro w wersji komercyjnej zawiera sporo sygnatur m.in. prologów, i prawdopodobnie automatycznie znajdzie prolog (kwestia tylko jak ów prolog nazwie - zachęcam do testów). Ewentualnie zachęcam do stworzenia własnych narzędzi wyszukujących sygnatury i stworzenia własnej kolekcji sygnatur - na pewno będzie to pouczające i przydatne doświadczenie. Pamiętajcie jednak ze różne przełączniki zastosowane podczas kompilacji mogą powodować tworzenie się różnych prologów.
Materiały o których wspominam w odcinku:
Zostało jeszcze jedno pytanie: skąd wziąć sygnatury? Z tego co pamiętam, IDA Pro w wersji komercyjnej zawiera sporo sygnatur m.in. prologów, i prawdopodobnie automatycznie znajdzie prolog (kwestia tylko jak ów prolog nazwie - zachęcam do testów). Ewentualnie zachęcam do stworzenia własnych narzędzi wyszukujących sygnatury i stworzenia własnej kolekcji sygnatur - na pewno będzie to pouczające i przydatne doświadczenie. Pamiętajcie jednak ze różne przełączniki zastosowane podczas kompilacji mogą powodować tworzenie się różnych prologów.
Materiały o których wspominam w odcinku:
- Hump-and-dump: efficient generic unpacking using an ordered address execution histogram (by Li Sun, Tim Ebringer, Serdar Boztas) - dokument opisujący ostatnią technikę wyszukiwania OEP o której wspominałem w odcinku
Użyte narzędzia:
- TraceHook v0.0.2 - narzędzie stworzone przez j00ru, do wykonywania pełnych zrzutów pamięci procesu w momencie jego zakończenia
- Ent - aplikacja do pomiaru entropii pliku
- OllyDbg 1.10 - trochę już podstarzały, ale nadal dający radę, darmowy debugger pod Windowsa
- Immunity Debugger - tego co prawda nie używałem, ale jest to godny polecenia debugger oparty o silnik OllyDbg
- IDA Pro - najlepszy istniejący interaktywny disassembler (również w wersji freeware, niestety jest to starsza edycja)
- Total Commander - świetny i bardzo wygodny menadżer plików pod systemy z rodziny Windows

