macOS Dyld Process
Taarifa Msingi
Kiingilio halisi cha faili ya Mach-o ni kiungo cha kudai, kilichoelezwa katika LC_LOAD_DYLINKER
kawaida ni /usr/lib/dyld
.
Kiungo hiki kitahitaji kutambua maktaba zote za kutekelezeka, kuzipanga kumbukani na kuunganisha maktaba zote zisizo wavivu. Ni baada tu ya mchakato huu ndipo kiingilio cha faili kitatekelezwa.
Bila shaka, dyld
haina tegemezi yoyote (inatumia syscalls na vipande vya libSystem).
Ikiwa kiungo hiki kina kasoro yoyote, kwani kinatekelezwa kabla ya kutekeleza faili yoyote (hata zile zenye mamlaka ya juu), ingewezekana kupandisha vyeo.
Mchakato
Dyld itapakiwa na dyldboostrap::start
, ambayo pia itapakia vitu kama stack canary. Hii ni kwa sababu kazi hii itapokea katika apple
hoja vector hii na nyingine thamani nyeti.
dyls::_main()
ndio kiingilio cha dyld na kazi yake ya kwanza ni kukimbia configureProcessRestrictions()
, ambayo kawaida inazuia mazingira ya DYLD_* yanayoelezwa katika:
Kisha, inapanga cache iliyoshirikiwa ya dyld ambayo inapakia mapema maktaba muhimu za mfumo na kisha inapanga maktaba ambazo faili inategemea na kuendelea kwa njia ya kurudufu hadi maktaba zote zinazohitajika zinapakiwa. Kwa hivyo:
inaanza kupakia maktaba zilizoingizwa na
DYLD_INSERT_LIBRARIES
(ikiwa inaruhusiwa)Kisha zile zilizoshirikiwa kutoka kwenye cache
Kisha zile zilizoingizwa
Kisha kuendelea kuagiza maktaba kwa njia ya kurudufu
Marudio ya maktaba hizi zinapakiwa initialisers. Hizi zimeandikwa kwa kutumia __attribute__((constructor))
iliyoelezwa katika LC_ROUTINES[_64]
(sasa imepitwa na wakati) au kwa pointer katika sehemu iliyofungwa na bendera S_MOD_INIT_FUNC_POINTERS
(kawaida: __DATA.__MOD_INIT_FUNC
).
Waharibifu wameandikwa na __attribute__((destructor))
na wako katika sehemu iliyofungwa na bendera S_MOD_TERM_FUNC_POINTERS
(__DATA.__mod_term_func
).
Stubs
Faili zote za macOS zimeunganishwa kwa njia ya kudai. Kwa hivyo, zina sehemu za stubs ambazo husaidia faili kusonga kwenye nambari sahihi kwenye mashine na muktadha tofauti. Ni dyld wakati faili inatekelezwa ndiye ubongo unahitaji kutatua anwani hizi (angalau zile zisizo wavivu).
Sehemu za stub katika faili:
__TEXT.__[auth_]stubs
: Pointi kutoka kwa sehemu za__DATA
__TEXT.__stub_helper
: Nambari ndogo inayoita uunganishaji wa kudai na habari juu ya kazi ya kuita__DATA.__[auth_]got
: Jedwali la Globu la Offset (anwani za kazi zilizoingizwa, zinapofumbuliwa, (zimefungwa wakati wa kupakia kwani imeashiriwa na benderaS_NON_LAZY_SYMBOL_POINTERS
)__DATA.__nl_symbol_ptr
: Pointi za alama zisizo wavivu (zimefungwa wakati wa kupakia kwani imeashiriwa na benderaS_NON_LAZY_SYMBOL_POINTERS
)__DATA.__la_symbol_ptr
: Pointi za alama wavivu (zimefungwa wakati wa kupakia kwani imeashiriwa na benderaS_NON_LAZY_SYMBOL_POINTERS
)
Tafadhali kumbuka kuwa pointi zenye kipimo "auth_" zinatumia ufunguo wa kielektroniki mchakani mmoja kulinda (PAC). Zaidi ya hayo, Inawezekana kutumia maagizo ya arm64 BLRA[A/B]
kuthibitisha pointi kabla ya kufuata. Na RETA[A/B] inaweza kutumika badala ya anwani ya RET.
Kwa kweli, nambari katika __TEXT.__auth_stubs
itatumia braa
badala ya bl
kuita kazi ili kuthibitisha pointi.
Pia kumbuka kuwa toleo la sasa la dyld linapakia kila kitu kama sio wavivu.
Kupata alama wavivu
Sehemu ya kuvunja vipande ya kuvutia:
Inawezekana kuona kwamba kuruka kuita printf inaelekea __TEXT.__stubs
:
Katika kuchambua upya wa sehemu ya __stubs
:
Unaweza kuona kwamba tun kuruka kwa anwani ya GOT, ambayo katika kesi hii inatanzuliwa bila uvivu na italeta anwani ya kazi ya printf.
Katika hali nyingine badala ya kuruka moja kwa moja kwa GOT, inaweza kuruka kwa __DATA.__la_symbol_ptr
ambayo itapakia thamani inayowakilisha kazi ambayo inajaribu kupakia, kisha kuruka kwa __TEXT.__stub_helper
ambayo inaruka __DATA.__nl_symbol_ptr
ambayo ina anwani ya dyld_stub_binder
ambayo inachukua kama vigezo idadi ya kazi na anwani.
Kazi ya mwisho, baada ya kupata anwani ya kazi inayotafutwa, huandika katika eneo husika katika __TEXT.__stub_helper
ili kuepuka kufanya utafutaji baadaye.
Hata hivyo, kumbuka kwamba toleo la sasa la dyld linapakia kila kitu bila uvivu.
Dyld opcodes
Hatimaye, dyld_stub_binder
inahitaji kupata kazi iliyoelekezwa na kuandika katika anwani sahihi ili isitafute tena. Ili kufanya hivyo, inatumia kanuni (kifaa cha hali ya mwisho) ndani ya dyld.
apple[] argument vector
Katika macOS, kazi kuu hupokea kimsingi vigezo 4 badala ya 3. Ya nne inaitwa apple na kila kuingia ni katika mfumo key=value
. Kwa mfano:
Matokeo:
Faili ya dyld inaweza kutumika kuingiza maktaba katika mchakato wa macOS. Hii inaweza kusababisha mchakato kutekeleza nambari iliyoharibika na kusababisha ukiukaji wa usalama au ongezeko la mamlaka. Kwa kufanya hivyo, mshambuliaji anaweza kuchukua udhibiti wa mchakato au hata mfumo mzima.
Kufikia wakati hizi thamani zinapofika kwenye kazi kuu, habari nyeti tayari imeondolewa kutoka kwao au ingekuwa uvujaji wa data.
ni rahisi kuona thamani zote za kuvutia zikibugia kabla ya kuingia kwenye kazi kuu na:
dyld_all_image_infos
Hii ni muundo unaozalishwa na dyld na habari kuhusu hali ya dyld ambayo inaweza kupatikana katika msimbo wa chanzo na habari kama toleo, pointer kwa safu ya dyld_image_info, kwa dyld_image_notifier, ikiwa proc imejitenga kutoka kwa cache iliyoshirikiwa, ikiwa mwanzilishi wa libSystem alipigiwa simu, pointer kwa kichwa cha Mach cha dyld yenyewe, pointer kwa herufi ya toleo la dyld...
dyld env variables
debug dyld
Mazingira ya env yenye thamani ambayo husaidia kuelewa ni nini dyld inafanya:
DYLD_PRINT_LIBRARIES
Angalia kila maktaba inayopakiwa:
DYLD_PRINT_SEGMENTS
Angalia jinsi kila maktaba inavyopakiwa:
DYLD_PRINT_INITIALIZERS
Chapisha wakati kila mwanzilishi wa maktaba anapoendeshwa:
Wengine
DYLD_BIND_AT_LAUNCH
: Uunganishaji wa uvivu unatatuliwa na wale wasio wavivuDYLD_DISABLE_PREFETCH
: Lemaza upakiaji wa maudhui ya __DATA na __LINKEDIT mapemaDYLD_FORCE_FLAT_NAMESPACE
: Uunganishaji wa ngazi mojaDYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH
: Njia za ufumbuziDYLD_INSERT_LIBRARIES
: Pakia maktaba maalumDYLD_PRINT_TO_FILE
: Andika upelelezi wa dyld kwenye failiDYLD_PRINT_APIS
: Chapisha simu za API za libdyldDYLD_PRINT_APIS_APP
: Chapisha simu za API za libdyld zilizofanywa na mainDYLD_PRINT_BINDINGS
: Chapisha alama wakati zinapounganishwaDYLD_WEAK_BINDINGS
: Chapisha alama dhaifu tu wakati zinapounganishwaDYLD_PRINT_CODE_SIGNATURES
: Chapisha operesheni za usajili wa saini ya nambariDYLD_PRINT_DOFS
: Chapisha sehemu za muundo wa D-Trace zilizopakiwaDYLD_PRINT_ENV
: Chapisha mazingira yanayoonekana na dyldDYLD_PRINT_INTERPOSTING
: Chapisha operesheni za kuingiliaDYLD_PRINT_LIBRARIES
: Chapisha maktaba zilizopakiwaDYLD_PRINT_OPTS
: Chapisha chaguo za upakiajiDYLD_REBASING
: Chapisha operesheni za kubadilisha alamaDYLD_RPATHS
: Chapisha upanuzi wa @rpathDYLD_PRINT_SEGMENTS
: Chapisha ramani za sehemu za Mach-ODYLD_PRINT_STATISTICS
: Chapisha takwimu za wakatiDYLD_PRINT_STATISTICS_DETAILS
: Chapisha takwimu za wakati kwa undaniDYLD_PRINT_WARNINGS
: Chapisha ujumbe wa onyoDYLD_SHARED_CACHE_DIR
: Njia ya kutumia kwa hifadhi ya maktaba iliyoshirikiwaDYLD_SHARED_REGION
: "tumia", "binafsi", "epuka"DYLD_USE_CLOSURES
: Wezesha kufungwa
Inawezekana kupata zaidi na kitu kama:
Au pakua mradi wa dyld kutoka https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz na uendeshe kwenye folda:
Marejeo
Last updated