hacktricks/binary-exploitation/basic-binary-exploitation-methodology/README.md

107 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Βασική Μεθοδολογία Εκμετάλλευσης Δυαδικών Αρχείων
<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>
## Βασικές Πληροφορίες ELF
Πριν αρχίσετε να εκμεταλλεύεστε οτιδήποτε, είναι ενδιαφέρον να κατανοήσετε μέρος της δομής ενός **ELF δυαδικού**:
{% content-ref url="elf-tricks.md" %}
[elf-tricks.md](elf-tricks.md)
{% endcontent-ref %}
## Εργαλεία Εκμετάλλευσης
{% content-ref url="tools/" %}
[εργαλεία](tools/)
{% endcontent-ref %}
## Μεθοδολογία Υπερχείλισης Στοίβας
Με τόσες τεχνικές, είναι καλό να έχετε ένα σχέδιο όταν κάθε τεχνική θα είναι χρήσιμη. Σημειώστε ότι οι ίδιες προστασίες θα επηρεάσουν διαφορετικές τεχνικές. Μπορείτε να βρείτε τρόπους να παρακάμψετε τις προστασίες σε κάθε ενότητα προστασίας, αλλά όχι σε αυτήν τη μεθοδολογία.
## Έλεγχος της Ροής
Υπάρχουν διαφορετικοί τρόποι με τους οποίους μπορείτε να ελέγξετε τη ροή ενός προγράμματος:
* [**Υπερχείλιση Στοίβας**](../stack-overflow/) αντικαθιστώντας το δείκτη επιστροφής από τη στοίβα ή το EBP -> ESP -> EIP.
* Ίσως χρειαστεί να εκμεταλλευτείτε ένα [**Ακέραιο Υπερχείλισης**](../integer-overflow.md) για να προκαλέσετε την υπερχείλιση
* Ή μέσω **Αυθαίρετων Εγγραφών + Γράψε Τι Πού στην Εκτέλεση**
* [**Συμβολοσειρές Μορφοποίησης**](../format-strings/)**:** Εκμεταλλευτείτε το `printf` για να γράψετε αυθαίρετο περιεχόμενο σε αυθαίρετες διευθύνσεις.
* [**Δείκτες Πίνακα**](../array-indexing.md): Εκμεταλλευτείτε έναν κακά σχεδιασμένο δείκτη για να μπορείτε να ελέγχετε ορισμένους πίνακες και να λάβετε μια αυθαίρετη εγγραφή.
* Ίσως χρειαστεί να εκμεταλλευτείτε ένα [**Ακέραιο Υπερχείλισης**](../integer-overflow.md) για να προκαλέσετε την υπερχείλιση
* **bof σε WWW μέσω ROP**: Εκμεταλλευτείτε μια υπερχείλιση buffer για να κατασκευάσετε ένα ROP και να μπορείτε να λάβετε ένα WWW.
Μπορείτε να βρείτε τις τεχνικές **Γράψε Τι Πού στην Εκτέλεση** στο:
{% content-ref url="../arbitrary-write-2-exec/" %}
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
{% endcontent-ref %}
## Αιώνιοι Βρόχοι
Κάτι που πρέπει να ληφθεί υπόψη είναι ότι συνήθως **μια εκμετάλλευση ενός ευπαθούς σημείου ενδέχεται να μην είναι αρκετή** για να εκτελέσετε με επιτυχία μια εκμετάλλευση, ειδικά όταν χρειάζεται να παρακάμψετε κάποιες προστασίες. Επομένως, είναι ενδιαφέρον να συζητήσετε κάποιες επιλογές για να **κάνετε ένα ευπαθές σημείο εκμεταλλεύσιμο πολλές φορές** στην ίδια εκτέλεση του δυαδικού:
* Γράψτε σε μια αλυσίδα **ROP** τη διεύθυνση της **συνάρτησης `main`** ή στη διεύθυνση όπου συμβαίνει η **ευπαθής σημείο**.
* Ελέγχοντας μια κατάλληλη αλυσίδα ROP, μπορείτε να εκτελέσετε όλες τις ενέργειες σε αυτή την αλυσίδα
* Γράψτε στη διεύθυνση **`exit` στο GOT** (ή οποιαδήποτε άλλη συνάρτηση που χρησιμοποιείται από το δυαδικό πριν τη λήξη) τη διεύθυνση για να πάτε **πίσω στην ευπαθή σημείο**
* Όπως εξηγείται στο [**.fini\_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md#eternal-loop)**,** αποθηκεύστε 2 συναρτήσεις εδώ, μία για να καλέσετε ξανά το ευπαθές σημείο και μία για να καλέσετε ξανά τη συνάρτηση από το `.fini_array`.
## Στόχοι Εκμετάλλευσης
### Στόχος: Κλήση Υπάρχουσας Συνάρτησης
* [**ret2win**](./#ret2win): Υπάρχει μια συνάρτηση στον κώδικα που πρέπει να καλέσετε (ίσως με κάποιες συγκεκριμένες παραμέτρους) για να λάβετε τη σημαία.
* Σε ένα **κανονικό bof χωρίς** [**PIE**](../common-binary-protections-and-bypasses/pie/) **και** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), απλά χρειάζεται να γράψετε τη διεύθυνση στη διεύθυνση επιστροφής που αποθηκεύεται στη στοίβα.
* Σε ένα bof με [**PIE**](../common-binary-protections-and-bypasses/pie/), θα χρειαστεί να το παρακάμψετε
* Σε ένα bof με [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), θα χρειαστεί να το παρακάμψετε
* Αν χρειάζεστε να ορίσετε αρκετές παραμέτρους για να καλέσετε σωστά τη συνάρτηση **ret2win** μπορείτε να χρησιμοποιήσετε:
* Μια [**ROP**](./#rop-and-ret2...-techniques) **αλυσίδα αν υπάρχουν αρκετά gadgets** για να προετοιμάσετε όλες τις παραμέτρους
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming.md) (σε περίπτωση που μπορείτε να καλέσετε αυτή τη σύσταση) για να ελέγξετε πολλούς καταχωρητές
* Gadgets από [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) και [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) για να ελέγξετε πολλούς καταχωρητές
* Μέσω ενός [**Γράψε Τι Πού στην Εκτέλεση**](../arbitrary-write-2-exec/) μπορείτε να εκμεταλλευτείτε άλλες ευπαθείς σημεία (όχι bof) για να καλέσετε τη συνάρτηση **`win`**.
* [**Ανακατευτήρες Δεικτών**](../stack-overflow/pointer-redirecting.md): Σε περίπτωση που η στοίβα περιέχει δείκτες προς μια συνάρτηση που θα κληθεί ή προς μια συμβολοσειρά που θα χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατό να αντικαταστήσετε αυτή τη διεύθ
#### Μέσω κλήσεων συστήματος
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv.md): Χρήσιμο για να καλέσετε την `execve` για να εκτελέσετε αυθαίρετες εντολές. Πρέπει να μπορείτε να βρείτε τα **gadgets για να καλέσετε τη συγκεκριμένη κλήση συστήματος με τις παραμέτρους**.
* Εάν έχουν ενεργοποιηθεί το [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ή το [**PIE**](../common-binary-protections-and-bypasses/pie/), θα πρέπει να τα αντιμετωπίσετε **για να χρησιμοποιήσετε τα ROP gadgets** από το δυαδικό αρχείο ή τις βιβλιοθήκες.
* Το [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming.md) μπορεί να είναι χρήσιμο για να προετοιμάσετε το **ret2execve**
* Gadgets από το [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) και το [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) για τον έλεγχο πολλών καταχωρητών
#### Μέσω της libc
* [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): Χρήσιμο για να καλέσετε μια συνάρτηση από μια βιβλιοθήκη (συνήθως από την **`libc`**) όπως το **`system`** με μερικές προετοιμασμένες παραμέτρους (π.χ. `'/bin/sh'`). Χρειάζεστε το δυαδικό αρχείο να **φορτώσει τη βιβλιοθήκη** με τη συνάρτηση που θέλετε να καλέσετε (συνήθως η libc).
* Εάν είναι **στατικά μεταγλωττισμένο και χωρίς** [**PIE**](../common-binary-protections-and-bypasses/pie/), η **διεύθυνση** του `system` και του `/bin/sh` δεν θα αλλάξουν, οπότε είναι δυνατόν να τα χρησιμοποιήσετε στατικά.
* **Χωρίς** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **και γνωρίζοντας την έκδοση της libc** που φορτώθηκε, η **διεύθυνση** του `system` και του `/bin/sh` δεν θα αλλάξουν, οπότε είναι δυνατόν να τα χρησιμοποιήσετε στατικά.
* Με [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **αλλά χωρίς** [**PIE**](../common-binary-protections-and-bypasses/pie/), γνωρίζοντας την libc και με το δυαδικό αρχείο να χρησιμοποιεί τη συνάρτηση `system` είναι δυνατόν να **`ret` στη διεύθυνση του system στο GOT** με τη διεύθυνση του `'/bin/sh'` στην παράμετρο (θα πρέπει να το ανακαλύψετε).
* Με [ASLR](../common-binary-protections-and-bypasses/aslr/) αλλά χωρίς [PIE](../common-binary-protections-and-bypasses/pie/), γνωρίζοντας την libc και **χωρίς το δυαδικό αρχείο να χρησιμοποιεί τη συνάρτηση `system`**:
* Χρησιμοποιήστε το [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md) για να επιλύσετε τη διεύθυνση του `system` και να την καλέσετε&#x20;
* **Αντιμετωπίστε** το [**ASLR**](../common-binary-protections-and-bypasses/aslr/) και υπολογίστε τη διεύθυνση του `system` και του `'/bin/sh'` στη μνήμη.
* **Με** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **και** [**PIE**](../common-binary-protections-and-bypasses/pie/) **και χωρίς γνώση της libc**: Χρειάζεστε:
* Αντιμετωπίστε το [**PIE**](../common-binary-protections-and-bypasses/pie/)
* Βρείτε τη **έκδοση της libc** που χρησιμοποιείται (διαρροή μερικών διευθύνσεων συναρτήσεων)
* Ελέγξτε τα **προηγούμενα σενάρια με ASLR** για να συνεχίσετε.
#### Μέσω EBP/RBP
* [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Έλεγχος του ESP για να ελέγξετε το RET μέσω του αποθηκευμένου EBP στη στοίβα.
* Χρήσιμο για **off-by-one** stack overflows
* Χρήσιμο ως εναλλακτικός τρόπος για τον έλεγχο του EIP ενώ καταχράζεστε το EIP για να κατασκευάσετε το φορτίο στη μνήμη και στη συνέχεια να μεταβείτε σε αυτό μέσω του EBP
#### Διάφορα
* [**Pointers Redirecting**](../stack-overflow/pointer-redirecting.md): Σε περίπτωση που η στοίβα περιέχει δείκτες προς μια συνάρτηση που θα κληθεί ή προς ένα string που θα χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να αντικαταστήσετε αυτήν τη διεύθυνση.
* Το [**ASLR**](../common-binary-protections-and-bypasses/aslr/) ή το [**PIE**](../common-binary-protections-and-bypasses/pie/) μπορεί να επηρεάσουν τις διευθύνσεις.
* [**Μη αρχικοποιημένες μεταβλητές**](../stack-overflow/uninitialized-variables.md): Δεν ξέρετε ποτέ