sie
20

Prefetch i niedokładny licznik

autor: p____h  //  ::easy::, Forensic

Nareszcie blog doczekał się wpisu, który w 100% pasuje do działu Forensic. Będzie trochę o plikach w folderze Windows/Prefetch w systemie Windows XP (na 32-bit x86). Od razu zaznaczę, że występują one również w Windows 7 oraz Vista jednak trochę się różnią (inny signature i trochę inny offset na pewne dane) w związku z tym zajmiemy się dzisiaj tylko systemem XP.

Nad samym działaniem funkcji, która wiąże się z folderem Prefetch nie ma co się rozwodzić. W folderze tym umieszczane są tymczasowe skróty z rozszerzeniem .pf. W skrócie głównym celem jest monitorowanie tego, co uruchomił użytkownik. Opiszę tylko szybko jak włączyć funkcję Prefetch (domyślnie jest ona włączona).
Szukamy w rejestrze klucza:

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SessionManager/Memory Management/PrefetchParameters

Następnie nadajemy wartość EnablePrefetcher:
0 – (disable)
1 – (launch only)
2 – (boot only)
3 – (launch&boot) – wartość domyślna
Napiszmy jakiś prosty Hello-world w naszym ulubionym, kompilowanym języku programowania i odpalmy go kilka (max 5-6) razy. Zajrzyjmy teraz do folderu Prefetch. Zauważymy, że pojawił się tam plik, którego nazwa zaczyna się tak samo jak nazwa uruchamianego programu. OK, podejrzyjmy go w hex-edytorze.

Interesować nas będą dwa offsety. 8 bajtów od 0×78 oraz 2 bajty od 0×90. Zawierają one kolejno datę ostatniego uruchomienia programu oraz licznik, który mówi ile razy program został uruchomiony. Pamiętajmy, że wszystko zapisane jest w Little Endian. Zajmijmy się na chwilkę licznikiem.

Na podstawie pliku .pf uda nam się stwierdzić ile razy program był uruchamiany. Jeśli odpalimy program 3 razy to wartość pola o offsecie 0×90 wyniesie 03; jeśli odpalimy go 10 razy, to wyniesie 0A, jeśli odpalimy go 100 razy, to wyniesie 64… chwilka! Okazuje się, że w pewnym momencie coś się posypie i to już od wartości 0A.

Okazuje się, ze licznik uruchomień programu w pliku .pf nie jest taki dokładny. Kiedy jego wartość osiągnie 0A, nie jest już on tak „chętny” do zwiększania się przy kolejnych uruchomieniach programu. Nie aktualizuje on również daty ostatniego uruchomienia programu. Widać tu pewna korelację. Jeśli pole licznika [0x90] aktualizuje się, to aktualizuje się również data ostatniego uruchomienia programu [0x78] (właściwie w tym stwierdzeniu jest nie tylko implikacja, co nawet równoważność).

Zrobiłem kilka małych testów i okazuje się, że jeśli różnica pomiędzy bieżąca datą, a datą ostatniego uruchomienia przechowywana w .pf jest mniejsza niż 2 minuty (120 sekund) to licznik nie zaktualizuje się. Także jeśli jakieś program (chociażby malware) uruchamia się wiele razy w krótkim przedziale czasu i chcielibyśmy poznać datę ostatniego z uruchomień oraz jego liczbę – to na plikach w folderze Perfetch możemy się nieźle przejechać.

Kolejna ciekawostką jest, że jeśli zmienimy datę (chociażby za pomocą zegarka na pasku adresu) to możemy łatwo oszukiwać pliki .pf. Załóżmy, że program X ostatni raz uruchamiany był w lipcu tego roku.  Ktoś zdobył fizyczny dostęp do naszego komputera i chce uruchomić nasz nazwany literką X program. Oczywiście nie chciałby, żeby zawartość folderu Prefetch zdradziła, że miało miejsce nieautoryzowane uruchomienie. Metoda jest banalna. Atakujący zmienia datę (np. na rok 2002) i odpala program. Różnica pomiędzy 2002, a 2011 rokiem jest mniejsza niż 2 minuty (dziwnie brzmi, ale odejmujemy mniejsza liczbę od większej – dostajemy wartość ujemną). Plik .pf pozostaje bez zmian, a program X został niezauważalnie (z punktu widzenia Perfetch) uruchomiony.

Jeśli ktoś chce naprawdę skuteczną analizę, to okazuje się, że pliki z folderu Perfetch raczej mu nie pomogą.

  

Dodaj komentarz

*
Prosty test CAPTCHA.
Audio-CAPTCHA