macOS Dyld Process
Basiese Inligting
Die werklike ingangspunt van 'n Mach-o binêre lêer is die dinamies gekoppelde, gedefinieer in LC_LOAD_DYLINKER
is gewoonlik /usr/lib/dyld
.
Hierdie koppelaar sal al die uitvoerbare biblioteke moet vind, hulle in geheue in kaart bring en al die nie-luie biblioteke koppel. Eers na hierdie proses sal die ingangspunt van die binêre lêer uitgevoer word.
Natuurlik het dyld
geen afhanklikhede nie (dit gebruik stelseloproepe en libSystem-uitreksels).
As hierdie koppelaar enige kwesbaarheid bevat, aangesien dit uitgevoer word voordat enige binêre (selfs hoogs bevoorregte) uitgevoer word, sou dit moontlik wees om bevoorregting te eskaleer.
Vloei
Dyld sal deur dyldboostrap::start
gelaai word, wat ook dinge soos die stapel kanarie sal laai. Dit is omdat hierdie funksie in sy apple
-argumentvektor hierdie en ander sensitiewe waardes sal ontvang.
dyls::_main()
is die ingangspunt van dyld en sy eerste taak is om configureProcessRestrictions()
uit te voer, wat gewoonlik DYLD_*
-omgewingsveranderlikes beperk soos verduidelik in:
Daarna kaart dit die dyld gedeelde kas wat al die belangrike stelselbiblioteke vooraf koppel en dan kaart dit die biblioteke waarvan die binêre afhanklik is en gaan dan voort op 'n rekursiewe wyse totdat al die benodigde biblioteke gelaai is. Dus:
dit begin met die laai van ingevoegde biblioteke met
DYLD_INSERT_LIBRARIES
(indien toegelaat)Dan die gedeelde gekašte een
Dan die ingevoerde een
Dan gaan dit voort om biblioteke rekursief in te voer
Sodra almal gelaai is, word die inisialiseerders van hierdie biblioteke uitgevoer. Hierdie is gekodeer met __attribute__((constructor))
gedefinieer in die LC_ROUTINES[_64]
(nou verouderd) of deur 'n wyser in 'n afdeling met die vlag S_MOD_INIT_FUNC_POINTERS
(gewoonlik: __DATA.__MOD_INIT_FUNC
).
Terminators is gekodeer met __attribute__((destructor))
en is geleë in 'n afdeling met die vlag S_MOD_TERM_FUNC_POINTERS
(__DATA.__mod_term_func
).
Stubs
Alle binêre lêers in macOS is dinamies gekoppel. Daarom bevat hulle sekere stubs-afdelings wat die binêre help om na die korrekte kode in verskillende rekenaars en kontekste te spring. Dit is dyld wanneer die binêre lêer uitgevoer word, die brein wat hierdie adresse moet oplos (ten minste die nie-luie eenhede).
Sekere stubs-afdelings in die binêre:
__TEXT.__[auth_]stubs
: Wysers vanaf__DATA
-afdelings__TEXT.__stub_helper
: Klein kode wat dinamiese koppeling aanroep met inligting oor die funksie om te roep__DATA.__[auth_]got
: Globale Verskuiwingstabel (adresse na ingevoerde funksies, wanneer opgelos, (gebond gedurende laai-tyd aangesien dit gemerk is met die vlagS_NON_LAZY_SYMBOL_POINTERS
)__DATA.__nl_symbol_ptr
: Nie-luie simboolwysers (gebond gedurende laai-tyd aangesien dit gemerk is met die vlagS_NON_LAZY_SYMBOL_POINTERS
)__DATA.__la_symbol_ptr
: Luie simboolwysers (gebond met eerste toegang)
Let daarop dat die wysers met die voorvoegsel "auth_" een in-proses-enkripsiesleutel gebruik om dit te beskerm (PAC). Daarbenewens is dit moontlik om die arm64-instruksie BLRA[A/B]
te gebruik om die wyser te verifieer voordat dit gevolg word. En die RETA[A/B] kan in plaas van 'n RET-adres gebruik word.
Eintlik sal die kode in __TEXT.__auth_stubs
braa
in plaas van bl
gebruik om die versoekfunksie te roep vir verifikasie van die wyser.
Let ook daarop dat huidige dyld-weergawes alles as nie-luie laai.
Vind luie simbole
Interessante disassemblage gedeelte:
Dit is moontlik om te sien dat die sprong na die aanroep van printf na __TEXT.__stubs
gaan:
In die ontleed van die __stubs
afdeling:
Jy kan sien dat ons spring na die adres van die GOT, wat in hierdie geval nie-lui opgelos word en die adres van die printf funksie sal bevat.
In ander situasies, in plaas van direk na die GOT te spring, kan dit spring na __DATA.__la_symbol_ptr
wat 'n waarde laai wat die funksie verteenwoordig wat dit probeer laai, dan spring na __TEXT.__stub_helper
wat spring na die __DATA.__nl_symbol_ptr
wat die adres van dyld_stub_binder
bevat wat as parameters die nommer van die funksie en 'n adres neem.
Hierdie laaste funksie, nadat dit die adres van die gesogte funksie gevind het, skryf dit na die ooreenstemmende plek in __TEXT.__stub_helper
om te verhoed dat soekopdragte in die toekoms gedoen moet word.
Let egter daarop dat huidige dyld weergawes alles as nie-lui laai.
Dyld opcodes
Laastens, dyld_stub_binder
moet die aangeduide funksie vind en dit in die regte adres skryf sodat dit nie weer daarna hoef te soek nie. Om dit te doen, gebruik dit opcodes (‘n eindige toestandmasjien) binne dyld.
apple[] argument vektor
In macOS ontvang die hooffunksie eintlik 4 argumente in plaas van 3. Die vierde word apple genoem en elke inskrywing is in die vorm key=value
. Byvoorbeeld:
macOS Dyld Process
macOS Dyld Proses
The dynamic linker (dyld) is responsible for loading dynamic libraries into a process's address space. Attackers can abuse this process by injecting malicious code into legitimate libraries or by loading malicious libraries into a process. This can lead to privilege escalation and other security issues.
Die dinamiese skakelaar (dyld) is verantwoordelik vir die laai van dinamiese biblioteke in 'n proses se adresruimte. Aanvallers kan hierdie proses misbruik deur kwaadwillige kode in legitieme biblioteke in te spuit of deur kwaadwillige biblioteke in 'n proses te laai. Dit kan lei tot voorreg-escalasie en ander sekuriteitskwessies.
Teen die tyd dat hierdie waardes die hooffunksie bereik, is sensitiewe inligting reeds daaruit verwyder of dit sou 'n datalek gewees het.
Dit is moontlik om al hierdie interessante waardes te sien tydens die foutopsporing voordat dit in die hooffunksie beland met:
dyld_all_image_infos
Dit is 'n struktuur wat deur dyld uitgevoer word met inligting oor die dyld-toestand wat gevind kan word in die bronkode met inligting soos die weergawe, wyser na dyld_image_info-reeks, na dyld_image_notifier, as die pros van die gedeelde kas afgesonder is, as libSystem-initialiseerder geroep is, wyser na dyld se eie Mach-kop, wyser na dyld-weergawe-string...
dyld-omgewingsveranderlikes
foutopsporing dyld
Interessante omgewingsveranderlikes wat help om te verstaan wat dyld doen:
DYLD_PRINT_LIBRARIES
Kyk na elke biblioteek wat gelaai is:
DYLD_PRINT_SEGMENTS
Kontroleer hoe elke biblioteek gelaai word:
DYLD_PRINT_INITIALIZERS
Druk af wanneer elke biblioteek-initialiseerder hardloop:
Ander
DYLD_BIND_AT_LAUNCH
: Luie bindings word opgelos met nie-luie eenDYLD_DISABLE_PREFETCH
: Deaktiveer vooraf ophaling van __DATA en __LINKEDIT inhoudDYLD_FORCE_FLAT_NAMESPACE
: Enkelvlak bindingsDYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH
: OplossingspaaieDYLD_INSERT_LIBRARIES
: Laai 'n spesifieke biblioteekDYLD_PRINT_TO_FILE
: Skryf dyld foutopsporing na 'n lêerDYLD_PRINT_APIS
: Druk libdyld API-oproepeDYLD_PRINT_APIS_APP
: Druk libdyld API-oproepe gemaak deur hoofDYLD_PRINT_BINDINGS
: Druk simbole wanneer gebindDYLD_WEAK_BINDINGS
: Druk slegs swak simbole wanneer gebindDYLD_PRINT_CODE_SIGNATURES
: Druk kodesignatuur registrasie-operasiesDYLD_PRINT_DOFS
: Druk D-Trace objekformaatseksies soos gelaaiDYLD_PRINT_ENV
: Druk omgewing gesien deur dyldDYLD_PRINT_INTERPOSTING
: Druk interpostoperasiesDYLD_PRINT_LIBRARIES
: Druk biblioteke wat gelaai isDYLD_PRINT_OPTS
: Druk laaioptiesDYLD_REBASING
: Druk simbool herbasering-operasiesDYLD_RPATHS
: Druk uitbreidings van @rpathDYLD_PRINT_SEGMENTS
: Druk karterings van Mach-O segmenteDYLD_PRINT_STATISTICS
: Druk tydstatistiekeDYLD_PRINT_STATISTICS_DETAILS
: Druk gedetailleerde tydstatistiekeDYLD_PRINT_WARNINGS
: Druk waarskuwingsboodskappeDYLD_SHARED_CACHE_DIR
: Pad om vir gedeelde biblioteekkas te gebruikDYLD_SHARED_REGION
: "gebruik", "privaat", "vermy"DYLD_USE_CLOSURES
: Aktiveer sluitings
Dit is moontlik om meer te vind met iets soos:
Of laai die dyld projek af van https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz en hardloop binne die vouer:
Verwysings
Last updated