Translated ['binary-exploitation/heap/bins-and-memory-allocations.md', '

This commit is contained in:
Translator 2024-06-13 00:52:22 +00:00
parent 886b119a96
commit b69950514f
5 changed files with 143 additions and 74 deletions

View file

@ -731,6 +731,7 @@
* [Use After Free](binary-exploitation/heap/use-after-free/README.md)
* [First Fit](binary-exploitation/heap/use-after-free/first-fit.md)
* [Double Free](binary-exploitation/heap/double-free.md)
* [Overwriting a freed chunk](binary-exploitation/heap/overwriting-a-freed-chunk.md)
* [Heap Overflow](binary-exploitation/heap/heap-overflow.md)
* [Unlink Attack](binary-exploitation/heap/unlink-attack.md)
* [Fast Bin Attack](binary-exploitation/heap/fast-bin-attack.md)

View file

@ -2,34 +2,34 @@
<details>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks AWS)</strong></a><strong>!</strong></summary>
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Ερυθρού Συνεργείου HackTricks AWS)</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)**.**
* Ανακαλύψτε [**την Οικογένεια 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>
## Βασικές Πληροφορίες
Για να βελτιωθεί η αποδοτικότητα στον τρόπο αποθήκευσης των κομματιών, κάθε κομμάτι δεν βρίσκεται μόνο σε μία συνδεδεμένη λίστα, αλλά υπάρχουν διάφοροι τύποι. Αυτοί είναι οι bins και υπάρχουν 5 τύποι bins: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) μικροί bins, 63 μεγάλοι bins, 1 unsorted bin, 10 fast bins και 64 tcache bins ανά thread.
Για να βελτιώσουμε την αποδοτικότητα στον τρόπο αποθήκευσης των κομματιών, κάθε κομμάτι δεν βρίσκεται μόνο σε μία συνδεδεμένη λίστα, αλλά υπάρχουν διάφοροι τύποι. Αυτοί είναι οι bins και υπάρχουν 5 τύποι bins: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) μικροί bins, 63 μεγάλοι bins, 1 unsorted bin, 10 fast bins και 64 tcache bins ανά thread.
Η αρχική διεύθυνση για κάθε unsorted, μικρό και μεγάλο bin βρίσκεται μέσα στον ίδιο πίνακα. Το δείκτης 0 δεν χρησιμοποιείται, το 1 είναι το unsorted bin, τα bins 2-64 είναι μικροί bins και τα bins 65-127 είναι μεγάλοι bins.
### Tcache (Κρυφή Μνήμη ανά Thread)
Ακόμα κι αν τα threads προσπαθούν να έχουν τη δική τους στοίβα (δείτε [Αρένες](bins-and-memory-allocations.md#arenas) και [Υποστοίβες](bins-and-memory-allocations.md#subheaps)), υπάρχει η πιθανότητα ότι ένας διεργασία με πολλά threads (όπως ένας web server) **θα μοιραστεί τη στοίβα με άλλα threads**. Σε αυτήν την περίπτωση, η κύρια λύση είναι η χρήση **κλειδαριών**, οι οποίες μπορεί **να επιβραδύνουν σημαντικά τα threads**.
Ακόμα κι αν τα threads προσπαθούν να έχουν τη δική τους στοίβα (δείτε [Αρένες](bins-and-memory-allocations.md#arenas) και [Υποστοίβες](bins-and-memory-allocations.md#subheaps)), υπάρχει η πιθανότητα ότι ένας διεργασία με πολλά threads (όπως ένας web server) **θα μοιραστεί τη στοίβα με άλλα threads**. Σε αυτήν την περίπτωση, η κύρια λύση είναι η χρήση **κλειδαριών**, οι οποίες μπορεί να **επιβραδύνουν σημαντικά τα threads**.
Επομένως, ένα tcache είναι παρόμοιο με ένα fast bin ανά thread στον τρόπο που είναι μια **μονόδρομη συνδεδεμένη λίστα** που δεν ενώνει κομμάτια. Κάθε thread έχει **64 μονόδρομους tcache bins**. Κάθε bin μπορεί να έχει ένα μέγιστο των [7 κομματιών ίδιου μεγέθους](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323) κυμαίνονται από [24 έως 1032B σε 64-bit συστήματα και 12 έως 516B σε 32-bit συστήματα](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315).
**Όταν ένα thread απελευθερώνει** ένα κομμάτι, **αν δεν είναι πολύ μεγάλο** για να εκχωρηθεί στο tcache και το αντίστοιχο tcache bin **δεν είναι γεμάτο** (ήδη 7 κομμάτια), **θα εκχωρηθεί εκεί**. Αν δεν μπορεί να πάει στο tcache, θα πρέπει να περιμένει το κλείδωμα της στοίβας για να μπορέσει να εκτελέσει την πράξη απελευθέρωσης παγκοσμίως.
Όταν ένα **κομμάτι εκχωρείται**, αν υπάρχει ένα ελεύθερο κομμάτι του απαιτούμενου μεγέθους στο **Tcache θα το χρησιμοποιήσει**, αν όχι, θα πρέπει να περιμένει το κλείδωμα της στοίβας για να βρει ένα στα γενικά bins ή να δημιουργήσει ένα νέο.\
Υπάρχει επίσης μια βελτιστοποίηση, σε αυτήν την περίπτωση, ενώ έχοντας το κλείδωμα της στοίβας, το thread **θα γεμίσει το Tcache του με κομμάτια στοίβας (7) του απαιτούμενου μεγέθους**, έτσι αν χρειαστεί περισσότερα, θα τα βρει στο Tcache.
Υπάρχει επίσης μια βελτιστοποίηση, σε αυτήν την περίπτωση, ενώ έχει το κλείδωμα της στοίβας, το thread **θα γεμίσει το Tcache του με κομμάτια στοίβας (7) του απαιτούμενου μεγέθους**, έτσι αν χρειαστεί περισσότερα, θα τα βρει στο Tcache.
<details>
@ -48,7 +48,7 @@ free(chunk);
return 0;
}
```
Εκτελέστε το και αποσφαλματώστε το με ένα σημείο αναμονής στον κώδικα επιστροφής (ret opcode) από την κύρια συνάρτηση (main function). Στη συνέχεια, με το gef μπορείτε να δείτε το tcache bin που χρησιμοποιείται:
Μεταγλωτίστε το και αποσφαλματώστε το με ένα σημείο αναστολής στον κωδικό επιστροφής (ret opcode) από την κύρια συνάρτηση (main function). Στη συνέχεια, με το gef μπορείτε να δείτε το tcache bin που χρησιμοποιείται:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -155,18 +155,22 @@ memset (tcache, 0, sizeof (tcache_perthread_struct));
```
</details>
#### Δείκτες Tcache
Το tcache έχει αρκετούς κάδους ανάλογα με το μέγεθος και οι αρχικοί δείκτες προς το **πρώτο κομμάτι κάθε δείκτη και η ποσότητα κομματιών ανά δείκτη βρίσκονται μέσα σε ένα κομμάτι**. Αυτό σημαίνει ότι εντοπίζοντας το κομμάτι με αυτές τις πληροφορίες (συνήθως το πρώτο), είναι δυνατό να βρεθούν όλοι οι αρχικοί δείκτες tcache και η ποσότητα των κομματιών Tcache.
### Γρήγοροι κάδοι
Οι γρήγοροι κάδοι σχεδιάστηκαν για να **επιταχύνουν την εκχώρηση μνήμης για μικρά κομμάτια** κρατώντας πρόσφατα ελευθερωμένα κομμάτια σε μια δομή γρήγορης πρόσβασης. Αυτοί οι κάδοι χρησιμοποιούν μια προσέγγιση Τελευταίο Μέσα, Πρώτο Έξω (LIFO), που σημαίνει ότι το **πιο πρόσφατα ελευθερωμένο κομμάτι είναι το πρώτο** που θα χρησιμοποιηθεί όταν υπάρχει μια νέα αίτηση εκχώρησης. Αυτή η συμπεριφορά είναι επωφελής για την ταχύτητα, καθώς είναι πιο γρήγορο να εισαχθεί και να αφαιρεθεί από την κορυφή ενός σωρού (LIFO) σε σύγκριση με μια ουρά (FIFO).
Οι γρήγοροι κάδοι σχεδιάστηκαν για να **επιταχύνουν την εκχώρηση μνήμης για μικρά κομμάτια** κρατώντας πρόσφατα ελευθερωμένα κομμάτια σε μια δομή γρήγορης πρόσβασης. Αυτοί οι κάδοι χρησιμοποιούν μια προσέγγιση Τελευταίο-Εισερχόμενο, Πρώτο-Εξερχόμενο (LIFO), που σημαίνει ότι το **πιο πρόσφατα ελευθερωμένο κομμάτι είναι το πρώτο** που θα χρησιμοποιηθεί όταν υπάρχει αίτηση για νέα εκχώρηση. Αυτή η συμπεριφορά είναι επωφελής για την ταχύτητα, καθώς είναι πιο γρήγορο να εισάγετε και να αφαιρέσετε από την κορυφή ενός σωρού (LIFO) σε σύγκριση με μια ουρά (FIFO).
Επιπλέον, **οι γρήγοροι κάδοι χρησιμοποιούν μονόδεσμες λίστες**, όχι διπλά δεσμευμένες, οι οποίες βελτιώνουν περαιτέρω την ταχύτητα. Δεδομένου ότι τα κομμάτια στους γρήγορους κάδους δεν συγχωνεύονται με γείτονες, δεν υπάρχει ανάγκη για μια πολύπλοκη δομή που επιτρέπει την αφαίρεση από τη μέση. Μια μονόδεσμη λίστα είναι απλούστερη και ταχύτερη για αυτές τις λειτουργίες.
Επιπλέον, **οι γρήγοροι κάδοι χρησιμοποιούν μονόδεσμες λίστες**, όχι διπλές, οι οποίες βελτιώνουν περαιτέρω την ταχύτητα. Δεδομένου ότι τα κομμάτια στους γρήγορους κάδους δεν συγχωνεύονται με γείτονες, δεν χρειάζεται μια πολύπλοκη δομή που επιτρέπει την αφαίρεση από τη μέση. Μια μονόδεσμη λίστα είναι απλούστερη και ταχύτερη για αυτές τις λειτουργίες.
Βασικά, αυτό που συμβαίνει εδώ είναι ότι η κεφαλίδα (ο δείκτης προς το πρώτο κομμάτι προς έλεγχο) δείχνει πάντα στο πιο πρόσφατα ελευθερωμένο κομμάτι αυτού του μεγέθους. Έτσι:
* Όταν εκχωρείται ένα νέο κομμάτι αυτού του μεγέθους, η κεφαλίδα δείχνει ένα ελεύθερο κομμάτι για χρήση. Δεδομένου ότι αυτό το ελεύθερο κομμάτι δείχνει στο επόμενο που θα χρησιμοποιηθεί, αυτή η διεύθυνση αποθηκεύεται στην κεφαλίδα ώστε η επόμενη εκχώρηση να ξέρει πού να πάρει ένα διαθέσιμο κομμάτι
* Όταν ένα κομμάτι ελευθερώνεται, το ελεύθερο κομμάτι θα αποθηκεύσει τη διεύθυνση του τρέχοντος διαθέσιμου κομματιού και η διεύθυνση αυτού του νεοελευθερωμένου κομματιού θα τεθεί στην κεφαλίδα
* Όταν εκχωρείται ένα νέο κομμάτι αυτού του μεγέθους, η κεφαλίδα δείχνει ένα ελεύθερο κομμάτι για χρήση. Δεδομένου ότι αυτό το ελεύθερο κομμάτι δείχνει στο επόμενο κομμάτι προς χρήση, αυτή η διεύθυνση αποθηκεύεται στην κεφαλίδα ώστε η επόμενη εκχώρηση να ξέρει πού να βρει ένα διαθέσιμο κομμάτι
* Όταν ένα κομμάτι ελευθερώνεται, το ελεύθερο κομμάτι θα αποθηκεύσει τη διεύθυνση προς το τρέχον διαθέσιμο κομμάτι και η διεύθυνση προς αυτό το νεοελευθερωμένο κομμάτι θα τεθεί στην κεφαλίδα
Το μέγιστο μέγεθος μιας συνδεδεμένης λίστας είναι `0x80` και οργανώνονται έτσι ώστε ένα κομμάτι μεγέθους `0x20-0x2f` θα βρίσκεται στο δείκτη `0`, ένα κομμάτι μεγέθους `0x30-0x3f` θα βρισκόταν στο δείκτη `1`...
Το μέγιστο μέγεθος μιας συνδεδεμένης λίστας είναι `0x80` και οργανώνονται έτσι ώστε ένα κομμάτι μεγέθους `0x20-0x2f` θα βρίσκεται στον δείκτη `0`, ένα κομμάτι μεγέθους `0x30-0x3f` θα βρίσκεται στον δείκτη `1`...
{% hint style="danger" %}
Τα κομμάτια στους γρήγορους κάδους δεν ορίζονται ως διαθέσιμα, έτσι διατηρούνται ως κομμάτια γρήγορων κάδων για κάποιο χρονικό διάστημα αντί να είναι σε θέση να συγχωνευτούν με άλλα ελεύθερα κομμάτια που τα περιβάλλουν.
@ -236,7 +240,7 @@ return 0;
```
Σημειώστε πως εκχωρούμε και απελευθερώνουμε 8 τμήματα με τον ίδιο μέγεθος έτσι ώστε να γεμίσει το tcache και το όγδοο να αποθηκευτεί στο γρήγορο τμήμα.
Μεταγλωττίστε το και εντοπίστε το με ένα σημείο αναμονής στον κώδικα επιστροφής (ret opcode) από την κύρια συνάρτηση. Στη συνέχεια, με το gef μπορείτε να δείτε το γέμισμα του tcache bin και το ένα τμήμα στο γρήγορο bin:
Μεταγλωττίστε το και αποσφαλματώστε το με ένα σημείο ανακοπής στον κώδικα επιστροφής (ret opcode) από την κύρια συνάρτηση. Στη συνέχεια, με το gef μπορείτε να δείτε το γέμισμα του tcache bin και το ένα τμήμα στο γρήγορο τμήμα:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -249,13 +253,13 @@ Fastbins[idx=1, size=0x30] 0x00
### Μη ταξινομημένος κάδος
Ο μη ταξινομημένος κάδος είναι ένας **προσωρινός αποθηκευτικός χώρος** που χρησιμοποιείται από τον διαχειριστή σωρού για να κάνει την εκχώρηση μνήμης πιο γρήγορη. Έτσι λειτουργεί: Όταν ένα πρόγραμμα απελευθερώνει ένα κομμάτι μνήμης και αν αυτό το κομμάτι δεν μπορεί να εκχωρηθεί σε έναν tcache ή γρήγορο κάδο και δεν συγκρούεται με το κομμάτι κορυφής, ο διαχειριστής σωρού δεν το τοποθετεί αμέσως σε ένα συγκεκριμένο μικρό ή μεγάλο κάδο. Αντίθετα, πρώτα προσπαθεί να **συγχωνεύσει το με κοντινά ελεύθερα κομμάτια** για να δημιουργήσει ένα μεγαλύτερο τμήμα ελεύθερης μνήμης. Στη συνέχεια, τοποθετεί αυτό το νέο κομμάτι σε ένα γενικό κάδο που ονομάζεται "μη ταξινομημένος κάδος".
Ο μη ταξινομημένος κάδος είναι ένας **προσωρινός αποθηκευτικός χώρος** που χρησιμοποιείται από τον διαχειριστή σωρού για να κάνει την εκχώρηση μνήμης πιο γρήγορη. Έτσι λειτουργεί: Όταν ένα πρόγραμμα απελευθερώνει ένα κομμάτι μνήμης και αυτό το κομμάτι δεν μπορεί να εκχωρηθεί σε έναν tcache ή fast bin και δεν συγκρούεται με το κομμάτι κορυφής, ο διαχειριστής σωρού δεν το τοποθετεί αμέσως σε ένα συγκεκριμένο μικρό ή μεγάλο κάδο. Αντίθετα, πρώτα προσπαθεί να **συγχωνεύσει το με κοντινά ελεύθερα κομμάτια** για να δημιουργήσει ένα μεγαλύτερο τμήμα ελεύθερης μνήμης. Στη συνέχεια, τοποθετεί αυτό το νέο κομμάτι σε ένα γενικό κάδο που ονομάζεται "μη ταξινομημένος κάδος".
Όταν ένα πρόγραμμα **ζητά μνήμη**, ο διαχειριστής σωρού **ελέγχει τον μη ταξινομημένο κάδο** για να δει αν υπάρχει ένα κομμάτι αρκετά μεγάλο. Αν βρει ένα, το χρησιμοποιεί αμέσως. Αν δε βρει ένα κατάλληλο κομμάτι στον μη ταξινομημένο κάδο, μεταφέρει όλα τα κομμάτια σε αυτή τη λίστα στους αντίστοιχους κάδους τους, είτε μικρούς είτε μεγάλους, με βάση το μέγεθός τους.
Όταν ένα πρόγραμμα **ζητά μνήμη**, ο διαχειριστής σωρού **ελέγχει τον μη ταξινομημένο κάδο** για να δει αν υπάρχει ένα κομμάτι αρκετού μεγέθους. Αν βρει ένα, το χρησιμοποιεί αμέσως. Αν δε βρει ένα κατάλληλο κομμάτι στον μη ταξινομημένο κάδο, μεταφέρει όλα τα κομμάτια σε αυτή τη λίστα στους αντίστοιχους τους κάδους, είτε μικρούς είτε μεγάλους, με βάση το μέγεθός τους.
Σημειώστε ότι αν ένα μεγαλύτερο κομμάτι χωριστεί σε 2 μισά και το υπόλοιπο είναι μεγαλύτερο από το MINSIZE, θα τοποθετηθεί πίσω στον μη ταξινομημένο κάδο.
Έτσι, ο μη ταξινομημένος κάδος είναι ένας τρόπος για να επιταχύνει την εκχώρηση μνήμης με τον γρήγορο επαναχρησιμοποίηση πρόσφατα απελευθερωμένης μνήμης και τη μείωση της ανάγκης για χρονοβόρες αναζητήσεις και συγχωνεύσεις.
Έτσι, ο μη ταξινομημένος κάδος είναι ένας τρόπος για ταχεία εκχώρηση μνήμης με την ταχεία επαναχρησιμοποίηση πρόσφατα απελευθερωμένης μνήμης και τη μείωση της ανάγκης για χρονοβόρες αναζητήσεις και συγχωνεύσεις.
{% hint style="danger" %}
Σημειώστε ότι ακόμα κι αν τα κομμάτια ανήκουν σε διαφορετικές κατηγορίες, αν ένα διαθέσιμο κομμάτι συγκρούεται με ένα άλλο διαθέσιμο κομμάτι (ακόμα κι αν αρχικά ανήκουν σε διαφορετικούς κάδους), θα συγχωνευτούν.
@ -263,7 +267,7 @@ Fastbins[idx=1, size=0x30] 0x00
<details>
<summary>Προσθέστε ένα παράδειγμα μη ταξινομημένου κομματιού</summary>
<summary>Προσθήκη παραδείγματος μη ταξινομημένου κομματιού</summary>
```c
#include <stdlib.h>
#include <stdio.h>
@ -291,9 +295,9 @@ free(chunks[i]);
return 0;
}
```
Σημειώστε πως εκχωρούμε και απελευθερώνουμε 9 τμήματα με τον ίδιο μέγεθος έτσι ώστε **να γεμίσει το tcache** και το όγδοο να αποθηκευτεί στο unsorted bin επειδή είναι **πολύ μεγάλο για το fastbin** και το ένατο δεν απελευθερώνεται έτσι ώστε το ένατο και το όγδοο **να μη συγχωνευτούν με το top chunk**.
Σημειώστε πως εκχωρούμε και απελευθερώνουμε 9 τμήματα με τον ίδιο μέγεθος έτσι ώστε να **γεμίσει το tcache** και το όγδοο να αποθηκευτεί στον unsorted κάδο επειδή είναι **πολύ μεγάλο για το fastbin** και το ένατο δεν απελευθερώνεται έτσι ώστε το ένατο και το όγδοο **να μη συγχωνεύονται με το top chunk**.
Μεταγλωττίστε το και αποσφαλματώστε το με ένα σημείο αναμονής στον κωδικό επιστροφής από τη συνάρτηση main. Στη συνέχεια, με το gef μπορείτε να δείτε το γέμισμα του tcache bin και το ένα τμήμα στο unsorted bin:
Μεταγλωττίστε το και αποσφαλματώστε το με ένα σημείο διακοπής στον κωδικό επιστροφής (ret opcode) από τη main συνάρτηση. Στη συνέχεια, με το gef μπορείτε να δείτε το γέμισμα του tcache bin και το ένα τμήμα στον unsorted κάδο:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -317,7 +321,7 @@ Fastbins[idx=6, size=0x80] 0x00
Τα μικρά bins είναι ταχύτερα από τα μεγάλα bins αλλά πιο αργά από τα γρήγορα bins.
Κάθε bin από τα 62 θα έχει **κομμάτια με τον ίδιο μέγεθος**: 16, 24, ... (με μέγιστο μέγεθος 504 bytes σε 32bits και 1024 σε 64bits). Αυτό βοηθάει στην ταχύτητα εντοπισμού του bin όπου θα πρέπει να γίνει εκχώρηση χώρου και στην εισαγωγή και αφαίρεση καταχωρήσεων σε αυτές τις λίστες.
Κάθε bin από τα 62 θα έχει **chunks του ίδιου μεγέθους**: 16, 24, ... (με μέγιστο μέγεθος 504 bytes σε 32bits και 1024 σε 64bits). Αυτό βοηθάει στην ταχύτητα εντοπισμού του bin όπου θα πρέπει να γίνει εκχώρηση χώρου και στην εισαγωγή και αφαίρεση καταχωρήσεων σε αυτές τις λίστες.
Έτσι υπολογίζεται το μέγεθος του μικρού bin ανάλογα με το δείκτη του bin:
@ -338,13 +342,7 @@ Fastbins[idx=6, size=0x80] 0x00
+ SMALLBIN_CORRECTION)
```
```c
void *choose_bin(size_t size) {
if (size <= SMALL_BIN_SIZE) {
return small_bin;
} else {
return large_bin;
}
}
Συνάρτηση για την επιλογή μεταξύ μικρών και μεγάλων κάδων:
```
```c
#define bin_index(sz) \
@ -382,9 +380,9 @@ chunks[9] = malloc(0x110);
return 0;
}
```
Σημειώστε πως εκχωρούμε και απελευθερώνουμε 9 τμήματα του ίδιου μεγέθους έτσι ώστε **να γεμίσουν το tcache** και το όγδοο να αποθηκευτεί στον unsorted κάδο επειδή είναι **πολύ μεγάλο για το fastbin** και το ένατο δεν είναι ελεύθερο οπότε το ένατο και το όγδοο **δεν συγχωνεύονται με το top chunk**. Στη συνέχεια εκχωρούμε ένα μεγαλύτερο τμήμα μεγέθους 0x110 το οποίο κάνει **το τμήμα στον unsorted κάδο να πάει στον small κάδο**.
Σημειώστε πως εκχωρούμε και απελευθερώνουμε 9 τμήματα του ίδιου μεγέθους έτσι ώστε **να γεμίσει το tcache** και το όγδοο αποθηκεύεται στον unsorted κάδο επειδή είναι **πολύ μεγάλο για το fastbin** και το ένατο δεν είναι ελεύθερο οπότε το ένατο και το όγδοο **δεν συγχωνεύονται με το top chunk**. Στη συνέχεια εκχωρούμε ένα μεγαλύτερο τμήμα μεγέθους 0x110 το οποίο κάνει **το τμήμα στον unsorted κάδο να πάει στον small κάδο**.
Μεταγλωττίστε το και αποσφαλματώστε το με ένα σημείο διακοπής στον κώδικα επιστροφής (ret opcode) από τη main συνάρτηση. Στη συνέχεια, με το gef μπορείτε να δείτε το γέμισμα του tcache bin και το ένα τμήμα στον small bin:
Μεταγλωττίστε το και αποσφαλματώστε το με ένα σημείο διακοπής στον κωδικό επιστροφής (ret opcode) από τη main συνάρτηση. Στη συνέχεια, με το gef μπορείτε να δείτε το γέμισμα του tcache bin και το ένα τμήμα στον small bin:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -410,9 +408,9 @@ Fastbins[idx=6, size=0x80] 0x00
Αντίθετα με τους μικρούς κάδους, οι οποίοι διαχειρίζονται κομμάτια με σταθερούς μεγέθη, **κάθε μεγάλος κάδος χειρίζεται ένα εύρος μεγεθών κομματιών**. Αυτό είναι πιο ευέλικτο, επιτρέποντας στο σύστημα να προσαρμόζεται σε **διάφορα μεγέθη** χωρίς την ανάγκη για έναν ξεχωριστό κάδο για κάθε μέγεθος.
Σε έναν διαχειριστή μνήμης, οι μεγάλοι κάδοι ξεκινούν από το σημείο όπου τελειώνουν οι μικροί κάδοι. Τα εύρη για τους μεγάλους κάδους μεγαλώνουν σταδιακά, πράγμα που σημαίνει ότι ο πρώτος κάδος μπορεί να καλύπτει κομμάτια από 512 έως 576 bytes, ενώ ο επόμενος καλύπτει από 576 έως 640 bytes. Αυτό το πρότυπο συνεχίζεται, με τον μεγαλύτερο κάδο να περιέχει όλα τα κομμάτια άνω των 1MB.
Σε έναν διαχειριστή μνήμης, οι μεγάλοι κάδοι ξεκινούν από το σημείο που τελειώνουν οι μικροί κάδοι. Τα εύρη για τους μεγάλους κάδους μεγαλώνουν σταδιακά, πράγμα που σημαίνει ότι ο πρώτος κάδος μπορεί να καλύπτει κομμάτια από 512 έως 576 bytes, ενώ ο επόμενος καλύπτει από 576 έως 640 bytes. Αυτό το πρότυπο συνεχίζεται, με τον μεγαλύτερο κάδο να περιέχει όλα τα κομμάτια άνω των 1MB.
Οι μεγάλοι κάδοι είναι πιο αργοί στη λειτουργία σε σύγκριση με τους μικρούς κάδους επειδή πρέπει **να ταξινομήσουν και να αναζητήσουν μέσω μιας λίστας με διαφορετικά μεγέθη κομματιών για να βρουν την καλύτερη ταιριάστηκη** για μια δέσμευση. Όταν ένα κομμάτι εισάγεται σε έναν μεγάλο κάδο, πρέπει να ταξινομηθεί, και όταν γίνεται δέσμευση μνήμης, το σύστημα πρέπει να βρει το σωστό κομμάτι. Αυτή η επιπλέον εργασία τους καθιστά **πιο αργούς**, αλλά επειδή οι μεγάλες δεσμεύσεις είναι λιγότερο συνηθισμένες από τις μικρές, είναι ένα αποδεκτό ανταλλάγμα.
Οι μεγάλοι κάδοι είναι πιο αργοί στη λειτουργία σε σύγκριση με τους μικρούς κάδους επειδή πρέπει **να ταξινομήσουν και να αναζητήσουν μέσω μιας λίστας με διαφορετικά μεγέθη κομματιών για να βρουν την καλύτερη ταιριάστητα** για μια διάθεση. Όταν ένα κομμάτι εισάγεται σε έναν μεγάλο κάδο, πρέπει να ταξινομηθεί, και όταν διατίθεται μνήμη, το σύστημα πρέπει να βρει το σωστό κομμάτι. Αυτή η επιπλέον εργασία τους καθιστά **πιο αργούς**, αλλά αφού οι μεγάλες διαθέσεις είναι λιγότερο συνηθισμένες από τις μικρές, είναι μια αποδεκτή ανταλλαγή.
Υπάρχουν:
@ -425,7 +423,7 @@ Fastbins[idx=6, size=0x80] 0x00
<details>
<summary>Κώδικας μεγέθους μεγάλων κάδων</summary>
<summary>Κώδικες μεγέθους μεγάλων κάδων</summary>
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
@ -484,7 +482,7 @@ return 0;
```
Πραγματοποιούνται 2 μεγάλες δεσμεύσεις μνήμης, στη συνέχεια μια από αυτές απελευθερώνεται (τοποθετώντας τη στον unsorted κάδο) και γίνεται μια μεγαλύτερη δέσμευση (μετακινώντας την ελεύθερη στοιχειώδη από τον unsorted κάδο στον μεγάλο κάδο).
Μεταγλωττίστε το και αποσφαλματώστε το με ένα σημείο διακοπής στον κωδικό επιστροφής (ret opcode) από την κύρια συνάρτηση. Στη συνέχεια, με το gef μπορείτε να δείτε τον tcache κάδο γεμάτο και το ένα κομμάτι στον μεγάλο κάδο:
Μεταγλωττίστε το και εντοπίστε το με ένα σημείο αναμονής στον κώδικα επιστροφής (ret opcode) από την κύρια συνάρτηση. Στη συνέχεια, με το gef μπορείτε να δείτε τον tcache κάδο γεμάτο και το ένα κομμάτι στον μεγάλο κάδο:
```bash
gef➤ heap bin
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -533,14 +531,14 @@ the 2 preceding words to be zero during this interval as well.)
/* Conveniently, the unsorted bin can be used as dummy top on first call */
#define initial_top(M) (unsorted_chunks (M))
```
Βασικά, αυτό είναι ένα τμήμα που περιέχει όλο το διαθέσιμο στη στοίβα. Όταν γίνεται ένα malloc, αν δεν υπάρχει κάποιο διαθέσιμο ελεύθερο τμήμα για χρήση, αυτό το κορυφαίο τμήμα θα μειώνει το μέγεθός του δίνοντας τον απαραίτητο χώρο.\
Ο δείκτης προς το Κορυφαίο Τμήμα αποθηκεύεται στη δομή `malloc_state`.
Βασικά, αυτό είναι ένα τμήμα που περιέχει όλο το διαθέσιμο σωρό. Όταν γίνεται ένα malloc, αν δεν υπάρχει κάποιο διαθέσιμο ελεύθερο τμήμα για χρήση, το τμήμα κορυφής θα μειώνει το μέγεθός του παρέχοντας τον απαραίτητο χώρο.\
Ο δείκτης προς το Τμήμα Κορυφής αποθηκεύεται στη δομή `malloc_state`.
Επιπλέον, στην αρχή, είναι δυνατόν να χρησιμοποιηθεί το μη ταξινομημένο τμήμα ως κορυφαίο τμήμα.
Επιπλέον, στην αρχή, είναι δυνατόν να χρησιμοποιηθεί το τμήμα αταξινόμητων ως το τμήμα κορυφής.
<details>
<summary>Παρατηρήστε το παράδειγμα του Κορυφαίου Τμήματος</summary>
<summary>Παρατήρηση παραδείγματος Τμήματος Κορυφής</summary>
```c
#include <stdlib.h>
#include <stdio.h>
@ -554,7 +552,7 @@ gets(chunk);
return 0;
}
```
Μετά τη μεταγλώττιση και αποσφαλμάτωσή του με ένα σημείο διακοπής στον κωδικό επιστροφής του main, είδα ότι το malloc επέστρεψε τη διεύθυνση: `0xaaaaaaac12a0` και αυτά είναι τα κομμάτια:
Μετά τη μεταγλώττιση και αποσφαλμάτωσή του με ένα σημείο διακοπής στον κωδικό επιστροφής του κύριου προγράμματος, είδα ότι το malloc επέστρεψε τη διεύθυνση: `0xaaaaaaac12a0` και αυτά είναι τα κομμάτια:
```bash
gef➤ heap chunks
Chunk(addr=0xaaaaaaac1010, size=0x290, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
@ -582,7 +580,7 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
## Ροή Εκχώρησης
Κοίτα:
Ρίξτε μια ματιά:
{% content-ref url="heap-memory-functions/malloc-and-sysmalloc.md" %}
[malloc-and-sysmalloc.md](heap-memory-functions/malloc-and-sysmalloc.md)
@ -590,7 +588,7 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
## Ροή Απελευθέρωσης
Κοίτα:
Ρίξτε μια ματιά:
{% content-ref url="heap-memory-functions/free.md" %}
[free.md](heap-memory-functions/free.md)
@ -598,7 +596,7 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
## Έλεγχοι Ασφαλείας Συναρτήσεων Σωρού
Ελέγξτε τους έλεγχους ασφαλείας που πραγματοποιούνται από τις συναρτήσεις που χρησιμοποιούνται εκτενώς στο σωρό στο:
Ελέγξτε τους έλεγχους ασφαλείας που πραγματοποιούνται από τις συναρτήσεις που χρησιμοποιούνται εντατικά στο σωρό στο:
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)

View file

@ -0,0 +1,47 @@
# Αντικατάσταση ενός ελευθερωμένου τμήματος
<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) ή στην [**ομάδα 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).
</details>
Πολλές από τις προτεινόμενες τεχνικές εκμετάλλευσης της στοίβας χρειάζεται να είναι δυνατή η αντικατάσταση δεικτών μέσα σε ελευθερωμένα τμήματα. Ο στόχος αυτής της σελίδας είναι να περιλαμβάνει τις πιθανές ευπάθειες που θα μπορούσαν να παρέχουν αυτήν την πρόσβαση:
### Απλή Χρήση Μετά το Free
Αν είναι δυνατό για τον επιτιθέμενο να **γράψει πληροφορίες σε ένα ελεύθερο τμήμα**, μπορεί να εκμεταλλευτεί αυτό για να αντικαταστήσει τους απαιτούμενους δείκτες.
### Διπλό Free
Αν ο επιτιθέμενος μπορεί να **`free` δύο φορές το ίδιο τμήμα** (ελευθερώνοντας άλλα τμήματα ανάμεσά τους πιθανώς) και να το κάνει **2 φορές στον ίδιο κάδο**, θα ήταν δυνατό για τον χρήστη να **εκχωρήσει το τμήμα αργότερα**, **να γράψει τους απαιτούμενους δείκτες** και στη συνέχεια **να το εκχωρήσει ξανά** ενεργοποιώντας τις ενέργειες του τμήματος που εκχωρήθηκε (π.χ. επίθεση fast bin, επίθεση tcache...)
### Υπερχείλιση Στοίβας
Μπορεί να είναι δυνατό να **υπερχειλιστεί ένα εκχωρημένο τμήμα μετά από ένα ελεύθερο τμήμα** και να τροποποιηθούν κάποιοι κεφαλίδες/δείκτες του.
### Υπερχείλιση Εκτός κατά 1
Σε αυτήν την περίπτωση θα ήταν δυνατό να **τροποποιηθεί το μέγεθος** του επόμενου τμήματος στη μνήμη. Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να **κάνει ένα εκχωρημένο τμήμα να έχει μεγαλύτερο μέγεθος**, στη συνέχεια **να το `free`**, κάνοντας το τμήμα να **προστεθεί σε έναν κάδο διαφορετικού** μεγέθους (μεγαλύτερο), στη συνέχεια να εκχωρήσει το **ψεύτικο μέγεθος**, και η επίθεση θα έχει πρόσβαση σε ένα **τμήμα με ένα μέγεθος που είναι μεγαλύτερο** από αυτό που είναι πραγματικά, **παρέχοντας έτσι μια υπερχείλιση στη στοίβα** (ελέγξτε την προηγούμενη ενότητα).
<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) ή στην [**ομάδα 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).
</details>

View file

@ -2,15 +2,15 @@
<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>
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks AWS)</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) ή στην [**ομάδα 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).
* **Εγγραφείτε** στην 💬 [**ομάδα 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,20 +24,23 @@
Καταρχάς, σημειώστε ότι το Tcache εισήχθη στην έκδοση glibc 2.26.
Η επίθεση **Tcache** που προτάθηκε στη [**σελίδα guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) είναι πολύ παρόμοια με την επίθεση fast bin όπου ο στόχος είναι να αντικατασταθεί ο δείκτης προς το επόμενο τμήμα στο bin μέσα σε ένα ελεύθερο τμήμα με μια τυχαία διεύθυνση, ώστε αργότερα να είναι δυνατή η **εκχώρηση αυτής της συγκεκριμένης διεύθυνσης και ενδεχομένως η αντικατάσταση δεικτών**.
Η επίθεση **Tcache** που προτάθηκε στη σελίδα [**guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) είναι πολύ παρόμοια με την επίθεση fast bin όπου ο στόχος είναι να αντικατασταθεί ο δείκτης προς το επόμενο τμήμα στο bin μέσα σε ένα ελεύθερο τμήμα με μια τυχαία διεύθυνση, ώστε αργότερα να είναι δυνατή η **εκχώρηση αυτής της συγκεκριμένης διεύθυνσης και ενδεχομένως η αντικατάσταση δεικτών**.
Ωστόσο, σήμερα, αν εκτελέσετε το αναφερόμενο κώδικα, θα λάβετε το σφάλμα: **`malloc(): unaligned tcache chunk detected`**. Έτσι, είναι απαραίτητο να γράψετε ως διεύθυνση στον νέο δείκτη μια ευθυγραμμισμένη διεύθυνση (ή να εκτελέσετε αρκετές φορές το δυαδικό αρχείο ώστε η γραμμένη διεύθυνση να είναι πράγματι ευθυγραμμισμένη).
Ωστόσο, σήμερα, αν εκτελέσετε το αναφερόμενο κώδικα, θα λάβετε το σφάλμα: **`malloc(): unaligned tcache chunk detected`**. Έτσι, είναι απαραίτητο να γράψετε ως διεύθυνση στον νέο δείκτη μια ευθυγραμμισμένη διεύθυνση (ή να εκτελέσετε αρκετές φορές το δυαδικό αρχείο ώστε η γραμμένη διεύθυνση να είναι πραγματικά ευθυγραμμισμένη).
<details>
### Επιθέσεις δεικτών Tcache
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Συνήθως είναι δυνατό να βρείτε στην αρχή της στοίβας ένα τμήμα που περιέχει τον **αριθμό των τμημάτων ανά δείκτη** μέσα στο tcache και τη διεύθυνση του **κεφαλαίου τμήματος κάθε δείκτη tcache**. Αν για κάποιο λόγο είναι δυνατό να τροποποιηθούν αυτές οι πληροφορίες, θα ήταν δυνατό να **κάνετε το κεφάλαιο τμήμα κάποιου δείκτη να δείχνει σε μια επιθυμητή διεύθυνση** (όπως το malloc hook) για να εκχωρηθεί αργότερα ένα τμήμα με το μέγεθος του δείκτη και να αντικατασταθούν τα περιεχόμενα του malloc hook σε αυτήν την περίπτωση.
Άλλοι τρόποι υποστήριξης του 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) ή στην [**ομάδα 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).
</details>
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
* **Διαρροή πληροφοριών Libc**: Είναι δυνατό να γεμίσετε τα tcaches, να προσθέσετε ένα τμήμα στη λίστα unsorted, να αδειάσετε το tcache και να **επανα-εκχωρήσετε το τμήμα από τη λίστα unsorted** αλλάζοντας μόνο τα πρώτα 8B, αφήνοντας τη **δεύτερη διεύθυνση προς το libc από το τμήμα ακέραια ώστε να μπορούμε να τη διαβάσουμε**.
* **Επίθεση Tcache**: Το δυαδικό είναι ευάλωτο σε ένα 1B υπερχείλιση στη στοίβα. Αυτό θα εκμεταλλευτείται για να αλλάξει το **κεφαλίδα μεγέθους** ενός εκχωρημένου τμήματος κάνοντάς το μεγαλύτερο. Στη συνέχεια, αυτό το τμήμα θα **ελευθερωθεί**, προσθέτοντάς το στο tcache τμημάτων με το ψευδές μέγεθος. Στη συνέχεια, θα εκχωρηθεί ένα τμήμα με το πλαστό μέγεθος, και το προηγούμενο τμήμα θα **επιστραφεί γνωρίζοντας ότι αυτό το τμήμα ήταν πραγματικά μικρότερο** και αυτό προσφέρει τη δυνατότητα να **αντικατασταθεί ο επόμενος δείκτης στη μνήμη**.\
Αυτό θα εκμεταλλευτείται για να **αντικαταστήσει τον δείκτη FD του επόμενου τμήματος** ώστε να δείχνει στο **`malloc_hook`**, έτσι είναι δυνατό να εκχωρηθούν 2 δείκτες: πρώτα ο νόμιμος δείκτης που μόλις τροποποιήσαμε, και στη συνέχεια η δεύτερη εκχώρηση θα επιστρέψει ένα τμήμα στο **`malloc_hook`** που είναι δυνατό να εκμεταλλευτείται για να γράψει ένα **one gadget**.
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
* **Διαρροή πληροφοριών Libc**: Υπάρχει ένα use after free και ένα double free. Σε αυτήν την ανάλυση, ο συγγραφέας διέρρευσε μια διεύθυνση του libc διαβάζοντας τη διεύθυνση ενός τμήματος που τοποθετήθηκε σε ένα μικρό bin (όπως διαρροή από το unsorted bin αλλά από το μικρό).
* **Επίθεση Tcache**: Μια Tcache πραγματοποιείται μέσω ενός **double free**. Το ίδιο τμήμα ελευθερώνεται δύο φορές, έτσι μέσα στο Tcache το τμήμα θα δείχνει στον εαυτό του. Στη συνέχεια, εκχωρείται, ο δείκτης FD του τροποποιείται ώστε να δείχνει στο **free hook** και στη συνέχεια εκχωρείται ξανά, έτσι το επόμενο τμήμα στη λίστα θα βρίσκεται στο free hook. Στη συνέχεια, αυτό επίσης εκχωρείται και είναι δυνατό να γραφτεί η διεύθυνση του `system` εδώ, έτσι όταν ένα malloc που περιέχει `"/bin/sh"` ελευθερωθεί, λαμβάνουμε ένα κέλυφος.
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
* **Επίθεση δεικτών Tcache**: Είναι δυνατό να εκχωρηθεί και να ελευθερωθεί ένα τμήμα με μέγεθος που όταν αποθηκευτεί μέσα στις πληροφορίες tcache θα δημιουργήσει μια **θέση με τιμή 0x100** (επειδή το byte που υποδηλώνει πόσα τμήματα σε αυτόν τον δείκτη αποθηκεύονται). Στη συνέχεια, εκμεταλλευόμενοι αυτήν την τιμή είναι δυνατό να `ελευθερώσετε` αυτήν τη διεύθυνση καθώς φαίνεται ότι είναι ένα τμήμα μεγέθους 0x100. Αυτό θα προσθέσει αυτήν τη διεύθυνση στον δείκτη τμημάτων μεγέθους 0x100 στο tcache.\
Στη συνέχεια, εκχωρώντας ένα τμήμα μεγέθους 0x100, είναι δυνατό

View file

@ -10,46 +10,66 @@
* Αποκτήστε το [**επίσημο 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.
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα αποθετήρια του [**HackTricks**](https://github.com/carlospolop/hacktricks) και του [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) στο GitHub.
</details>
## Βασικές Πληροφορίες
Για περισσότερες πληροφορίες σχετικά με το τι είναι μια unsorted bin ελέγξτε αυτήν τη σελίδα:
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα unsorted bin ελέγξτε αυτήν τη σελίδα:
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
Οι μη ταξινομημένες λίστες είναι σε θέση να γράψουν τη διεύθυνση στο `unsorted_chunks (av)` στη διεύθυνση `bk` του κομματιού. Επομένως, αν ένας επιτιθέμενος μπορεί να **τροποποιήσει τη διεύθυνση του δείκτη bk** σε ένα κομμάτι μέσα στην unsorted bin, θα μπορούσε να **γράψει αυτήν τη διεύθυνση σε μια τυχαία διεύθυνση** που θα μπορούσε να βοηθήσει στη διαρροή μιας διεύθυνσης της libc ή στην παράκαμψη κάποιας άμυνας.
Οι μη ταξινομημένες λίστες είναι σε θέση να γράψουν τη διεύθυνση στο `unsorted_chunks (av)` στη διεύθυνση `bk` του κομματιού. Επομένως, αν ένας επιτιθέμενος μπορεί να **τροποποιήσει τη διεύθυνση του δείκτη bk** σε ένα κομμάτι μέσα στο unsorted bin, θα μπορούσε να **γράψει αυτήν τη διεύθυνση σε μια τυχαία διεύθυνση** που θα μπορούσε να βοηθήσει στη διαρροή μιας διεύθυνσης της libc ή στην παράκαμψη κάποιας άμυνας.
Έτσι, βασικά, αυτή η επίθεση επέτρεπε να **αντικατασταθεί μια τυχαία διεύθυνση με ένα μεγάλο αριθμό** (μια διεύθυνση που θα μπορούσε να είναι μια διεύθυνση στη στοίβα ή μια διεύθυνση της libc) όπως μια διεύθυνση στη στοίβα που θα μπορούσε να διαρρεύσει ή μια περιορισμένη όπως η γενική μεταβλητή **`global_max_fast`** για να επιτρέψει τη δημιουργία γρήγορων κάδων με μεγαλύτερα μεγέθη (και να περάσει από μια επίθεση unsorted bin σε μια επίθεση fast bin).
Έτσι, βασικά, αυτή η επίθεση επέτρεπε να **αντικαταστήσει κάποια τυχαία διεύθυνση με ένα μεγάλο αριθμό** (μια διεύθυνση που θα μπορούσε να είναι μια διεύθυνση στο heap ή μια διεύθυνση της libc) όπως μια διεύθυνση του stack που θα μπορούσε να διαρρεύσει ή κάποιον περιορισμό όπως η γενική μεταβλητή **`global_max_fast`** για να επιτρέψει τη δημιουργία γρήγορων bins με μεγαλύτερα μεγέθη (και να περάσει από μια επίθεση unsorted bin σε μια επίθεση fast bin).
{% hint style="success" %}
Κοιτάζοντας το παράδειγμα που παρέχεται στο [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) και χρησιμοποιώντας τα 0x4000 και 0x5000 αντί για τα 0x400 και 0x500 ως μεγέθη κομματιών (για να αποφευχθούν οι tcaches) είναι δυνατό να δούμε ότι **σήμερα** ενεργοποιείται το σφάλμα **`malloc(): unsorted double linked list corrupted`**.
Επομένως, αυτή η επίθεση unsorted bin τώρα (μεταξύ άλλων ελέγχων) απαιτεί επίσης να είναι δυνατή η επιδιόρθωση της διπλής συνδεδεμένης λίστας ώστε να παρακαμφθεί το `victim->bck->fd == victim` ή όχι `victim->fd == av (arena)`. Που σημαίνει ότι η διεύθυνση όπου θέλουμε να γράψουμε πρέπει να έχει τη διεύθυνση του ψεύτικου κομματιού στη θέση του `fd` και ότι το ψεύτικο κομμάτι `fd` δείχνει στην αρένα.
Επομένως, αυτή η επίθεση unsorted bin τώρα (μεταξύ άλλων ελέγχων) απαιτεί επίσης να είναι δυνατό να επισκευάσει τη διπλή συνδεδεμένη λίστα ώστε να παρακαμφθεί `victim->bck->fd == victim` ή όχι `victim->fd == av (arena)`. Που σημαίνει ότι η διεύθυνση όπου θέλουμε να γράψουμε πρέπει να έχει τη διεύθυνση του ψεύτικου κομματιού στη θέση του `fd` και ότι το ψεύτικο κομμάτι `fd` δείχνει στην αρένα.
{% endhint %}
{% hint style="danger" %}
Σημειώστε ότι αυτή η επίθεση διαφθείρει την unsorted bin (επομένως και τη μικρή και μεγάλη). Έτσι, μπορούμε τώρα **να χρησιμοποιήσουμε εκχωρήσεις από τον γρήγορο κάδο** (ένα πιο πολύπλοκο πρόγραμμα μπορεί να κάνει άλλες εκχωρήσεις και να καταρρεύσει), και για να ενεργοποιήσουμε αυτό πρέπει **να εκχωρήσουμε το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.**
Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (επομένως και τα μικρά και τα μεγάλα). Έτσι, μπορούμε τώρα **να χρησιμοποιήσουμε εκχωρήσεις από το fast bin** (ένα πιο πολύπλοκο πρόγραμμα μπορεί να κάνει άλλες εκχωρήσεις και να καταρρεύσει), και για να ενεργοποιήσουμε αυτό πρέπει **να εκχωρήσουμε το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.**
Σημειώστε ότι η καθορισμός του **`global_max_fast`** μπορεί να βοηθήσει σε αυτήν την περίπτωση εμπιστευόμενος ότι ο γρήγορος κάδος θα είναι σε θέση να φροντίσει όλες τις άλλες εκχωρήσεις μέχρι να ολοκληρωθεί η εκμετάλλευση.
Σημειώστε ότι η καθορισμός του **`global_max_fast`** μπορεί να βοηθήσει σε αυτήν την περίπτωση εμπιστευόμενος ότι το fast bin θα είναι σε θέση να φροντίσει όλες τις άλλες εκχωρήσεις μέχρι να ολοκληρωθεί η εκμετάλλευση.
{% endhint %}
Ο κώδικας από τον [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τις κλήσεις malloc για να εκχωρήσετε μνήμη αρκετά μεγάλη ώστε να μην καταλήξετε σε tcache, μπορείτε να δείτε ότι εμφανίζεται το προαναφερθέν σφάλμα που αποτρέπει αυτήν την τεχνική: **`malloc(): unsorted double linked list corrupted`**
Ο κώδικας από τον [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τα mallocs για να εκχωρήσετε μνήμη αρκετά μεγάλη ώστε να μην καταλήξει σε tcache, μπορείτε να δείτε ότι εμφανίζεται το προαναφερθέν σφάλμα που αποτρέπει αυτήν την τεχνική: **`malloc(): unsorted double linked list corrupted`**
## Επίθεση Unsorted Bin Infoleak
Αυτό είναι πραγματικά ένα πολύ βασικό έννοια. Τα κομμάτια στο unsorted bin θα έχουν διπλούς δείκτες για να δημιουργήσουν το bin. Το πρώτο κομμάτι στο unsorted bin θα έχει πραγματικά τους **FD** και **BK** συνδέσμους **που δείχνουν σε ένα μέρος της κύριας αρένας (libc)**.\
Επομένως, αν μπορείτε **να βάλετε ένα κομμάτι μέσα σε ένα unsorted bin και να το διαβάσετε** (χρήση μετά από απελευθέρωση) ή **να το εκχωρήσετε ξανά χωρίς να αντικαταστήσετε τουλάχιστον 1 από τους δείκτες** για να **το διαβάσετε**, μπορείτε να έχετε μια **διαρροή πληροφοριών της libc**.
## Αναφορές & Άλλα παραδείγματα
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
* Ο στόχος είναι να αντικατασταθεί μια γενική μεταβλητή με μια τιμή μεγαλύτερη από 4869 για να είναι δυνατή η λήψη της σημαίας και η PIE δεν είναι ενεργοποιημένη.
* Είναι δυνατό να δημιουργηθούν κομμάτια αυθαίρετων μεγεθών και υπάρχει υπερχείλιση στη στοίβα με το επιθυμητό μέγεθος.
* Η επίθεση ξεκινά δημιουργώντας 3 κομμάτια: το κομμάτι 0 για να εκμεταλλευτεί την υπερχείλιση, το κομμάτι 1 για να υπερχειλιστεί και το κομμάτι 2 ώστε το κομμάτι κορυφής να μην συγχωνεύσει τα προηγούμενα.
* Στη συνέχεια, το κομμάτι 1 απελευθερώνεται και το κομμάτι 0 υπερχειλιίζεται ώστε ο δείκτης `bk` του κομματιού 1 να δείχνει: `bk = magic - 0x10`
* Στη συνέχεια, δεσμεύεται το κομμάτι 3 με το ίδιο μέγεθος με το κομμάτι 1, το οποίο θα ενεργοποιήσει την επίθεση unsorted bin και θα τροποποιήσει την τιμή της γενικής μεταβλητής, καθιστώντας δυνατή τη λήψη της σημαίας.
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
* Η συνάρτηση συγχώνευσης είναι ευάλωτη επειδή αν τα δύο δείκτες που περνούν είναι ίδιοι, θα γίνει επαναδιάταξη σε αυτό και στη συνέχεια θα απελευθερωθεί αλλά θα επιστρέψει ένα δείκτη σε αυτήν την απελευθερωμένη περιοχή που μπορεί να χρησιμοποιηθεί.
* Επομένως, **δημιουργούνται 2 κομμάτια**: το **κομμάτι 0** που θα συγχωνευτεί με τον εαυτό του και το κομμάτι 1 για να αποτρέψει τη συγχώνευση με το κορυφαίο κομμάτι. Στη συνέχεια, καλείται η συνάρτηση σ
* Στη συνέχεια, δημιουργείται ένα τμήμα με μέγεθος `0x1f8` για να ανακτηθεί από το γρήγορο bin το προηγούμενο άχρηστο τμήμα, έτσι δημιουργείται άλλο τμήμα μεγέθους `0x1f8` για να ληφθεί ένα τμήμα γρήγορου bin στο **`__free_hook`** το οποίο αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**.
* Και τελικά ένα τμήμα που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη λειτουργία διαγραφής, ενεργοποιώντας τη λειτουργία **`__free_hook`** που δείχνει στο σύστημα με το `/bin/sh\x00` ως παράμετρο.
* Ο στόχος είναι να αντικατασταθεί μια παγκόσμια μεταβλητή με μια τιμή μεγαλύτερη από 4869 για να είναι δυνατή η λήψη της σημαίας και το PIE δεν είναι ενεργοποιημένο.
* Είναι δυνατό να δημιουργηθούν κομμάτια αυθαίρετων μεγεθών και υπάρχει υπερχείλιση στο heap με το επιθυμητό μέγεθος.
* Η επίθεση ξεκινά δημιουργώντας 3 κομμάτια: το κομμάτι0 για να εκμεταλλευτεί την υπερχείλιση, το κομμάτι1 για να υπερχειλιστεί και το κομμάτι2 ώστε το κομμάτι κορυφής να μην συγχωνεύσει τα προηγούμενα.
* Στη συνέχεια, το κομμάτι1 απελευθερώνεται και το κομμάτι0 υπερχειλίζεται ώστε ο δείκτης `bk` του κομματιού1 να δείχνει: `bk = magic - 0x10`
* Στη συνέχεια, εκχωρείται το κομμάτι3 με το ίδιο μέγεθος με το κομμάτι1, το οποίο θα ενεργοποιήσει την επίθεση unsorted bin και θα τροποποιήσει την τιμή της παγκόσμιας μεταβλητής, καθιστώντας δυνατή τη λήψη της σημαίας.
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack
* Εάν καταφέρουμε να αποκτήσουμε ένα γρήγορο κομμάτι μεγέθους 0x200 σε αυτή τη θέση, θα είναι δυνατό να αντικαταστήσουμε ένα δείκτη συνάρτησης που θα εκτελεστεί.
* Για αυτό, δημιουργείται ένα νέο κομμάτι μεγέθους `0xfc` και καλείται η συνάρτηση συγχώνευσης με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε ένα δείκτη προς ένα ελεύθερο κομμάτι μεγέθους `0xfc*2 = 0x1f8` στο γρήγορο κάδο.
* Στη συνέχεια, καλείται η συνάρτηση επεξεργασίας σε αυτό το κομμάτι για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του γρήγορου κάδου ώστε να δείχνει στην προηγούμενη συνάρτηση **`__free_hook`**.
* Στη συνέχεια, δημιουργείται ένα κομμάτι μεγέθους `0x1f8` για να ανακτήσει από τον γρήγορο κάδο το προηγούμενο άχρηστο κομμάτι, έτσι δημιουργείται άλλο ένα κομμάτι μεγέθους `0x1f8` για να λάβει ένα κομμάτι γρήγορου κάδου στο **`__free_hook`** το οποίο αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**.
* Και τελικά ένα κομμάτι που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στο σύστημα με το `/bin/sh\x00` ως παράμετρο.
<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>