Introduction to x64
Εισαγωγή στο x64
Το x64, επίσης γνωστό ως x86-64, είναι μια αρχιτεκτονική επεξεργαστή 64-bit που χρησιμοποιείται κυρίως στους υπολογιστές επιφάνειας εργασίας και σε εξυπηρετητές. Προέρχεται από την αρχιτεκτονική x86 που παρήγαγε η Intel και υιοθετήθηκε αργότερα από την AMD με το όνομα AMD64, είναι η κυρίαρχη αρχιτεκτονική στους προσωπικούς υπολογιστές και σε εξυπηρετητές σήμερα.
Καταχωρητές
Το x64 επεκτείνει την αρχιτεκτονική x86, προσφέροντας 16 καταχωρητές γενικής χρήσης με ετικέτες rax
, rbx
, rcx
, rdx
, rbp
, rsp
, rsi
, rdi
και r8
έως r15
. Κάθε ένας από αυτούς μπορεί να αποθηκεύσει μια τιμή 64-bit (8-byte). Αυτοί οι καταχωρητές έχουν επίσης υπο-καταχωρητές 32-bit, 16-bit και 8-bit για συμβατότητα και συγκεκριμένες εργασίες.
rax
- Χρησιμοποιείται παραδοσιακά για τις τιμές επιστροφής από συναρτήσεις.rbx
- Συχνά χρησιμοποιείται ως καταχωρητής βάσης για λειτουργίες μνήμης.rcx
- Χρησιμοποιείται συνήθως για μετρητές βρόχων.rdx
- Χρησιμοποιείται σε διάφορους ρόλους συμπεριλαμβανομένων των επεκτεινόμενων αριθμητικών λειτουργιών.rbp
- Δείκτης βάσης για το πλαίσιο στοίβας.rsp
- Δείκτης στοίβας, παρακολουθεί την κορυφή της στοίβας.rsi
καιrdi
- Χρησιμοποιούνται για τους δείκτες πηγής και προορισμού σε λειτουργίες συμβολοσειράς/μνήμης.r8
έωςr15
- Επιπλέον καταχωρητές γενικής χρήσης που εισήχθησαν στο x64.
Σύμβαση Κλήσης
Η σύμβαση κλήσης x64 διαφέρει μεταξύ λειτουργικών συστημάτων. Για παράδειγμα:
Windows: Οι πρώτες τέσσερις παράμετροι περνιούνται στους καταχωρητές
rcx
,rdx
,r8
καιr9
. Επιπλέον παράμετροι προστίθενται στη στοίβα. Η τιμή επιστροφής βρίσκεται στονrax
.System V (συνηθισμένα χρησιμοποιούμενο σε συστήματα UNIX-like): Οι πρώτες έξι ακέραιες ή δείκτες παράμετροι περνιούνται στους καταχωρητές
rdi
,rsi
,rdx
,rcx
,r8
καιr9
. Η τιμή επιστροφής βρίσκεται επίσης στονrax
.
Αν η συνάρτηση έχει περισσότερες από έξι εισόδους, οι υπόλοιπες περνιούνται στη στοίβα. Το RSP, ο δείκτης στοίβας, πρέπει να είναι 16 bytes ευθυγραμμισμένος, που σημαίνει ότι η διεύθυνση στην οποία δείχνει πρέπει να είναι διαιρέσιμη με το 16 πριν συμβεί οποιαδήποτε κλήση. Αυτό σημαίνει ότι συνήθως θα πρέπει να διασφαλίσουμε ότι το RSP είναι σωστά ευθυγραμμισμένο στο shellcode μας πριν κάνουμε μια κλήση συνάρτησης. Ωστόσο, στην πράξη, οι κλήσεις συστήματος λειτουργούν πολλές φορές ακόμα κι αν αυτή η απαίτηση δεν πληροίται.
Σύμβαση Κλήσης στο Swift
Το Swift έχει τη δική του σύμβαση κλήσης που μπορεί να βρεθεί στο https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64
Κοινές Οδηγίες
Οι οδηγίες x64 διαθέτουν ένα πλούσιο σύνολο, διατηρώντας τη συμβατότητα με προηγούμενες οδηγίες x86 και εισάγοντας νέες.
mov
: Μετακίνηση μιας τιμής από έναν καταχωρητή ή τοποθεσία μνήμης σε άλλον.Παράδειγμα:
mov rax, rbx
— Μετακινεί την τιμή από τοrbx
στοrax
.push
καιpop
: Προσθέτει ή αφαιρεί τιμές από/στη στοίβα.Παράδειγμα:
push rax
— Προσθέτει την τιμή στοrax
στη στοίβα.Παράδειγμα:
pop rax
— Αφαιρεί την κορυφαία τιμή από τη στοίβα στοrax
.add
καιsub
: Λειτουργίες πρόσθεσης και αφαίρεσης.Παράδειγμα:
add rax, rcx
— Προσθέτει τις τιμές στοrax
καιrcx
αποθηκεύοντας το αποτέλεσμα στοrax
.mul
καιdiv
: Λειτουργίες πολλαπλασιασμού και διαίρεσης. Σημείωση: αυτές έχουν συγκεκριμένες συμπεριφορές όσον αφορά τη χρήση των τελεστών.call
καιret
: Χρησιμοποιούνται για την κλήση και την επιστροφή από συναρτήσεις.int
: Χρησιμοποιείται για την ενεργοποίηση ενός λογισμικού διακοπής. Π.χ., τοint 0x80
χρησιμοποιήθηκε για κλήσεις συστήματος στο 32-bit x86 Linux.cmp
: Σύγκριση δύο τιμών και ρύθμιση των σημαιών της CPU βάσει του αποτελέσματος.Παράδειγμα:
cmp rax, rdx
— Συγκρίνει τοrax
με τοrdx
.je
,jne
,jl
,jge
, ...: Οδηγίες συνθήκης άλματος που αλλάζουν τη ροή ελέγχου βάσει των αποτελεσμάτων μιας προηγούμενηςcmp
ή δοκιμής.Παράδειγμα: Μετά από μια οδηγία
cmp rax, rdx
,je label
— Αλλάζει στην ετικέταlabel
αν τοrax
είναι ίσο με τοrdx
.syscall
: Χρησιμοποιείται για **
macOS
συσκευές συστήματος
Υπάρχουν διαφορετικές κατηγορίες συσκευών συστήματος, μπορείτε να τις βρείτε εδώ:
Στη συνέχεια, μπορείτε να βρείτε τον αριθμό κάθε συστοιχίας σε αυτήν τη διεύθυνση URL:
Έτσι, για να καλέσετε το open
syscall (5) από την κλάση Unix/BSD πρέπει να προσθέσετε: 0x2000000
Έτσι, ο αριθμός syscall για να καλέσετε το open θα είναι 0x2000005
Shellcodes
Για να μεταγλωττίσετε:
Για να εξάγετε τα bytes:
Last updated