macOS MIG - Mach Interface Generator
Ucz się i praktykuj Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i praktykuj Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Podstawowe informacje
MIG został stworzony, aby uproszczać proces tworzenia kodu Mach IPC. W zasadzie generuje wymagany kod do komunikacji serwera i klienta z daną definicją. Nawet jeśli wygenerowany kod jest brzydki, programista będzie musiał go tylko zaimportować, a jego kod będzie znacznie prostszy niż wcześniej.
Definicja jest określana w Interface Definition Language (IDL) przy użyciu rozszerzenia .defs
.
Te definicje mają 5 sekcji:
Deklaracja podsystemu: Słowo kluczowe podsystem jest używane do wskazania nazwy i id. Można również oznaczyć go jako
KernelServer
, jeśli serwer ma działać w jądrze.Dołączenia i importy: MIG używa preprocesora C, więc może korzystać z importów. Ponadto możliwe jest użycie
uimport
isimport
dla kodu generowanego przez użytkownika lub serwer.Deklaracje typów: Można zdefiniować typy danych, chociaż zazwyczaj importuje się
mach_types.defs
istd_types.defs
. Dla niestandardowych można użyć pewnej składni:[i
n/out]tran
: Funkcja, która musi zostać przetłumaczona z przychodzącej lub do wychodzącej wiadomościc[user/server]type
: Mapowanie na inny typ C.destructor
: Wywołaj tę funkcję, gdy typ zostanie zwolniony.Operacje: To są definicje metod RPC. Istnieje 5 różnych typów:
routine
: Oczekuje odpowiedzisimpleroutine
: Nie oczekuje odpowiedziprocedure
: Oczekuje odpowiedzisimpleprocedure
: Nie oczekuje odpowiedzifunction
: Oczekuje odpowiedzi
Przykład
Utwórz plik definicji, w tym przypadku z bardzo prostą funkcją:
Należy pamiętać, że pierwszym argumentem jest port do powiązania, a MIG będzie automatycznie obsługiwać port odpowiedzi (chyba że w kodzie klienta zostanie wywołane mig_get_reply_port()
). Ponadto ID operacji będzie sekwencyjne, zaczynając od wskazanego ID podsystemu (więc jeśli operacja jest przestarzała, zostaje usunięta, a skip
jest używane, aby nadal używać jej ID).
Teraz użyj MIG do wygenerowania kodu serwera i klienta, które będą mogły komunikować się ze sobą, aby wywołać funkcję Odejmowania:
W bieżącym katalogu zostanie utworzonych kilka nowych plików.
Możesz znaleźć bardziej złożony przykład w swoim systemie za pomocą: mdfind mach_port.defs
A następnie możesz go skompilować z tego samego folderu co plik za pomocą: mig -DLIBSYSCALL_INTERFACE mach_ports.defs
W plikach myipcServer.c
i myipcServer.h
znajdziesz deklarację i definicję struktury SERVERPREFmyipc_subsystem
, która w zasadzie definiuje funkcję do wywołania na podstawie otrzymanego identyfikatora wiadomości (wskazaliśmy początkowy numer 500):
Tytuł: myipcServer.h
Na podstawie poprzedniej struktury funkcja myipc_server_routine
otrzyma ID wiadomości i zwróci odpowiednią funkcję do wywołania:
W tym przykładzie zdefiniowaliśmy tylko 1 funkcję w definicjach, ale gdybyśmy zdefiniowali więcej funkcji, znajdowałyby się one wewnątrz tablicy SERVERPREFmyipc_subsystem
, a pierwsza zostałaby przypisana do ID 500, druga do ID 501...
Jeśli oczekiwano, że funkcja ma wysłać odpowiedź, funkcja mig_internal kern_return_t __MIG_check__Reply__<name>
również istniałaby.
Tak naprawdę można zidentyfikować tę relację w strukturze subsystem_to_name_map_myipc
z pliku myipcServer.h
(subsystem_to_name_map_***
w innych plikach):
Ostatecznie, kolejną ważną funkcją, która sprawi, że serwer będzie działać, będzie myipc_server
, która faktycznie wywoła funkcję związaną z otrzymanym identyfikatorem:
Sprawdź wcześniej wyróżnione linie, które uzyskują dostęp do funkcji do wywołania na podstawie identyfikatora.
Poniżej znajduje się kod tworzący prosty serwer i klient, gdzie klient może wywoływać funkcje odejmowania na serwerze:
Rekord NDR
Rekord NDR jest eksportowany przez libsystem_kernel.dylib
i jest to struktura, która pozwala MIG na przekształcanie danych w sposób niezależny od systemu, na którym jest używany, ponieważ MIG miał być używany między różnymi systemami (a nie tylko na tym samym urządzeniu).
Jest to interesujące, ponieważ jeśli _NDR_record
zostanie znaleziony w binarnym jako zależność (jtool2 -S <binary> | grep NDR
lub nm
), oznacza to, że binarny jest klientem lub serwerem MIG.
Co więcej, serwery MIG mają tabelę dyspozytorników w __DATA.__const
(lub w __CONST.__constdata
w jądrze macOS i __DATA_CONST.__const
w innych jądrach *OS). Można to wyeksportować za pomocą jtool2
.
Natomiast klienci MIG będą używać __NDR_record
do wysyłania z __mach_msg
do serwerów.
Analiza Binarna
jtool
Ponieważ wiele binarnych plików teraz używa MIG do eksponowania portów mach, interesujące jest wiedzieć, jak zidentyfikować użycie MIG oraz funkcje, które MIG wykonuje przy każdym identyfikatorze wiadomości.
jtool2 potrafi analizować informacje MIG z pliku Mach-O, wskazując identyfikator wiadomości i identyfikując funkcję do wykonania:
Ponadto funkcje MIG są tylko opakowaniami rzeczywistej funkcji, która jest wywoływana, co oznacza, że uzyskując jej rozkład i przeszukując go pod kątem BL, możesz być w stanie znaleźć rzeczywistą funkcję, która jest wywoływana:
Montaż
Wcześniej wspomniano, że funkcją, która będzie odpowiadać za wywołanie odpowiedniej funkcji w zależności od otrzymanego identyfikatora wiadomości, będzie myipc_server
. Jednak zazwyczaj nie będziesz mieć symboli binarnych (brak nazw funkcji), więc interesujące jest sprawdzenie, jak wygląda zdekompilowany kod, ponieważ zawsze będzie bardzo podobny (kod tej funkcji jest niezależny od funkcji wystawionych):
Faktycznie, jeśli przejdziesz do funkcji 0x100004000
, znajdziesz tablicę struktur routine_descriptor
. Pierwszy element struktury to adres, gdzie jest zaimplementowana funkcja, a struktura zajmuje 0x28 bajtów, więc co 0x28 bajtów (zaczynając od bajtu 0) można uzyskać 8 bajtów, które będą adresem funkcji, która zostanie wywołana:
Te dane można wyodrębnić korzystając z tego skryptu Hoppera.
Debug
Kod generowany przez MIG również wywołuje kernel_debug
, aby generować logi dotyczące operacji przy wejściu i wyjściu. Można je sprawdzić za pomocą trace
lub kdv
: kdv all | grep MIG
References
Naucz się i praktykuj Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Naucz się i praktykuj Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Last updated