Pliki osadzone, binwalk oraz entropia

W jednym z ostatnich wpisów poruszaliśmy tematykę struktury plików binarnych oraz oprogramowania, które pozwala na ich analizę. Jeżeli spojrzymy na abstrakcję pliku, to zdamy sobie sprawę, że zawiera zarezerwowaną przestrzeń nośnika danych. Co za tym idzie, w obrębie tej przestrzeni istnieje możliwość umieszczania innych plików. Mamy więc do czynienia z plikami wewnątrz plików. Tak umieszczone informacje często określa się mianem osadzonych. Nie chodzi tutaj tylko o archiwa z danymi, chociaż te również wpasowują się w opisywane zagadnienie. Wykonując zrzut pamięci w formacie RAW, na nośniku danych uzyskujemy wynikowy plik, który oprócz przydatnych informacji zawiera także inne pliki i o wiele więcej. Z plikami osadzonymi mamy także do czynienia w przypadku oprogramowania układowego. Niestety takie rozwiązanie często wykorzystywane jest przez złośliwe oprogramowanie, które ukrywa plik lub część kodu wewnątrz innego pliku.

Przyjrzyjmy się konkretnemu przykładowi plików osadzonych. Wykorzystamy dwa pliki – first_file oraz second_file. Żeby przypomnieć dlaczego nagłówki plików mają znaczenie, analizowane pliki nie posiadają rozszerzeń. W tym przypadku, żeby sprawdzić w ogóle typ pliku najłatwiej jest skorzystać z polecenia file wbudowanego w dowolną dystrybucję Linuxa. Dodatkowo, można użyć polecenia xxd z opcją -l do wyświetlenia pierwszych 512 bajtów pliku w postaci heksadecymalnej.

Zgodnie z bazą danych nagłówków plików na licencji Open Source, nagłówek o wartości 4D5A określa pliki wykonywalne DOS. Tę samą informację z dodatkowymi szczegółami uzyskujemy na podstawie wykonania polecenia file. Drugi plik to biblioteka w formacie DLL. Podczas wstępu wspominaliśmy o plikach osadzonych. Jak więc sprawdzić zawartość przestrzeni zarezerwowanej przez first_file oraz second_file? W przypadku małych plików można posłużyć się edytorem heksadecymalnym. Sprawdźmy więc na przykładzie pliku second_file, co uda się znaleźć.

Znając strukturę danych pliku EXE lub PE można odczytać z sekcji zasobów binarną pozycję pierwszego z nich, który znajduje się w tzw obszarze freeformSection. Jeżeli jednak zaczynamy pracę z plikami binarnymi to znalezienie czegokolwiek będzie trudne. Pod offsetem 0x1EC51 znajduje się obraz PNG (zgodność nagłówka). Pamiętając o zakończeniu plików PNG (sekcja IEND), można dokonać ich ekstrakcji.

Jak widać, rzeczywiście udało nam się dokonać ekstrakcji obrazu zawartego wewnątrz przestrzeni zarezerwowanej na nośniku danych dla innego pliku. Aby ułatwić tego typu pracę powstało narzędzie binwalk. Za jego pomocą można dokonać analizy plików, dysków i innego typu przestrzeni. W tym wpisie skupimy się jedynie na podstawach omawianego oprogramowania. Wywołanie poleceń binwalk first_file oraz binwalk second_file dostarcza nam wymaganych informacji na temat zawartości plików.

Oprócz pozostałych informacji można zauważyć, że binwalk znalazł tylko 3 pliki wewnątrz pliku first_file, a offset znalezionego ręcznie obrazu w pliku second_file rzeczywiście wynosi 0x1EC51. Oczywiście binwalk umożliwia również wypakowywanie zasobów według znanych typów plików lub według wyrażenia regularnego, które pozwala na wypakowanie każdego typu pliku spod zlokalizowanych offsetów. Jednak to materiał na osobny wpis, ponieważ domyślnie binarna zawartość wypakowywana jest bez rozszerzeń. Została tylko jedna kwestia, czyli entropia.

Entropia to inaczej miara losowości lub gęstości danych w pliku względem konkretnej pozycji bitowej (offset). Wykorzystywana jest w wielu dziedzinach. Dzięki niej można stwierdzić m.in. gdzie wewnątrz pliku binarnego znajdują się dane, lub nawet rozróżniać typ pliku (obrazów) – pliki JPEG ze względu na kompresję posiadają zazwyczaj większą entropię niż pliki PNG, gdzie kompresowane są powtarzalne wzory. Oprogramowanie binwalk umożliwia wygenerowanie informacji na temat entropii w postaci liczbowej oraz wizualizację za pomocą grafu. Wystarczy skorzystać z polecenia binwalk -E --save file_name. W naszym przypadku to binwalk -E --save second_file. Entropia przybiera największą ciągłą wartość pomiędzy offsetami 0xC800 (51200) oraz 0x3CC00 (248832) – to obszar z którego dokonaliśmy ekstrakcji danych. Omawiane właściwości wykorzystuje się generalnie w dziale cyberbezpieczeństwa, jednak czasami przydają się podczas wytwarzania oprogramowania.

Udostępnij

Najnowsze wpisy

Framework na miarę potrzeb

Tym razem nasz wpis będzie stosunkowo krótki. Ostatnimi czasy spotkaliśmy się z opinią, iż podczas wytwarzania oprogramowania najlepiej jest stosować tylko najpopularniejsze frameworki. Kryterium

Pliki osadzone, binwalk oraz entropia

W jednym z ostatnich wpisów poruszaliśmy tematykę struktury plików binarnych oraz oprogramowania, które pozwala na ich analizę. Jeżeli spojrzymy na abstrakcję pliku, to zdamy

Narzędzie Emmet i generowanie kodu

Wytwarzanie oprogramowania w znaczącej części składa się z procesu pisania kodu, niezależnie od stosowanego języka. Po pewnym czasie okazuje się jednak, że tworząc rozbudowane

Przetwarzanie plików binarnych

Na ogół zespół programistów nie musi zagłębiać się w strukturę binarną plików. Zdarzają się jednak przypadki, kiedy należy pochylić się nad omawianym tematem. Powodem

Pragniesz rozwinąć swoją działalność?

Nawiąż z nami współpracę