macOS IPC - Inter Process Communication
Last updated
Last updated
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Mach inatumia tasks kama kitengo kidogo cha kushiriki rasilimali, na kila task inaweza kuwa na nyuzi nyingi. Hizi tasks na threads zimepangwa 1:1 kwa mchakato wa POSIX na nyuzi.
Mawasiliano kati ya tasks hufanyika kupitia Mach Inter-Process Communication (IPC), ikitumia njia za mawasiliano za upande mmoja. Ujumbe unahamishwa kati ya ports, ambazo zinafanya kazi kama foleni za ujumbe zinazodhibitiwa na kernel.
Port ni kipengele cha msingi cha Mach IPC. Inaweza kutumika kutuma ujumbe na kupokea ujumbe.
Kila mchakato una meza ya IPC, ambapo inawezekana kupata mach ports za mchakato. Jina la mach port kwa kweli ni nambari (kiashiria kwa kitu cha kernel).
Mchakato pia unaweza kutuma jina la port lenye haki kwa task tofauti na kernel itafanya kuonekana kwa kuingia hii katika meza ya IPC ya task nyingine.
Haki za port, ambazo zinaelezea ni shughuli zipi task inaweza kufanya, ni muhimu kwa mawasiliano haya. Haki zinazowezekana za port ni (mafafanuo kutoka hapa):
Haki ya Kupokea, ambayo inaruhusu kupokea ujumbe uliopelekwa kwa port. Mach ports ni MPSC (mzalishaji mwingi, mtumiaji mmoja) foleni, ambayo inamaanisha kuwa kunaweza kuwa na haki moja ya kupokea kwa kila port katika mfumo mzima (kinyume na mabomba, ambapo michakato mingi inaweza kuwa na viashiria vya faili kwa mwisho wa kusoma wa bomba moja).
Task yenye Haki ya Kupokea inaweza kupokea ujumbe na kuunda Haki za Kutuma, ikiruhusu kutuma ujumbe. Awali, task yenyewe ina Haki ya Kupokea juu ya port yake.
Ikiwa mmiliki wa Haki ya Kupokea anafariki au kuua, haki ya kutuma inakuwa isiyo na maana (jina la kufa).
Haki ya Kutuma, ambayo inaruhusu kutuma ujumbe kwa port.
Haki ya Kutuma inaweza kuigwa hivyo task inayomiliki Haki ya Kutuma inaweza kuiga haki hiyo na kuipa task ya tatu.
Kumbuka kwamba haki za port zinaweza pia kupitishwa kupitia ujumbe wa Mac.
Haki ya Kutuma-mara moja, ambayo inaruhusu kutuma ujumbe mmoja kwa port na kisha inatoweka.
Haki hii haiwezi kuigwa, lakini inaweza kuhamishwa.
Haki ya Seti ya Port, ambayo inaashiria seti ya port badala ya port moja. Kuondoa ujumbe kutoka kwa seti ya port kunamaanisha kuondoa ujumbe kutoka kwa moja ya ports inazozishikilia. Seti za port zinaweza kutumika kusikiliza kwenye ports kadhaa kwa wakati mmoja, kama select
/poll
/epoll
/kqueue
katika Unix.
Jina la Kufa, ambalo si haki halisi ya port, bali ni mahali pa kuweka. Wakati port inaharibiwa, haki zote zilizopo za port kwa port hiyo zinageuka kuwa majina ya kufa.
Tasks zinaweza kuhamisha Haki za KUTUMA kwa wengine, na kuwapa uwezo wa kutuma ujumbe nyuma. Haki za KUTUMA pia zinaweza kuigwa, hivyo task inaweza kuiga na kutoa haki hiyo kwa task ya tatu. Hii, pamoja na mchakato wa kati unaojulikana kama bootstrap server, inaruhusu mawasiliano bora kati ya tasks.
File ports inaruhusu kufunga viashiria vya faili katika ports za Mac (kwa kutumia haki za port za Mach). Inawezekana kuunda fileport
kutoka kwa FD iliyotolewa kwa kutumia fileport_makeport
na kuunda FD kutoka kwa fileport kwa kutumia fileport_makefd
.
Kama ilivyotajwa hapo awali, inawezekana kutuma haki kwa kutumia ujumbe wa Mach, hata hivyo, huwezi kutuma haki bila tayari kuwa na haki ya kutuma ujumbe wa Mach. Hivyo, mawasiliano ya kwanza yanaanzishwa vipi?
Kwa hili, bootstrap server (launchd katika mac) inahusika, kwani kila mtu anaweza kupata Haki ya KUTUMA kwa bootstrap server, inawezekana kuomba haki ya kutuma ujumbe kwa mchakato mwingine:
Task A inaunda port mpya, ikipata Haki ya KUPOKEA juu yake.
Task A, ikiwa ni mmiliki wa Haki ya KUPOKEA, inazalisha Haki ya KUTUMA kwa port.
Task A inaweka kiunganishi na bootstrap server, na inatumia Haki ya KUTUMA kwa port ambayo ilizalisha mwanzoni.
Kumbuka kwamba mtu yeyote anaweza kupata Haki ya KUTUMA kwa bootstrap server.
Task A inatuma ujumbe wa bootstrap_register
kwa bootstrap server ili kuunganisha port iliyotolewa na jina kama com.apple.taska
Task B inashirikiana na bootstrap server ili kutekeleza kuangalia bootstrap kwa jina la huduma (bootstrap_lookup
). Ili bootstrap server iweze kujibu, task B itatumia Haki ya KUTUMA kwa port ambayo ilizalisha awali ndani ya ujumbe wa kuangalia. Ikiwa kuangalia kunafanikiwa, server inagundua Haki ya KUTUMA iliyopokelewa kutoka Task A na kuhamasisha kwa Task B.
Kumbuka kwamba mtu yeyote anaweza kupata Haki ya KUTUMA kwa bootstrap server.
Kwa Haki hii ya KUTUMA, Task B ina uwezo wa kutuma ujumbe kwa Task A.
Kwa mawasiliano ya pande mbili, kawaida task B inaunda port mpya yenye Haki ya KUPOKEA na Haki ya KUTUMA, na inampa Haki ya KUTUMA kwa Task A ili iweze kutuma ujumbe kwa TASK B (mawasiliano ya pande mbili).
Bootstrap server haiwezi kuthibitisha jina la huduma linalodaiwa na task. Hii inamaanisha task inaweza kwa urahisi kujifanya kuwa task yoyote ya mfumo, kama kudai kwa uwongo jina la huduma ya idhini na kisha kuidhinisha kila ombi.
Kisha, Apple inahifadhi majina ya huduma zinazotolewa na mfumo katika faili za usanidi salama, zilizoko katika directories zilizolindwa na SIP: /System/Library/LaunchDaemons
na /System/Library/LaunchAgents
. Pamoja na kila jina la huduma, binary inayohusiana pia inahifadhiwa. Bootstrap server, itaunda na kushikilia Haki ya KUPOKEA kwa kila moja ya majina haya ya huduma.
Kwa huduma hizi zilizopangwa, mchakato wa kuangalia unabadilika kidogo. Wakati jina la huduma linatafutwa, launchd inaanzisha huduma hiyo kwa njia ya kidinari. Mchakato mpya ni kama ifuatavyo:
Task B inaanzisha kuangalia bootstrap kwa jina la huduma.
launchd inakagua ikiwa task inafanya kazi na ikiwa haifanyi, inaanzisha.
Task A (huduma) inafanya kuangalia bootstrap (bootstrap_check_in()
). Hapa, bootstrap server inaunda Haki ya KUTUMA, inashikilia na kuhamasisha Haki ya KUPOKEA kwa Task A.
launchd inagundua Haki ya KUTUMA na kupeleka kwa Task B.
Task B inaunda port mpya yenye Haki ya KUPOKEA na Haki ya KUTUMA, na inampa Haki ya KUTUMA kwa Task A (huduma) ili iweze kutuma ujumbe kwa TASK B (mawasiliano ya pande mbili).
Hata hivyo, mchakato huu unatumika tu kwa tasks za mfumo zilizopangwa. Tasks zisizo za mfumo bado zinafanya kazi kama ilivyoelezwa awali, ambayo inaweza kuruhusu kujifanya.
Kwa hivyo, launchd haipaswi kamwe kuanguka au mfumo mzima utaanguka.
Kazi ya mach_msg
, ambayo kimsingi ni wito wa mfumo, inatumika kutuma na kupokea ujumbe wa Mach. Kazi hii inahitaji ujumbe utakaotumwa kama hoja ya awali. Ujumbe huu lazima uanze na muundo wa mach_msg_header_t
, ukifuatwa na maudhui halisi ya ujumbe. Muundo umefafanuliwa kama ifuatavyo:
Processes possessing a receive right can receive messages on a Mach port. Conversely, the senders are granted a send or a send-once right. The send-once right is exclusively for sending a single message, after which it becomes invalid.
The initial field msgh_bits
is a bitmap:
First bit (most significative) is used to indicate that a message is complex (more on this below)
The 3rd and 4th are used by the kernel
The 5 least significant bits of the 2nd byte from can be used for voucher: another type of port to send key/value combinations.
The 5 least significant bits of the 3rd byte from can be used for local port
The 5 least significant bits of the 4th byte from can be used for remote port
Aina ambazo zinaweza kufafanuliwa katika voucher, port za ndani na za mbali ni (kutoka mach/message.h):
Kwa mfano, MACH_MSG_TYPE_MAKE_SEND_ONCE
inaweza kutumika ku onyesha kwamba haki ya kutuma mara moja inapaswa kutolewa na kuhamasishwa kwa bandari hii. Inaweza pia kufafanuliwa MACH_PORT_NULL
ili kuzuia mpokeaji kuwa na uwezo wa kujibu.
Ili kufikia mawasiliano ya pande mbili kwa urahisi, mchakato unaweza kufafanua bandari ya mach katika kichwa cha ujumbe kinachoitwa bandari ya kujibu (msgh_local_port
) ambapo mpokeaji wa ujumbe anaweza kutuma jibu kwa ujumbe huu.
Kumbuka kwamba aina hii ya mawasiliano ya pande mbili inatumika katika ujumbe wa XPC wanaotarajia jibu (xpc_connection_send_message_with_reply
na xpc_connection_send_message_with_reply_sync
). Lakini kwa kawaida bandari tofauti zinaundwa kama ilivyoelezwa hapo awali ili kuunda mawasiliano ya pande mbili.
Sehemu nyingine za kichwa cha ujumbe ni:
msgh_size
: ukubwa wa pakiti nzima.
msgh_remote_port
: bandari ambayo ujumbe huu umetumwa.
msgh_voucher_port
: vouchers za mach.
msgh_id
: ID ya ujumbe huu, ambayo inatafsiriwa na mpokeaji.
Kumbuka kwamba ujumbe wa mach unatumwa kupitia mach port
, ambayo ni mpokeaji mmoja, wasambazaji wengi njia ya mawasiliano iliyojengwa ndani ya kernel ya mach. Mchakato mwingi unaweza kutuma ujumbe kwa bandari ya mach, lakini wakati wowote ni mchakato mmoja tu unaweza kusoma kutoka kwake.
Ujumbe kisha unaundwa na kichwa cha mach_msg_header_t
kinachofuatiwa na mwili na trailer (ikiwa ipo) na inaweza kutoa ruhusa ya kujibu. Katika kesi hizi, kernel inahitaji tu kupitisha ujumbe kutoka kazi moja hadi nyingine.
Trailer ni habari iliyoongezwa kwa ujumbe na kernel (haiwezi kuwekwa na mtumiaji) ambayo inaweza kutolewa katika kupokea ujumbe kwa kutumia bendera MACH_RCV_TRAILER_<trailer_opt>
(kuna habari tofauti ambazo zinaweza kutolewa).
Hata hivyo, kuna ujumbe wengine wenye ugumu zaidi, kama zile zinazopitisha haki za bandari za ziada au kushiriki kumbukumbu, ambapo kernel pia inahitaji kutuma vitu hivi kwa mpokeaji. Katika kesi hizi, bit muhimu zaidi ya kichwa msgh_bits
imewekwa.
Maelezo yanayoweza kupitishwa yanafafanuliwa katika mach/message.h
:
In 32bits, maelezo yote ni 12B na aina ya maelezo iko kwenye ya 11. Katika 64 bits, saizi zinatofautiana.
Kernel itakopya maelezo kutoka kazi moja hadi nyingine lakini kwanza kuunda nakala katika kumbukumbu ya kernel. Mbinu hii, inayojulikana kama "Feng Shui" imekuwa ikitumiwa vibaya katika exploit kadhaa ili kufanya kernel ikope data katika kumbukumbu yake ikifanya mchakato kutuma maelezo kwa mwenyewe. Kisha mchakato unaweza kupokea ujumbe (kernel itawachilia).
Pia inawezekana kutuma haki za bandari kwa mchakato ulio hatarini, na haki za bandari zitaonekana tu katika mchakato (hata kama haushughuliki nazo).
Kumbuka kwamba bandari zinahusishwa na nafasi ya kazi, hivyo kuunda au kutafuta bandari, nafasi ya kazi pia inatafutwa (zaidi katika mach/mach_port.h
):
mach_port_allocate
| mach_port_construct
: Unda bandari.
mach_port_allocate
pia inaweza kuunda seti ya bandari: haki ya kupokea juu ya kundi la bandari. Kila wakati ujumbe unapopokelewa inaonyeshwa bandari kutoka ambapo ulitoka.
mach_port_allocate_name
: Badilisha jina la bandari (kwa chaguo-msingi nambari ya 32bit)
mach_port_names
: Pata majina ya bandari kutoka kwa lengo
mach_port_type
: Pata haki za kazi juu ya jina
mach_port_rename
: Badilisha jina la bandari (kama dup2 kwa FDs)
mach_port_allocate
: Pata mpya RECEIVE, PORT_SET au DEAD_NAME
mach_port_insert_right
: Unda haki mpya katika bandari ambapo una RECEIVE
mach_port_...
mach_msg
| mach_msg_overwrite
: Kazi zinazotumika kutuma na kupokea ujumbe za mach. Toleo la overwrite linaruhusu kubainisha buffer tofauti kwa kupokea ujumbe (toleo lingine litatumia tu).
Kama kazi mach_msg
na mach_msg_overwrite
ndizo zinazotumika kutuma na kupokea ujumbe, kuweka breakpoint juu yao kutaruhusu kukagua ujumbe zilizotumwa na kupokelewa.
Kwa mfano anza kufuatilia programu yoyote unayoweza kufuatilia kwani itapakia libSystem.B
ambayo itatumia kazi hii.
Ili kupata hoja za mach_msg
angalia register. Hizi ndizo hoja (kutoka mach/message.h):
Pata thamani kutoka kwenye rejista:
Kagua kichwa cha ujumbe ukitazama hoja ya kwanza:
Aina hiyo ya mach_msg_bits_t
ni ya kawaida sana kuruhusu jibu.
The jina ni jina la default lililotolewa kwa bandari (angalia jinsi inavyo ongezeka katika byte 3 za kwanza). ipc-object
ni iliyofichwa kipekee kitambulisho cha bandari.
Pia angalia jinsi bandari zenye haki za send
pekee zinavyokuwa zinatambua mmiliki wake (jina la bandari + pid).
Pia angalia matumizi ya +
kuonyesha kazi nyingine zinazohusiana na bandari hiyo hiyo.
Pia inawezekana kutumia procesxp kuona pia majina ya huduma zilizoregistriwa (ikiwa SIP imezimwa kutokana na hitaji la com.apple.system-task-port
):
You can install this tool in iOS downloading it from http://newosxbook.com/tools/binpack64-256.tar.gz
Kumbuka jinsi mjumbe anavyotenga bandari, kuunda haki ya kutuma kwa jina org.darlinghq.example
na kuisafirisha kwa seva ya bootstrap wakati mjumbe alipoomba haki ya kutuma ya jina hilo na kuitumia kutuma ujumbe.
Kuna bandari maalum ambazo zinaruhusu kufanya vitendo fulani nyeti au kufikia data fulani nyeti ikiwa kazi ina idhini za SEND juu yao. Hii inafanya bandari hizi kuwa za kuvutia kutoka kwa mtazamo wa mshambuliaji si tu kwa sababu ya uwezo wao bali pia kwa sababu inawezekana kushiriki idhini za SEND kati ya kazi.
Bandari hizi zinawakilishwa na nambari.
Haki za SEND zinaweza kupatikana kwa kuita host_get_special_port
na haki za RECEIVE kwa kuita host_set_special_port
. Hata hivyo, simu zote mbili zinahitaji bandari ya host_priv
ambayo ni ya ufikiaji wa root pekee. Zaidi ya hayo, katika siku za nyuma root ilikuwa na uwezo wa kuita host_set_special_port
na kuiba bandari yoyote ambayo iliruhusu kwa mfano kupita saini za msimbo kwa kuiba HOST_KEXTD_PORT
(SIP sasa inazuia hili).
Hizi zimegawanywa katika makundi 2: bandari 7 za kwanza zinamilikiwa na kernel ikiwa ni pamoja na 1 HOST_PORT
, 2 HOST_PRIV_PORT
, 3 HOST_IO_MASTER_PORT
na 7 ni HOST_MAX_SPECIAL_KERNEL_PORT
.
Zile zinazotangulia kuanzia nambari 8 zinamilikiwa na daemons za mfumo na zinaweza kupatikana zilizoelezwa katika host_special_ports.h
.
Bandari ya Host: Ikiwa mchakato una idhini ya SEND juu ya bandari hii anaweza kupata taarifa kuhusu mfumo kwa kuita taratibu zake kama:
host_processor_info
: Pata taarifa za processor
host_info
: Pata taarifa za host
host_virtual_physical_table_info
: Taarifa za meza ya ukurasa wa Virtual/Fizikia (inahitaji MACH_VMDEBUG)
host_statistics
: Pata takwimu za host
mach_memory_info
: Pata mpangilio wa kumbukumbu ya kernel
Bandari ya Host Priv: Mchakato wenye haki ya SEND juu ya bandari hii unaweza kufanya vitendo vya kipekee kama kuonyesha data za boot au kujaribu kupakia nyongeza ya kernel. Mchakato unahitaji kuwa root ili kupata ruhusa hii.
Zaidi ya hayo, ili kuita API ya kext_request
inahitajika kuwa na haki nyingine com.apple.private.kext*
ambazo zinatolewa tu kwa binaries za Apple.
Taratibu nyingine zinazoweza kuitwa ni:
host_get_boot_info
: Pata machine_boot_info()
host_priv_statistics
: Pata takwimu za kipekee
vm_allocate_cpm
: Pata Kumbukumbu ya Fizikia Inayoendelea
host_processors
: Tuma haki kwa processors za host
mach_vm_wire
: Fanya kumbukumbu kuwa ya kudumu
Kwa kuwa root inaweza kufikia ruhusa hii, inaweza kuita host_set_[special/exception]_port[s]
ili kuiba bandari maalum za host au bandari za kipekee.
Inawezekana kuona bandari zote maalum za host kwa kukimbia:
Hizi ni bandari zilizohifadhiwa kwa huduma zinazojulikana. Inawezekana kupata/seti kwa kuwaita task_[get/set]_special_port
. Zinapatikana katika task_special_ports.h
:
From here:
TASK_KERNEL_PORT[task-self send right]: Bandari inayotumika kudhibiti kazi hii. Inatumika kutuma ujumbe unaoathiri kazi. Hii ni bandari inayorejeshwa na mach_task_self (tazama Task Ports hapa chini).
TASK_BOOTSTRAP_PORT[bootstrap send right]: Bandari ya bootstrap ya kazi. Inatumika kutuma ujumbe unaohitaji kurudi kwa bandari nyingine za huduma za mfumo.
TASK_HOST_NAME_PORT[host-self send right]: Bandari inayotumika kuomba taarifa za mwenyeji anayeshikilia. Hii ni bandari inayorejeshwa na mach_host_self.
TASK_WIRED_LEDGER_PORT[ledger send right]: Bandari inayotaja chanzo ambacho kazi hii inapata kumbukumbu yake ya kernel iliyounganishwa.
TASK_PAGED_LEDGER_PORT[ledger send right]: Bandari inayotaja chanzo ambacho kazi hii inapata kumbukumbu yake ya kawaida inayosimamiwa.
Awali Mach haikuwa na "mchakato" ilikuwa na "kazi" ambayo ilichukuliwa kama chombo cha nyuzi. Wakati Mach ilipounganishwa na BSD kila kazi ilihusishwa na mchakato wa BSD. Hivyo kila mchakato wa BSD una maelezo inayoihitaji kuwa mchakato na kila kazi ya Mach pia ina kazi zake za ndani (isipokuwa kwa pid 0 isiyokuwepo ambayo ni kernel_task
).
Kuna kazi mbili za kuvutia zinazohusiana na hii:
task_for_pid(target_task_port, pid, &task_port_of_pid)
: Pata haki ya SEND kwa bandari ya kazi ya kazi inayohusiana na ile iliyoainishwa na pid
na uipe target_task_port
iliyoonyeshwa (ambayo mara nyingi ni kazi ya mwito ambayo imetumia mach_task_self()
, lakini inaweza kuwa bandari ya SEND juu ya kazi tofauti).
pid_for_task(task, &pid)
: Iwapo kuna haki ya SEND kwa kazi, pata ni PID ipi kazi hii inahusiana nayo.
Ili kutekeleza vitendo ndani ya kazi, kazi ilihitaji haki ya SEND
kwa yenyewe ikitumia mach_task_self()
(ambayo inatumia task_self_trap
(28)). Kwa ruhusa hii kazi inaweza kutekeleza vitendo kadhaa kama:
task_threads
: Pata haki ya SEND juu ya bandari zote za kazi za nyuzi za kazi
task_info
: Pata taarifa kuhusu kazi
task_suspend/resume
: Acha au anza tena kazi
task_[get/set]_special_port
thread_create
: Unda nyuzi
task_[get/set]_state
: Dhibiti hali ya kazi
na zaidi yanaweza kupatikana katika mach/task.h
Kumbuka kwamba kwa haki ya SEND juu ya bandari ya kazi ya kazi tofauti, inawezekana kutekeleza vitendo kama hivyo juu ya kazi tofauti.
Zaidi ya hayo, bandari ya task_port pia ni bandari ya vm_map
ambayo inaruhusu kusoma na kudhibiti kumbukumbu ndani ya kazi kwa kazi kama vm_read()
na vm_write()
. Hii inamaanisha kwamba kazi yenye haki za SEND juu ya bandari ya task_port ya kazi tofauti itakuwa na uwezo wa kuingiza msimbo ndani ya kazi hiyo.
Kumbuka kwamba kwa sababu kernel pia ni kazi, ikiwa mtu atafanikiwa kupata ruhusa za SEND juu ya kernel_task
, itakuwa na uwezo wa kufanya kernel itekeleze chochote (jailbreaks).
Piga mach_task_self()
ili kupata jina la bandari hii kwa kazi ya mwito. Bandari hii inarithiwa tu kupitia exec()
; kazi mpya iliyoundwa na fork()
inapata bandari mpya ya kazi (kama kesi maalum, kazi pia inapata bandari mpya ya kazi baada ya exec()
katika binary ya suid). Njia pekee ya kuanzisha kazi na kupata bandari yake ni kufanya "port swap dance" wakati wa kufanya fork()
.
Hizi ndizo vizuizi vya kufikia bandari (kutoka macos_task_policy
kutoka binary AppleMobileFileIntegrity
):
Ikiwa programu ina com.apple.security.get-task-allow
entitlement mchakato kutoka mtumiaji yule yule wanaweza kufikia bandari ya kazi (kawaida huongezwa na Xcode kwa ajili ya ufuatiliaji). Mchakato wa notarization hautaruhusu kwa toleo la uzalishaji.
Programu zenye com.apple.system-task-ports
entitlement zinaweza kupata bandari ya kazi kwa mchakato wowote, isipokuwa kernel. Katika toleo za zamani ilijulikana kama task_for_pid-allow
. Hii inatolewa tu kwa programu za Apple.
Root anaweza kufikia bandari za kazi za programu zisizokuwepo na runtime iliyoimarishwa (na sio kutoka Apple).
Bandari ya jina la kazi: Toleo lisilo na haki za bandari ya kazi. Inarejelea kazi, lakini haiwezeshi kudhibiti. Kitu pekee kinachonekana kupatikana kupitia hiyo ni task_info()
.
Nyuzi pia zina bandari zinazohusiana, ambazo zinaonekana kutoka kwa kazi inayopiga task_threads
na kutoka kwa processor na processor_set_threads
. Haki ya SEND kwa bandari ya nyuzi inaruhusu kutumia kazi kutoka mfumo wa thread_act
, kama:
thread_terminate
thread_[get/set]_state
act_[get/set]_state
thread_[suspend/resume]
thread_info
...
Nyuzi yoyote inaweza kupata bandari hii kwa kupiga mach_thread_sef
.
Unaweza kupata shellcode kutoka:
Introduction to ARM64v8Kusanya programu ya awali na kuongeza entitlements ili uweze kuingiza msimbo na mtumiaji yule yule (ikiwa sivyo utahitaji kutumia sudo).