Niedawno miałem zadanie w pracy, aby zrozumieć binarny program Linux. Program był jednak w formie binarnej.
Użyłem polecenia file
, strings
i objdump
mają niewielki pomysł, co robi, i funkcje, jakie dzwoni.
Wygląda na to, że plik binarny jest kompilowany z informacjami debugowania. Czego więcej mogę się o tym dowiedzieć?
linux
reverse-engineering
Jeff Schaller
źródło
źródło
Odpowiedzi:
W tym polecenia, których już użyłeś, postaram się jak najlepiej opisać, co można zrobić, aby wykonać pewne operacje kryminalistyczne w pliku wykonywalnym.
Skromne
strings
polecenie może być przydatne do wizualizacji komunikatów o błędach tekstowych, które dają wskazówki dotyczące funkcji binarnych. Jest to również prosty sposób na wykrycie spakowanych plików binarnych, jak w przykładzie (często w przypadku plików binarnych złośliwego oprogramowania):file
pozwala zobaczyć właściwości wykonywalne, a mianowicie:W tym przykładzie „nie pozbawiony” oznacza, że został skompilowany z dołączonymi informacjami o debugowaniu.
objdump
tworzy listę deasemblacji pliku wykonywalnego:objdump
pozwala również poznać kompilator używany do kompilacji binarnego pliku wykonywalnego:objdump
zawiera również funkcje zewnętrzne dynamicznie powiązane w czasie wykonywania:$ objdump -T plik_wyjściowy
Możesz uruchomić plik binarny na maszynie wirtualnej utworzonej, a następnie odrzuconej tylko w celu uruchomienia pliku binarnego. Użyj
strace
,ltrace
,gdb
isysdig
, aby dowiedzieć się więcej o tym, co robi w binarnym systemie nazywa poziom w czasie wykonywania.Można go również debugować krok po kroku
gdb
.Aby śledzić / tworzyć zrzuty dużej części jego aktywności systemowej, uruchom sysdig jak w:
Ponownie zajmiemy się analizą statyczną samego pliku binarnego w pozostałej części tej odpowiedzi.
ldd exe_file
wymienia używane biblioteki;size -A exe_file
readelf -x .rodata exe_file
wyświetla ciągi statycznereadelf -h exe_file
pobiera informacje nagłówka ELFreadelf -s exe_file
wyświetla symbolenm exe_file
wyświetla symbole z tabeli obiektów:Oprócz deasemblowania
objdump
pliku binarnego można również użyć dekompilatora.Do dekompilacji podjąłem ostatnio wyzwanie techniczne, w którym musiałem zdekompilować dwa małe 64-bitowe pliki binarne z linuksem.
Próbowałem użyć Bumerangu i Bałwana. Projekt Bumerang wydaje się porzucony i nie byłem pod wrażeniem ograniczeń obu z nich. Kilka innych alternatyw, zarówno open source / freeware / old, w tym ostatnia wydana przez Avast, dekompilowało tylko 32-bitowe pliki binarne.
Skończyło się na wypróbowaniu wersji demonstracyjnej Hoppera w systemie MacOS (ma on również wersję Linux).
Hopper deasembluje i dekompiluje pliki binarne 32 lub 64 bity dla systemów OS / X, Linux i Windows. Jest w stanie radzić sobie z dużymi plikami binarnymi, gdy jest licencjonowany.
Tworzy również wykresy przepływów funkcji / struktury programu i zmiennych.
Jest również aktywnie utrzymywany i aktualizowany. Jednak jest komercyjny.
Bardzo podobało mi się korzystanie z niego i wynikowe, że kupiłem licencję. Licencja jest znacznie bardziej przystępna cenowo niż promieniowanie heksadecymalne.
W komentarzach do tej odpowiedzi @ d33tah i @Josh również wspominają jako alternatywy open source radare2 oraz odpowiadający im interfejs graficzny Cutter podobny do Hoppera w Linuksie, nie mogą osobiście za to ręczyć, ponieważ ich nie używam.
Ponieważ docelowy plik binarny został skompilowany z informacjami debugowania, możesz odzyskać pierwotną nazwę funkcji i zmiennych.
Co ważniejsze, nigdy nie odzyskasz komentarzy w kodzie źródłowym, ponieważ nie są one w żaden sposób skompilowane w binarne pliki wykonywalne.
Poprawa jakości źródła wyjściowego i zrozumienie pliku binarnego zawsze będzie wymagało czasu i pracy detektywistycznej. Dekompilatory wykonują tylko tyle pracy.
Przykład wyjścia zasobnika bez informacji debugowania:
Interfejs graficzny Hoppera jest również bardzo użyteczny (kilka funkcji rozszerzonych jednocześnie na tym obrazie):
zobacz także powiązane pytanie Dlaczego prawda i fałsz są tak duże?
źródło
strace -f
śledzić wątków / procesów potomnych. Istnieją możliwości, aby podzielić wyjście do oddzielnych plików dla każdego PID, lub po prostu/12345
wless
celu wyszukania i podkreślają linie, które zaczynają się PID, który Cię interesuje. Jeśli rzeczy nie są zbyt pomieszane ze sobą (np skrypt rozpoczynający drugi procesy, a nie współbieżne wątki), można to wykorzystać. Ale tak, niezwykle pomocne jest po prostu sprawdzenie, jakie pliki config / inne próbują odczytać jakieś mylące fragmenty oprogramowania, próbując dowiedzieć się, dlaczego nie jest zadowolony ze sposobu instalacji.radare2
do listy.