macOS Dyld Process
Grundlegende Informationen
Der eigentliche Einstiegspunkt eines Mach-o-Binärdatei ist der dynamische Linker, der in LC_LOAD_DYLINKER
definiert ist und normalerweise /usr/lib/dyld
ist.
Dieser Linker muss alle ausführbaren Bibliotheken lokalisieren, sie im Speicher abbilden und alle nicht-faulen Bibliotheken verknüpfen. Erst nach diesem Prozess wird der Einstiegspunkt der Binärdatei ausgeführt.
Natürlich hat dyld
keine Abhängigkeiten (es verwendet Systemaufrufe und libSystem-Auszüge).
Wenn dieser Linker eine Sicherheitslücke aufweist, da er vor der Ausführung von Binärdateien (auch hochprivilegierten) ausgeführt wird, wäre es möglich, Berechtigungen zu eskalieren.
Ablauf
Dyld wird von dyldboostrap::start
geladen, der auch Dinge wie den Stack-Canary lädt. Dies liegt daran, dass diese Funktion im apple
-Argumentvektor diesen und andere sensible Werte erhält.
dyls::_main()
ist der Einstiegspunkt von dyld und seine erste Aufgabe besteht darin, configureProcessRestrictions()
auszuführen, das normalerweise die DYLD_*
-Umgebungsvariablen einschränkt, wie in erklärt:
Dann wird der dyld-Shared-Cache abgebildet, der alle wichtigen Systembibliotheken vorverknüpft, und dann werden die Bibliotheken abgebildet, von denen die Binärdatei abhängt, und dies wird rekursiv fortgesetzt, bis alle benötigten Bibliotheken geladen sind. Daher:
beginnt es mit dem Laden eingefügter Bibliotheken mit
DYLD_INSERT_LIBRARIES
(falls erlaubt)Dann die freigegebenen gecachten
Dann die importierten
Dann weiterhin Bibliotheken rekursiv importieren
Sobald alle geladen sind, werden die Initialisierer dieser Bibliotheken ausgeführt. Diese sind mit __attribute__((constructor))
codiert, definiert in LC_ROUTINES[_64]
(jetzt veraltet) oder durch Zeiger in einem Abschnitt mit der Markierung S_MOD_INIT_FUNC_POINTERS
(normalerweise: __DATA.__MOD_INIT_FUNC
).
Terminatoren sind mit __attribute__((destructor))
codiert und befinden sich in einem Abschnitt mit der Markierung S_MOD_TERM_FUNC_POINTERS
(__DATA.__mod_term_func
).
Stubs
Alle Binärdateien in macOS sind dynamisch verknüpft. Daher enthalten sie einige Stub-Abschnitte, die der Binärdatei helfen, zum richtigen Code in verschiedenen Maschinen und Kontexten zu springen. Es ist dyld, wenn die Binärdatei ausgeführt wird, das Gehirn, das diese Adressen auflösen muss (zumindest die nicht-faulen).
Einige Stub-Abschnitte in der Binärdatei:
__TEXT.__[auth_]stubs
: Zeiger aus__DATA
-Abschnitten__TEXT.__stub_helper
: Kleiner Code, der das dynamische Verknüpfen mit Informationen zum aufzurufenden Funktion aufruft__DATA.__[auth_]got
: Global Offset Table (Adressen zu importierten Funktionen, wenn aufgelöst, (während der Ladezeit gebunden, da er mit der FlaggeS_NON_LAZY_SYMBOL_POINTERS
markiert ist)__DATA.__nl_symbol_ptr
: Nicht-faule Symbolzeiger (während der Ladezeit gebunden, da er mit der FlaggeS_NON_LAZY_SYMBOL_POINTERS
markiert ist)__DATA.__la_symbol_ptr
: Lazy-Symbolzeiger (beim ersten Zugriff gebunden)
Beachten Sie, dass die Zeiger mit dem Präfix "auth_" einen in-process-Verschlüsselungsschlüssel verwenden, um sie zu schützen (PAC). Außerdem ist es möglich, die arm64-Anweisung BLRA[A/B]
zu verwenden, um den Zeiger vor dem Folgen zu überprüfen. Und das RETA[A/B] kann anstelle einer RET-Adresse verwendet werden.
Tatsächlich wird der Code in __TEXT.__auth_stubs
braa
anstelle von bl
verwenden, um die angeforderte Funktion aufzurufen, um den Zeiger zu authentifizieren.
Beachten Sie auch, dass aktuelle dyld-Versionen alles als nicht-faul laden.
Lazy-Symbole finden
Interessanter Disassembly-Teil:
Es ist möglich zu sehen, dass der Sprung zum Aufruf von printf zu __TEXT.__stubs
führt:
Bei der Disassemblierung des __stubs
Abschnitts:
Du kannst sehen, dass wir zur Adresse des GOT springen, die in diesem Fall nicht träge aufgelöst wird und die Adresse der printf-Funktion enthält.
In anderen Situationen könnte anstelle des direkten Springens zum GOT __DATA.__la_symbol_ptr
verwendet werden, das einen Wert lädt, der die Funktion repräsentiert, die geladen werden soll. Anschließend wird zum __TEXT.__stub_helper
gesprungen, der zum __DATA.__nl_symbol_ptr
springt, der die Adresse des dyld_stub_binder
enthält, der als Parameter die Nummer der Funktion und eine Adresse erhält.
Diese letzte Funktion schreibt nach dem Auffinden der Adresse der gesuchten Funktion diese an die entsprechende Stelle in __TEXT.__stub_helper
, um zukünftige Nachschlagen zu vermeiden.
Beachte jedoch, dass aktuelle dyld-Versionen alles als nicht träge laden.
Dyld-Operationen
Schließlich muss dyld_stub_binder
die angegebene Funktion finden und an die richtige Adresse schreiben, um nicht erneut danach suchen zu müssen. Dazu verwendet es Opcodes (eine endliche Zustandsmaschine) innerhalb von dyld.
apple[] Argumentvektor
In macOS erhält die Hauptfunktion tatsächlich 4 Argumente anstelle von 3. Das vierte wird apple genannt und jeder Eintrag hat die Form key=value
. Zum Beispiel:
Der folgende Inhalt ist aus einer Hacking-Buch über Hacking-Techniken. Der folgende Inhalt stammt aus der Datei macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md. Übersetze den relevanten englischen Text ins Deutsche und gib die Übersetzung zurück, wobei genau die gleiche Markdown- und HTML-Syntax beibehalten wird. Übersetze keine Dinge wie Code, Hacking-Technikenamen, Hacking-Wörter, Cloud/SaaS-Plattformnamen (wie Workspace, aws, gcp...), das Wort 'leak', Pentesting und Markdown-Tags. Füge auch keine zusätzlichen Informationen hinzu, außer der Übersetzung und der Markdown-Syntax.
Zu dem Zeitpunkt, an dem diese Werte die Hauptfunktion erreichen, wurde bereits sensitive Information daraus entfernt oder es hätte zu einem Datenleck geführt.
Es ist möglich, all diese interessanten Werte beim Debuggen zu sehen, bevor sie in die Hauptfunktion gelangen:
dyld_all_image_infos
Dies ist eine Struktur, die von dyld mit Informationen über den dyld-Zustand exportiert wird und die im Quellcode gefunden werden kann, mit Informationen wie der Version, einem Zeiger auf das dyld_image_info-Array, auf dyld_image_notifier, ob der Prozess vom gemeinsamen Cache getrennt ist, ob der libSystem-Initializer aufgerufen wurde, einem Zeiger auf den eigenen Mach-Header von dyls, einem Zeiger auf die dyld-Version...
dyld Umgebungsvariablen
dyld debuggen
Interessante Umgebungsvariablen, die helfen zu verstehen, was dyld macht:
DYLD_PRINT_LIBRARIES
Überprüfen Sie jede Bibliothek, die geladen wird:
DYLD_PRINT_SEGMENTS
Überprüfen Sie, wie jede Bibliothek geladen wird:
DYLD_PRINT_INITIALIZERS
Drucken, wann jeder Bibliotheksinitialisierer ausgeführt wird:
Andere
DYLD_BIND_AT_LAUNCH
: Lazy-Bindungen werden mit nicht-lazy Bindungen aufgelöstDYLD_DISABLE_PREFETCH
: Deaktiviert das Vorabladen von __DATA- und __LINKEDIT-InhaltenDYLD_FORCE_FLAT_NAMESPACE
: Bindungen auf einer EbeneDYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH
: AuflösungspfadeDYLD_INSERT_LIBRARIES
: Laden einer bestimmten BibliothekDYLD_PRINT_TO_FILE
: Schreibt dyld-Debug in eine DateiDYLD_PRINT_APIS
: Druckt libdyld-API-AufrufeDYLD_PRINT_APIS_APP
: Druckt libdyld-API-Aufrufe, die von main gemacht wurdenDYLD_PRINT_BINDINGS
: Druckt Symbole beim BindenDYLD_WEAK_BINDINGS
: Druckt nur schwache Symbole beim BindenDYLD_PRINT_CODE_SIGNATURES
: Druckt Registrierungsvorgänge für CodesignaturenDYLD_PRINT_DOFS
: Druckt D-Trace-Objektformatabschnitte beim LadenDYLD_PRINT_ENV
: Druckt von dyld gesehene UmgebungenDYLD_PRINT_INTERPOSTING
: Druckt Interposting-VorgängeDYLD_PRINT_LIBRARIES
: Druckt geladene BibliothekenDYLD_PRINT_OPTS
: Druckt LadeoptionenDYLD_REBASING
: Druckt Symbol-RebasierungsoperationenDYLD_RPATHS
: Druckt Erweiterungen von @rpathDYLD_PRINT_SEGMENTS
: Druckt Zuordnungen von Mach-O-SegmentenDYLD_PRINT_STATISTICS
: Druckt ZeitstatistikenDYLD_PRINT_STATISTICS_DETAILS
: Druckt detaillierte ZeitstatistikenDYLD_PRINT_WARNINGS
: Druckt WarnmeldungenDYLD_SHARED_CACHE_DIR
: Pfad zur Verwendung des gemeinsamen BibliothekscachesDYLD_SHARED_REGION
: "use", "private", "avoid"DYLD_USE_CLOSURES
: Aktiviert Closures
Es ist möglich, mehr mit etwas wie zu finden:
Oder laden Sie das dyld-Projekt von https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz herunter und führen Sie es im Ordner aus:
Referenzen
Last updated