Debugowanie aplikacji w architekturze MIPS #2 – Konfguracja IDA + GDB Server

Druga i ostatnia część poradnika budowy środowiska do zdalnego debugowania binarek. W tej części zaprezentuję sposób uruchomienia aplikacji na maszynie wirtualnej QEMU, uruchomienie GDB Servera oraz podłączenie się do niego IDA Pro. Po wykonaniu wszystkich kroków będziemy mogli np. debugować pliki wyciągnięte z firmware różnych urządzeń 🙂

Co będzie potrzebne?

  • Środowisko z poprzedniego posta
  • IDA Pro
  • Dowolna aplikacja skompilowana pod architekturę MIPS
1. Kopiowanie binarki do badania

Jeżeli zarządzamy maszyną wirtualną poprzez SSH najwygodniej będzie skopiować aplikację poprzez SCP.

# httpd - binarka do kopiowania
# 192.168.126.129 - adres mojej VM z Debianem
# Nie zapomnij o dwukropku po IP!

scp httpd root@192.168.126.129:
2. Rozwiązanie wszystkich zależności

Aby uruchomić aplikację musimy zagwarantować dostępność wymaganych zależności (oraz zależności tych zależności 😉 ), w przeciwnym wypadku system operacyjny będzie sobie z nas żartował w następujący sposób:

W tym celu przydatne będą takie narzędzia jak (wcześniej opisywany) readelf z przełącznikiem -d (biblioteki, oraz ich ścieżka).

readelf -d httpd

Oraz ldd, które pomoże nam zlokalizować braki w bibliotekach:

ldd httpd

3. Uruchomienie gdbserver

Po spełnieniu wszystkich zależności i poprawnym uruchomieniu aplikacji w normalnym środowisku (bez gdbserver) lub chroot, należy odblokować port na którym ma nasłuchiwać zdalny debbuger.

W moim środowisku korzystam z UFW (polecam!), dlatego na VM z Debianem wydaje polecenie:

ufw allow 5000
# Status UFW
ufw status verbose

Następnie uruchamiam gdbserver na wcześniej odblokowanym porcie:

gdbserver --multi localhost:5000

Uruchomienie gdbserver “na sucho” daje mi możliwość podpięcia się do aktualnie działającego procesu, jak i również uruchomienia nowego (wszystko z poziomu IDA).

4. Podłączenie IDA do gdbserver

Po uruchomieniu IDA z górnegu menu wybieramy Debugger, następnie Attach oraz Remote GDB debugger:

Następnie wpisujemy IP maszyny wirtualnej z Debianem:

Określamy czy proces wybierzemy z listy działających procesów, czy też podamy jego PID:

Wpisujemy PID (który można poznać np. poleceniem ps aux):

pid_ida_gdb

W sytuacji kiedy wszystko pójdzie OK, zostaniemy o tym poinformowani stosownym komunikatem:
success_ida_gdb

Po kliknięciu OK, pojawi się okno IDA Debuggera (kliknij, aby powiększyć):

dbg_ida_gdb

Różnokolorowymi strzałkami zaznaczyłem najważniejsze przyciski akcji debuggera (opisane w kolejności od lewej do prawej):

  • różowe – wznawianie, pauzowanie oraz zamknięcie procesu
  • pomarańczowe – lista breakpointów, dodanie breakpointa pod aktualnie wskazywanym adresem oraz usunięcie breakpointa
  • zielone – wykonywanie instrukcji krok po kroku, wykonanie bez “wchodzenia” do danej funkcji, wykonanie dopóki funkcja nie zwróci wartości

Dotarliśmy do końca tego dwuczęściowego poradnika. Tak skonfigurowane środowisko może posłużyć do uruchomienia i debugowania większości binarek z różnych firmware i nie tylko (oczywiście uwzględniając specyficzne wymagania danej aplikacji).