macOS Universal binaries & Mach-O Format
Last updated
Last updated
Jifunze & zoezi la AWS Hacking:Mafunzo ya HackTricks AWS Timu Nyekundu Mtaalam (ARTE) Jifunze & zoezi la GCP Hacking: Mafunzo ya HackTricks GCP Timu Nyekundu Mtaalam (GRTE)
Vipande vya Mac OS kawaida hukusanywa kama vipande vya universal. Kipande cha universal kinaweza kusaidia miundo mingi katika faili moja.
Vipande hivi vinazingatia muundo wa Mach-O ambao kimsingi unaundwa na:
Kichwa
Amri za Upakiaji
Data
Tafuta faili kwa: mdfind fat.h | grep -i mach-o | grep -E "fat.h$"
Kichwa kina baye za uchawi zifuatiwazo na idadi ya miundo faili ina inajumuisha (nfat_arch
) na kila muundo utakuwa na muundo wa fat_arch
.
Angalia na:
au kutumia zana ya Mach-O View:
Kama unavyoweza kufikiria kawaida kipande cha universal kilichopangwa kwa miundo 2 hufanya ukubwa wa moja iliyopangwa kwa muundo mmoja tu.
Kichwa kina taarifa msingi kuhusu faili, kama baye za uchawi kutambua kama faili ya Mach-O na taarifa kuhusu miundo ya lengo. Unaweza kuipata kwa: mdfind loader.h | grep -i mach-o | grep -E "loader.h$"
Kuna aina tofauti za faili, unaweza kuzipata zimefafanuliwa katika mifano ya msimbo hapa kwa mfano. Zile muhimu zaidi ni:
MH_OBJECT
: Faili ya kitu inayoweza kuhama (bidhaa za kati za uundaji, sio utekelezaji bado).
MH_EXECUTE
: Faili za utekelezaji.
MH_FVMLIB
: Faili ya maktaba ya VM iliyofungwa.
MH_CORE
: Dump za Msimbo
MH_PRELOAD
: Faili ya utekelezaji iliyopakiwa mapema (haisaidiwi tena katika XNU)
MH_DYLIB
: Maktaba za Kisasa
MH_DYLINKER
: Kiungo cha Kisasa
MH_BUNDLE
: "Faili za programu-jalizi". Zinazozalishwa kwa kutumia -bundle katika gcc na kupakiwa wazi na NSBundle
au dlopen
.
MH_DYSM
: Faili ya .dSym
mshirika (faili yenye alama za kutatua matatizo).
MH_KEXT_BUNDLE
: Vipanuzi vya Kerneli.
Au kutumia Mach-O View:
Msimbo wa chanzo pia unatambua alama kadhaa zinazofaa kwa kupakia maktaba:
MH_NOUNDEFS
: Hakuna marejeo yasiyojulikana (imeunganishwa kabisa)
MH_DYLDLINK
: Uunganishaji wa Dyld
MH_PREBOUND
: Marejeo ya kudumu yanayoweza kubadilika.
MH_SPLIT_SEGS
: Faili inagawanya segimenti za r/o na r/w.
MH_WEAK_DEFINES
: Baina ina alama zilizofafanuliwa kwa udhaifu
MH_BINDS_TO_WEAK
: Baina inatumia alama za udhaifu
MH_ALLOW_STACK_EXECUTION
: Fanya steki iweze kutekelezwa
MH_NO_REEXPORTED_DYLIBS
: Maktaba haina amri za LC_REEXPORT
MH_PIE
: Kutekelezeka kwa Nafasi Isiyokuwa na Kitegemezi
MH_HAS_TLV_DESCRIPTORS
: Kuna sehemu na pembejeo za mitambo ya mnyororo
MH_NO_HEAP_EXECUTION
: Hakuna utekelezaji kwa kurasa za rundo/data
MH_HAS_OBJC
: Baina ina sehemu za oBject-C
MH_SIM_SUPPORT
: Msaada wa Simulator
MH_DYLIB_IN_CACHE
: Kutumika kwenye dylibs/frameworks katika hifadhi ya maktaba ya pamoja.
Mpangilio wa faili akilini unatajwa hapa, ukielezea eneo la jedwali la alama, muktadha wa mnyororo mkuu mwanzoni mwa utekelezaji, na maktaba zinazoshirikiwa zinazohitajika. Maelekezo yanatolewa kwa mzigo wa kudumu (dyld) kuhusu mchakato wa kupakia bainari akilini.
Inatumia muundo wa load_command, uliotajwa katika loader.h
iliyotajwa:
Kuna karibu aina 50 tofauti za amri za mzigo ambazo mfumo unashughulikia tofauti. Zile za kawaida zaidi ni: LC_SEGMENT_64
, LC_LOAD_DYLINKER
, LC_MAIN
, LC_LOAD_DYLIB
, na LC_CODE_SIGNATURE
.
Kimsingi, aina hii ya Amri ya Mzigo inaainisha jinsi ya kupakia __TEXT (msimbo wa kutekelezeka) na __DATA (data kwa ajili ya mchakato) sehemu kulingana na makadirio yaliyoonyeshwa katika sehemu ya Data wakati binary inatekelezwa.
Amri hizi inaainisha sehemu ambazo zinapangiliwa katika nafasi ya kumbukumbu ya kielezo ya mchakato unapotekelezwa.
Kuna aina tofauti za sehemu, kama vile sehemu ya __TEXT, ambayo inashikilia msimbo wa kutekelezeka wa programu, na sehemu ya __DATA, ambayo ina data inayotumiwa na mchakato. Hizi sehemu zinapatikana katika sehemu ya data ya faili ya Mach-O.
Kila sehemu inaweza kugawanywa zaidi katika sehemu nyingi. Muundo wa amri ya mzigo una habari kuhusu sehemu hizi ndani ya sehemu husika.
Katika kichwa kwanza unapata kichwa cha sehemu:
Mfano wa kichwa cha sehemu:
Kichwa hiki kinafafanua idadi ya sehemu ambazo vichwa vyake vinatokea baada ya hiyo:
Mfano wa kichwa cha sehemu:
Ikiwa un ongeza kielekezi cha sehemu (0x37DC) + kielekezi ambapo arch inaanza, katika kesi hii 0x18000
--> 0x37DC + 0x18000 = 0x1B7DC
Pia niwezekana kupata habari za vichwa kutoka kwa mstari wa amri na:
Sehemu za kawaida zilizopakiwa na hii cmd:
__PAGEZERO
: Inaagiza kernel kufanya ramani ya anwani sifuri ili isomeki, iandikwe, au kutekelezwa. maxprot na minprot katika muundo huo hupangwa kuwa sifuri kuonyesha kwamba hakuna haki za kusoma-andika-tekeleza kwenye ukurasa huu.
Upeanaji huu ni muhimu kwa kuzuia udhaifu wa dereferensi ya pointer ya NULL. Hii ni kwa sababu XNU inatekeleza ukurasa sifuri wa ngumu ambao unahakikisha ukurasa wa kwanza (ukurasa wa kwanza tu) wa kumbukumbu haupatikani (isipokuwa kwa i386). Binary inaweza kukidhi mahitaji haya kwa kutengeneza __PAGEZERO ndogo (kwa kutumia -pagezero_size
) kufunika kwanza 4k na kuwa na kumbukumbu ya 32bit iliyobaki inayopatikana katika hali ya mtumiaji na hali ya kernel.
__TEXT
: Ina mimbo inayoweza kutekelezwa na kusomwa na kutekelezwa (siyo inayoweza kuandikwa). Sehemu za kawaida za kipande hiki:
__text
: Mimbo ya kanuni iliyokompiliwa
__const
: Data ya kudumu (soma tu)
__[c/u/os_log]string
: Konstanti za herufi za C, Unicode, au os logs
__stubs
na __stubs_helper
: Husika wakati wa mchakato wa kupakia maktaba za kudumu
__unwind_info
: Data ya kufungua mizunguko.
Tafadhali elewa kuwa yaliyomo yote haya yamesainiwa lakini pia yameainishwa kama yanayoweza kutekelezwa (ikiumba chaguzi zaidi za kutumia sehemu ambazo hazihitaji lazima haki hii, kama sehemu zilizotengwa kwa herufi).
__DATA
: Ina data inayoweza kusomwa na kuandikwa (siyo inayoweza kutekelezwa).
__got:
Jedwali la Kielekezi cha Kijumla
__nl_symbol_ptr
: Alama ya ishara isiyo wavivu (inayobana wakati wa kupakia)
__la_symbol_ptr
: Alama ya ishara wavivu (inayobana wakati wa matumizi)
__const
: Inapaswa kuwa data isiyoweza kubadilishwa (sio kweli)
__cfstring
: Herufi za CoreFoundation
__data
: Vigezo vya kawaida (ambavyo vimeanzishwa)
__bss
: Vigezo vya tuli (ambavyo havijaanzishwa)
__objc_*
(__objc_classlist, __objc_protolist, nk): Taarifa zinazotumiwa na muda wa Objective-C
__DATA_CONST
: __DATA.__const haihakikishiwi kuwa ya kudumu (ruhusa ya kuandika), wala viashiria vingine na jedwali la Kielekezi cha Kijumla. Sehemu hii inafanya __const
, baadhi ya waanzilishi na jedwali la Kielekezi cha Kijumla (baada ya kutatuliwa) kuwa soma tu kwa kutumia mprotect
.
__LINKEDIT
: Ina taarifa kwa kiungo (dyld) kama vile, alama, herufi, na maktaba za uhamishaji. Ni chombo cha jumla cha yaliyomo ambayo hayamo katika __TEXT
au __DATA
na yaliyomo yake yanaelezwa katika amri zingine za kupakia.
Taarifa za dyld: Rebase, Opcodes za kubana zisizo wavivu/wavivu/dhaifu na habari ya kuuza
Kuanza kwa Kazi: Jedwali la anwani za kuanza za kazi
Data Ndani ya Kanuni: Visiwa vya data katika __text
Jedwali la Alama: Alama katika binary
Jedwali la Alama Isiyokuwa ya Moja kwa Moja: Alama za kielekezi/stub
Jedwali la Herufi
Saini ya Kanuni
__OBJC
: Ina taarifa zinazotumiwa na muda wa Objective-C. Ingawa taarifa hii inaweza kupatikana pia katika sehemu ya __DATA, ndani ya sehemu mbalimbali za __objc_*.
__RESTRICT
: Sehemu bila yaliyomo yenye sehemu moja tu inayoitwa __restrict
(pia tupu) ambayo inahakikisha kwamba wakati wa kukimbia binary, itapuuza viwango vya mazingira vya DYLD.
Kama ilivyowezekana kuona katika kanuni, sehemu pia zinaunga mkono bendera (ingawa mara nyingi hazitumiwi sana):
SG_HIGHVM
: Msingi pekee (haikutumiwa)
SG_FVMLIB
: Haikutumiwa
SG_NORELOC
: Sehemu haina uhamishaji
SG_PROTECTED_VERSION_1
: Ufichaji. Hutumiwa kwa mfano na Finder kuficha maandishi ya sehemu ya __TEXT
.
LC_UNIXTHREAD/LC_MAIN
LC_MAIN
inaingiza sehemu ya kuingia katika sifa ya entryoff. Wakati wa kupakia, dyld tu inaongeza thamani hii kwenye (kumbukumbu) msingi wa binary, kisha inahamia kwenye maagizo haya kuanza utekelezaji wa kanuni ya binary.
LC_UNIXTHREAD
ina thamani ambazo kisajili kinapaswa kuwa nacho wakati wa kuanza mnyororo wa kazi kuu. Hii tayari imepitwa na wakati lakini dyld
bado inaitumia. Inawezekana kuona thamani za visajili vilivyowekwa na hii kwa:
LC_CODE_SIGNATURE
Ina taarifa kuhusu sahihi ya nambari ya faili ya Macho-O. Ina offset tu ambayo inaelekeza kwenye blob ya sahihi. Kawaida iko mwishoni mwa faili. Hata hivyo, unaweza kupata baadhi ya taarifa kuhusu sehemu hii katika chapisho hili la blogu na hii gists.
LC_ENCRYPTION_INFO[_64]
Inasaidia kwa kificho cha kuficha faili. Hata hivyo, bila shaka, ikiwa mshambuliaji anafanikiwa kuhatarisha mchakato, ataweza kudump kumbukumbu bila kufichwa.
LC_LOAD_DYLINKER
Ina njia ya kutekelezeka ya kiungo cha kudhibiti ambayo inafanya ramani maktaba zinazoshirikiwa kwenye nafasi ya anwani ya mchakato. Thamani daima inawekwa kwa /usr/lib/dyld
. Ni muhimu kutambua kwamba katika macOS, ramani ya dylib hufanyika katika mode ya mtumiaji, sio katika mode ya kernel.
LC_IDENT
Imepitwa na wakati lakini ikipangwa kuzalisha dumps wakati wa mshtuko, kudump kwa msingi wa Mach-O hufanywa na toleo la kernel linawekwa katika amri ya LC_IDENT
.
LC_UUID
UUID Isiyotabirika. Ni muhimu kwa chochote moja kwa moja lakini XNU inahifadhi na habari nyingine ya mchakato. Inaweza kutumika katika ripoti za ajali.
LC_DYLD_ENVIRONMENT
Inaruhusu kuonyesha mazingira ya mazingira kwa dyld kabla ya mchakato kutekelezwa. Hii inaweza kuwa hatari sana kwani inaweza kuruhusu kutekeleza nambari ya aina yoyote ndani ya mchakato hivyo amri ya mzigo hii hutumiwa tu katika dyld iliyoundwa na #define SUPPORT_LC_DYLD_ENVIRONMENT
na inazuia usindikaji zaidi tu kwa mazingira ya aina DYLD_..._PATH
inayoeleza njia za mzigo.
LC_LOAD_DYLIB
Amri ya mzigo hii inaelezea tegemezi la maktaba ya kudhibiti ambayo inawaagiza mzigo (dyld) kwa kupakia na kuunganisha maktaba hiyo. Kuna amri ya mzigo ya LC_LOAD_DYLIB
kwa kila maktaba ambayo faili ya Mach-O inahitaji.
Amri ya mzigo hii ni muundo wa aina dylib_command
(ambao una struct dylib, ukiainisha maktaba ya kudhibiti inayotegemea halisi):
Ungepata habari hii pia kutoka kwa cli kwa:
Baadhi ya maktaba zinazohusiana na zisizo za zisizo za zisizo ni:
DiskArbitration: Kufuatilia diski za USB
AVFoundation: Kukamata sauti na video
CoreWLAN: Uchunguzi wa Wifi.
Mach-O binary inaweza kuwa na moja au zaidi constructors, ambazo zitafanywa kabla ya anwani iliyoainishwa katika LC_MAIN. Offsets ya wajenzi wowote zinashikiliwa katika sehemu ya __mod_init_func ya segimenti ya __DATA_CONST.
Katikati ya faili kuna eneo la data, ambalo linaundwa na sehemu kadhaa kama ilivyoelezwa katika eneo la amri za mzigo. Aina mbalimbali za sehemu za data zinaweza kuhifadhiwa ndani ya kila segimenti, na kila sehemu inashikilia kanuni au data maalum kwa aina.
Data ni sehemu inayohusisha habari zote ambazo zinapakiwa na amri za mzigo LC_SEGMENTS_64
Hii ni pamoja na:
Jedwali la kazi: Ambalo linashikilia habari kuhusu kazi za programu.
Jedwali la alama: Ambalo lina habari kuhusu kazi za nje zinazotumiwa na binary
Pia inaweza kuwa na kazi za ndani, majina ya vitu, na zaidi.
Ili kuangalia unaweza kutumia chombo cha Mach-O View:
Au kutoka kwa cli:
Katika segimenti ya __TEXT
(r-x):
__objc_classname
: Majina ya darasa (herufi)
__objc_methname
: Majina ya mbinu (herufi)
__objc_methtype
: Aina za mbinu (herufi)
Katika segimenti ya __DATA
(rw-):
__objc_classlist
: Pointa kwa darasa zote za Objective-C
__objc_nlclslist
: Pointa kwa Darasa za Objective-C zisizo za uvivu
__objc_catlist
: Pointa kwa Jamii
__objc_nlcatlist
: Pointa kwa Jamii zisizo za uvivu
__objc_protolist
: Orodha ya Itifaki
__objc_const
: Data ya kudumu
__objc_imageinfo
, __objc_selrefs
, objc__protorefs
...
_swift_typeref
, _swift3_capture
, _swift3_assocty
, _swift3_types, _swift3_proto
, _swift3_fieldmd
, _swift3_builtin
, _swift3_reflstr