mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-e
This commit is contained in:
parent
c10318ceb9
commit
7054fd6d93
1 changed files with 59 additions and 20 deletions
|
@ -9,8 +9,8 @@
|
|||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα 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) ή στη [**ομάδα τηλεγραφήματος**](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.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -24,14 +24,14 @@ mov ebp, esp
|
|||
pop ebp
|
||||
ret
|
||||
```
|
||||
Και καθώς το **EBP βρίσκεται στη στοίβα** πριν το EIP είναι δυνατό να το ελέγξετε ελέγχοντας τη στοίβα.
|
||||
Και καθώς το **EBP βρίσκεται στη στοίβα** πριν το EIP είναι δυνατό να το ελέγχετε ελέγχοντας τη στοίβα.
|
||||
|
||||
### EBP2Ret
|
||||
|
||||
Αυτή η τεχνική είναι ιδιαίτερα χρήσιμη όταν μπορείτε **να τροποποιήσετε τον καταχωρητή EBP αλλά δεν έχετε άμεσο τρόπο να αλλάξετε τον καταχωρητή EIP**. Εκμεταλλεύεται τη συμπεριφορά των συναρτήσεων όταν ολοκληρώνουν την εκτέλεσή τους.
|
||||
|
||||
Αν, κατά την εκτέλεση της `fvuln`, καταφέρετε να εισάγετε ένα **ψεύτικο EBP** στη στοίβα που δείχνει σε μια περιοχή στη μνήμη όπου βρίσκεται η διεύθυνση του shellcode σας (συν τέσσερα bytes για τη λειτουργία `pop`), μπορείτε να ελέγξετε έμμεσα τον EIP. Καθώς η `fvuln` επιστρέφει, το ESP ορίζεται σε αυτή τη δημιουργημένη τοποθεσία, και η επόμενη λειτουργία `pop` μειώνει το ESP κατά 4, **καθιστώντας το να δείχνει αποτελεσματικά σε μια διεύθυνση που έχει αποθηκεύσει ο επιτιθέμενος εκεί.**\
|
||||
Σημειώστε ότι **χρειάζεστε να γνωρίζετε 2 διευθύνσεις**: Εκεί όπου θα πάει το ESP, όπου θα χρειαστεί να γράψετε τη διεύθυνση που δείχνει το ESP.
|
||||
Αν, κατά την εκτέλεση της `fvuln`, καταφέρετε να εισάγετε ένα **ψεύτικο EBP** στη στοίβα που δείχνει σε μια περιοχή στη μνήμη όπου βρίσκεται η διεύθυνση του shellcode σας (συν τέσσερα bytes για τη λειτουργία `pop`), μπορείτε να ελέγχετε έμμεσα τον EIP. Καθώς η `fvuln` επιστρέφει, το ESP ορίζεται σε αυτή την κατασκευασμένη τοποθεσία, και η επόμενη λειτουργία `pop` μειώνει το ESP κατά 4, **κάνοντάς το να δείχνει αποτελεσματικά σε μια διεύθυνση που έχει αποθηκευτεί από τον επιτιθέμενο εκεί.**\
|
||||
Σημειώστε πώς **χρειάζεστε να γνωρίζετε 2 διευθύνσεις**: Εκεί όπου θα πάει το ESP, όπου θα χρειαστεί να γράψετε τη διεύθυνση που δείχνει το ESP.
|
||||
|
||||
#### Κατασκευή Εκμετάλλευσης
|
||||
|
||||
|
@ -42,25 +42,25 @@ ret
|
|||
* Μια έγκυρη διεύθυνση [**ONE\_GADGET**](https://github.com/david942j/one\_gadget).
|
||||
* Η διεύθυνση της **`system()`** ακολουθούμενη από **4 άχρηστα bytes** και τη διεύθυνση του `"/bin/sh"` (x86 bits).
|
||||
* Η διεύθυνση ενός **gadget `jump esp;`** ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) ακολουθούμενη από το **shellcode** για εκτέλεση.
|
||||
* Κάποια [**αλυσίδα ROP**](../rop-return-oriented-programing/).
|
||||
* Κάποια [**αλυσίδα ROP**](../rop-return-oriented-programing/)
|
||||
|
||||
Θυμηθείτε ότι πριν από οποιαδήποτε από αυτές τις διευθύνσεις στο ελεγχόμενο μέρος της μνήμης, πρέπει να υπάρχουν **`4` bytes** λόγω του **`pop`** μέρους της εντολής `leave`. Θα ήταν δυνατό να καταχραστείτε αυτά τα 4B για να ορίσετε ένα **δεύτερο ψεύτικο EBP** και να συνεχίσετε τον έλεγχο της εκτέλεσης.
|
||||
|
||||
#### Εκμετάλλευση Off-By-One
|
||||
|
||||
Υπάρχει μια συγκεκριμένη παραλλαγή αυτής της τεχνικής που είναι γνωστή ως "Off-By-One Exploit". Χρησιμοποιείται όταν μπορείτε **να τροποποιήσετε μόνο το λιγότερο σημαντικό byte του EBP**. Σε τέτοιες περιπτώσεις, η τοποθεσία μνήμης που αποθηκεύει τη διεύθυνση προς την οποία θα πρέπει να πηδήξετε με το **`ret`** πρέπει να μοιράζεται τα πρώτα τρία bytes με τον EBP, επιτρέποντας μια παρόμοια χειραγώγηση με πιο περιορισμένες συνθήκες.\
|
||||
Συνήθως τροποποιείται το byte 0x00 για να πηδήξει όσο το δυνατόν πιο μακριά.
|
||||
Υπάρχει μια συγκεκριμένη παραλλαγή αυτής της τεχνικής που είναι γνωστή ως "Off-By-One Exploit". Χρησιμοποιείται όταν μπορείτε **να τροποποιήσετε μόνο το λιγότερο σημαντικό byte του EBP**. Σε τέτοιες περιπτώσεις, η τοποθεσία μνήμης που αποθηκεύει τη διεύθυνση προς την οποία θα πρέπει να μεταβεί με το **`ret`** πρέπει να μοιράζεται τα πρώτα τρία bytes με το EBP, επιτρέποντας μια παρόμοια χειραγώγηση με περισσότερους περιορισμένους όρους.\
|
||||
Συνήθως τροποποιείται το byte 0x00 για να μεταβεί όσο το δυνατόν πιο μακριά.
|
||||
|
||||
Επίσης, είναι συνηθισμένο να χρησιμοποιείται ένα RET sled στη στοίβα και να τοποθετείτε την πραγματική αλυσίδα ROP στο τέλος για να είναι πιο πιθανό να δείχνει το νέο ESP μέσα στο RET SLED και να εκτελεστεί η τελική αλυσίδα ROP.
|
||||
Επίσης, είναι συνηθισμένο να χρησιμοποιείται ένα RET sled στη στοίβα και να τοποθετείται η πραγματική αλυσίδα ROP στο τέλος για να είναι πιο πιθανό να δείχνει το νέο ESP μέσα στο RET SLED και να εκτελείται η τελική αλυσίδα ROP.
|
||||
|
||||
### **Αλυσίδα EBP**
|
||||
|
||||
Επομένως, τοποθετώντας μια ελεγχόμενη διεύθυνση στην είσοδο `EBP` της στοίβας και μια διεύθυνση στο `EIP` για το `leave; ret`, είναι δυνατό να **μετακινηθεί το `ESP` στην ελεγχόμενη διεύθυνση `EBP` από τη στοίβα**.
|
||||
|
||||
Τώρα, το **`ESP`** ελέγχεται δείχνοντας σε μια επιθυμητή διεύθυνση και η επόμενη εντολή προς εκτέλεση είναι ένα `RET`. Για να καταχραστείτε αυτό, είναι δυνατό να τοποθετήσετε στην ελεγχόμενη θέση ESP αυτό:
|
||||
Τώρα, το **`ESP`** ελέγχεται δείχνοντας σε μια επιθυμητή διεύθυνση και η επόμενη εντολή που θα εκτελεστεί είναι ένα `RET`. Για να καταχραστείτε αυτό, είναι δυνατό να τοποθετήσετε στην ελεγχόμενη θέση του ESP αυτό:
|
||||
|
||||
* **`&(επόμενο ψεύτικο EBP)`** -> Φόρτωση του νέου EBP λόγω του `pop ebp` από την εντολή `leave`
|
||||
* **`system()`** -> Καλείται από `ret`
|
||||
* **`system()`** -> Καλείται από το `ret`
|
||||
* **`&(leave;ret)`** -> Καλείται μετά τη λήξη του συστήματος, θα μετακινήσει το ESP στο ψεύτικο EBP και θα ξεκινήσει ξανά
|
||||
* **`&("/bin/sh")`**-> Παράμετρος για το `system`
|
||||
|
||||
|
@ -106,8 +106,8 @@ print(p.recvline())
|
|||
```
|
||||
## Η EBP ενδέχεται να μη χρησιμοποιείται
|
||||
|
||||
Όπως [**εξηγείται σε αυτήν την ανάρτηση**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), εάν ένα δυαδικό αρχείο έχει μερικές βελτιστοποιήσεις, το **EBP δεν καταφέρνει να ελέγξει το ESP**, επομένως, οποιαδήποτε εκμετάλλευση που λειτουργεί ελέγχοντας το EBP θα αποτύχει βασικά επειδή δεν έχει κανένα πραγματικό αποτέλεσμα.\
|
||||
Αυτό συμβαίνει επειδή το **προλόγιο και το επίλογο αλλάζουν** εάν το δυαδικό αρχείο είναι βελτιστοποιημένο.
|
||||
Όπως [**εξηγείται σε αυτήν την ανάρτηση**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), αν ένα δυαδικό αρχείο μεταγλωττίζεται με κάποιες βελτιστοποιήσεις, το **EBP δεν καταφέρνει να ελέγξει το ESP**, επομένως, οποιαδήποτε εκμετάλλευση που λειτουργεί ελέγχοντας το EBP θα αποτύχει βασικά επειδή δεν έχει κανένα πραγματικό αποτέλεσμα.\
|
||||
Αυτό συμβαίνει επειδή το **προλόγιο και το επίλογο αλλάζουν** αν το δυαδικό αρχείο είναι βελτιστοποιημένο.
|
||||
|
||||
* **Μη βελτιστοποιημένο:**
|
||||
```bash
|
||||
|
@ -131,7 +131,7 @@ add $0x10c,%esp # reduce stack size
|
|||
pop %ebx # restore ebx
|
||||
ret # return
|
||||
```
|
||||
## Άλλοι τρόποι για να ελέγξετε το RSP
|
||||
## Άλλοι τρόποι για να ελέγχετε το RSP
|
||||
|
||||
### **`pop rsp`** gadget
|
||||
|
||||
|
@ -179,9 +179,7 @@ pause()
|
|||
p.sendline(payload)
|
||||
print(p.recvline())
|
||||
```
|
||||
### xchg \<reg>, rsp gadget
|
||||
|
||||
### xchg \<reg>, rsp συσκευή
|
||||
### xchg \<reg>, rsp εργαλείο
|
||||
```
|
||||
pop <reg> <=== return pointer
|
||||
<reg value>
|
||||
|
@ -200,10 +198,51 @@ xchg <reg>, rsp
|
|||
* [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting)
|
||||
* [https://guyinatuxedo.github.io/17-stack\_pivot/dcquals19\_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/dcquals19\_speedrun4/index.html)
|
||||
* 64 bits, off by one exploitation with a rop chain starting with a ret sled
|
||||
* 64 bits, εκμετάλλευση off by one με ένα rop chain που ξεκινά με ένα ret sled
|
||||
* [https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html)
|
||||
* 64 bit, no relro, canary, nx and pie. The program grants a leak for stack or pie and a WWW of a qword. First get the stack leak and use the WWW to go back and get the pie leak. Then use the WWW to create an eternal loop abusing `.fini_array` entries + calling `__libc_csu_fini` ([more info here](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md)). Abusing this "eternal" write, it's written a ROP chain in the .bss and end up calling it pivoting with RBP.
|
||||
* 64 bit, χωρίς relro, canary, nx και pie. Το πρόγραμμα παρέχει ένα διαρροή για το stack ή το pie και ένα WWW ενός qword. Πρώτα πάρτε τη διαρροή του stack και χρησιμοποιήστε το WWW για να πάτε πίσω και να πάρετε τη διαρροή του pie. Στη συνέχεια χρησιμοποιήστε το WWW για να δημιουργήσετε έναν αιώνιο βρόγχο καταχρώμενοι τις καταχωρήσεις `.fini_array` + καλώντας το `__libc_csu_fini` ([περισσότερες πληροφορίες εδώ](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md)). Καταχρώντας αυτήν τη "αιώνια" εγγραφή, γράφεται ένα ROP chain στο .bss και καταλήγει να το καλεί περιστρέφοντας με το RBP.
|
||||
|
||||
## ARM64
|
||||
|
||||
Στο ARM64, οι **πρόλογοι και επίλογοι** των συναρτήσεων **δεν αποθηκεύουν και ανακτούν το καταχωρητή SP** στη στοίβα. Επομένως, από προεπιλογή, **δεν θα μπορείτε να ελέγχετε τον καταχωρητή SP** με τον υπερισχύοντα κατακερματισμό δεδομένων μέσα στη στοίβα.
|
||||
Στο ARM64, οι **πρόλογοι και επίλογοι** των συναρτήσεων **δεν αποθηκεύουν και ανακτούν το SP registry** στη στοίβα. Επιπλέον, η εντολή **`RET`** δεν επιστρέφει στη διεύθυνση που δείχνει το SP, αλλά **στη διεύθυνση μέσα στο `x30`**.
|
||||
|
||||
Συνεπώς, από προεπιλογή, απλά καταχρώμενοι τον επίλογο δεν θα μπορούσατε να ελέγξετε το SP registry με τον υπεργραφόμενο κάποια δεδομένα μέσα στη στοίβα. Και ακόμη κι αν καταφέρετε να ελέγξετε το SP, θα χρειαζόσασταν έναν τρόπο να **ελέγξετε το `x30`** register.
|
||||
|
||||
* πρόλογος
|
||||
|
||||
```armasm
|
||||
sub sp, sp, 16
|
||||
stp x29, x30, [sp] // [sp] = x29; [sp + 8] = x30
|
||||
mov x29, sp // Το FP δείχνει στο frame record
|
||||
```
|
||||
* επίλογος
|
||||
|
||||
```armasm
|
||||
ldp x29, x30, [sp] // x29 = [sp]; x30 = [sp + 8]
|
||||
add sp, sp, 16
|
||||
ret
|
||||
```
|
||||
|
||||
{% hint style="danger" %}
|
||||
Ο τρόπος για να εκτελέσετε κάτι παρόμοιο με το stack pivoting στο ARM64 θα ήταν να μπορείτε να **ελέγχετε το `SP`** (ελέγχοντας κάποιο register του οποίου η τιμή περνά στο `SP` ή επειδή για κάποιο λόγο το `SP` παίρνει τη διεύθυνσή του από τη στοίβα και έχουμε ένα υπερχείλιση) και στη συνέχεια να **καταχρηστείτε τον επίλογο** για να φορτώσετε τον **`x30`** register από έναν **ελεγχόμενο `SP`** και να **`RET`** σε αυτόν.
|
||||
{% endhint %}
|
||||
|
||||
Επίσης, στην ακόλουθη σελίδα μπορείτε να δείτε το ισοδύναμο του **Ret2esp στο ARM64**:
|
||||
|
||||
{% content-ref url="../rop-return-oriented-programing/ret2esp-ret2reg.md" %}
|
||||
[ret2esp-ret2reg.md](../rop-return-oriented-programing/ret2esp-ret2reg.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Άλλοι τρόποι υποστήριξης του HackTricks:
|
||||
|
||||
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
|
||||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα 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.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue