Μάθετε & εξασκηθείτε στο Hacking του AWS:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Μάθετε & εξασκηθείτε στο Hacking του GCP: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Ελέγξτε τα [**σχέδια συνδρομής**](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.
Το**`atexit()`** είναι μια συνάρτηση στην οποία **άλλες συναρτήσεις περνιούνται ως παράμετροι.** Αυτές οι**συναρτήσεις** θα **εκτελεστούν** κατά την εκτέλεση μιας **`exit()`** ή την **επιστροφή** του **κύριου** προγράμματος.\
Αν μπορείτε να**τροποποιήσετε** τη **διεύθυνση** οποιασδήποτε από αυτές τις **συναρτήσεις** ώστε να δείχνει σε ένα shellcode για παράδειγμα, τότε θα **κερδίσετε έλεγχο** της **διεργασίας**, αλλά αυτό είναι προς το παρόν πιο περίπλοκο.\
Προς το παρόν οι**διευθύνσεις των συναρτήσεων** που πρόκειται να εκτελεστούν είναι **κρυμμένες** πίσω από αρκετές δομές και τελικά η διεύθυνση στην οποία δείχνει δεν είναι οι διευθύνσεις των συναρτήσεων, αλλά είναι **κρυπτογραφημένες με XOR** και μετατοπίσεις με ένα **τυχαίο κλειδί**. Έτσι αυτός ο διανυσματικός επιθετικός δεν είναι πολύ χρήσιμος τουλάχιστον σε x86 και x64\_86.\
Η**συνάρτηση κρυπτογράφησης** είναι **`PTR_MANGLE`**. **Άλλες αρχιτεκτονικές** όπως m68k, mips32, mips64, aarch64, arm, hppa... **δεν υλοποιούν τη συνάρτηση κρυπτογράφησης** επειδή **επιστρέφουν το ίδιο** με αυτό που λαμβάνουν ως είσοδο. Έτσι αυτές οι αρχιτεκτονικές θα μπορούσαν να είναι επιθετικές με αυτό το διάνυσμα.
Μπορείτε να βρείτε μια λεπτομερή εξήγηση για το πώς λειτουργεί αυτό στο [https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html](https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html)
Όπως εξηγείται [**σε αυτήν την ανάρτηση**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure), Αν το πρόγραμμα εξέρχεται χρησιμοποιώντας `return` ή `exit()` θα εκτελέσει το `__run_exit_handlers()` το οποίο θα καλέσει τους εγγεγραμμένους καταστροφείς.
Αν το πρόγραμμα εξέρχεται μέσω της **συνάρτησης `_exit()`**, θα καλέσει τη **κλήση συστήματος `exit`** και οι χειριστές εξόδου δεν θα εκτελεστούν. Έτσι, γιανα επιβεβαιώσετε ότι το `__run_exit_handlers()` εκτελείται μπορείτε να ορίσετε ένα σημείο ανακοπής σε αυτό.
* Αντικαταστήστε την τιμή του `map->l_addr` ώστε να δείχνει σε ένα **ψεύτικο `fini_array`** με οδηγίες για την εκτέλεση αυθαίρετου κώδικα
* Αντικαταστήστε τις καταχωρήσεις `l_info[DT_FINI_ARRAY]` και `l_info[DT_FINI_ARRAYSZ]` (που είναι περίπου διαδοχικές στη μνήμη), ώστε να κάνουν **δείχνουν σε μια πλαστή δομή `Elf64_Dyn`** που θα κάνει ξανά το **`array`να δείχνει σε μια ζώνη μνήμης** που ελέγχεται από τον επιτιθέμενο. 
* [**Αυτή η ανάλυση**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell) αντικαθιστά το `l_info[DT_FINI_ARRAY]` με τη διεύθυνση μιας ελεγχόμενης μνήμης στο `.bss` που περιέχει ένα ψεύτικο `fini_array`. Αυτός ο ψεύτικος πίνακας περιέχει **πρώτα μια** [**διεύθυνση one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) που θα εκτελεστεί και στη συνέχεια τη **διαφορά** μεταξύ της διεύθυνσης αυτού του **ψεύτικου πίνακα** και της τιμής του `map->l_addr` έτσι ώστε το `*array`να δείχνει στο ψεύτικο πίνακα.
* Σύμφωνα με την κύρια ανάρτηση αυτής της τεχνικής και [**αυτή την ανάλυση**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet) το ld.so αφήνει ένα δείκτη στη στοίβα που δείχνει στο δυαδικό `link_map` στο ld.so. Με ένα αυθαίρετο γράψιμο είναι δυνατό να το αντικαταστήσετε και να το κάνετε να δείχνει σε ένα ψεύτικο `fini_array` που ελέγχεται από τον επιτιθέμενο με τη διεύθυνση ενός [**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) για παράδειγμα.
Σε αυτήν την περίπτωση θα ήταν δυνατό να αντικατασταθεί η τιμή του `map->l_info[DT_FINI]` που δείχνει σε ένα πλαστό `ElfW(Dyn)` δομή. Βρείτε [**περισσότερες πληροφορίες εδώ**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure).
## Αντικατάσταση TLS-Storage dtor\_list στο **`__run_exit_handlers`**
Όπως [**εξηγείται εδώ**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite), αν ένα πρόγραμμα τερματίσει μέσω `return` ή `exit()`, θα εκτελέσει το **`__run_exit_handlers()`** το οποίο θα καλέσει οποιαδήποτε συνάρτηση καταστροφέων που έχει καταχωρηθεί.
Κώδικας από το `_run_exit_handlers()`:
```c
/* Call all functions registered with `atexit' and `on_exit',
in the reverse of the order in which they were registered
perform stdio cleanup, and terminate program execution with STATUS. */
/* Call the destructors. This is called either when a thread returns from the
initial function or when the process exits via the exit function. */
void
__call_tls_dtors (void)
{
while (tls_dtor_list) // parse the dtor_list chained structures
{
struct dtor_list *cur = tls_dtor_list; // cur point to tls-storage dtor_list
dtor_func func = cur->func;
PTR_DEMANGLE (func); // demangle the function ptr
tls_dtor_list = tls_dtor_list->next; // next dtor_list structure
func (cur->obj);
[...]
}
}
```
Για κάθε εγγεγραμμένη λειτουργία στο **`tls_dtor_list`**, θα αποκωδικοποιήσει το δείκτη από το **`cur->func`** και θα το καλέσει με το όρισμα **`cur->obj`**.
Χρησιμοποιώντας τη λειτουργία **`tls`** από αυτό το [**fork του GEF**](https://github.com/bata24/gef), είναι δυνατό να δούμε ότι πραγματικά η λίστα **`dtor_list`** είναι πολύ **κοντά** στο **stack canary** και το **PTR\_MANGLE cookie**. Έτσι, με ένα υπερχείλιση σε αυτό θα ήταν δυνατό να**αντικατασταθεί** το **cookie** και το **stack canary**.\
Αν αντικατασταθεί το PTR\_MANGLE cookie, θα ήταν δυνατό να**παρακάμψει τη λειτουργία `PTR_DEMANLE`** με το να το ορίσει σε 0x00, πράγμα που σημαίνει ότι το **`xor`** που χρησιμοποιείται γιανα πάρει την πραγματική διεύθυνση είναι ακριβώς η διεύθυνση που έχει ρυθμιστεί. Έπειτα, γράφοντας στη **`dtor_list`** είναι δυνατό να**αλυσιδωθούν αρκετές λειτουργίες** με τη διεύθυνση της λειτουργίας και το **όρισμά** της.
Βρείτε ένα παράδειγμα στην [**αρχική δημοσίευση**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite).
## Άλλες παραμορφωμένες δείκτες στο **`__run_exit_handlers`**
Αυτή η τεχνική εξηγείται [**εδώ**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite) και εξαρτάται ξανά από το πρόγραμμα **που τερματίζει καλώντας `return` ή `exit()`** έτσι ώστε να κληθεί το **`__run_exit_handlers()`**.
Για να εκμεταλλευτείτε αυτό, πρέπει είτε να**διαρρεύσετε ή να διαγράψετε το `PTR_MANGLE` cookie** και στη συνέχεια να αντικαταστήσετε μια εγγραφή `cxa` στο initial με `system('/bin/sh')`.\
Μπορείτε να βρείτε ένα παράδειγμα αυτού στην [**αρχική ανάρτηση στο blog σχετικά με την τεχνική**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#6---code-execution-via-other-mangled-pointers-in-initial-structure).