# Εκτύπωση Stack Canary {{#include ../../../banners/hacktricks-training.md}} ## Μεγέθυνση εκτυπωμένου stack Φανταστείτε μια κατάσταση όπου ένα **πρόγραμμα ευάλωτο** σε stack overflow μπορεί να εκτελέσει μια **puts** λειτουργία **δείχνοντας** σε **μέρος** του **stack overflow**. Ο επιτιθέμενος γνωρίζει ότι το **πρώτο byte του canary είναι ένα null byte** (`\x00`) και τα υπόλοιπα bytes του canary είναι **τυχαία** bytes. Στη συνέχεια, ο επιτιθέμενος μπορεί να δημιουργήσει μια υπερχείλιση που **επικαλύπτει το stack μέχρι το πρώτο byte του canary**. Στη συνέχεια, ο επιτιθέμενος **καλεί τη λειτουργία puts** στη μέση του payload που θα **εκτυπώσει όλα τα canary** (εκτός από το πρώτο null byte). Με αυτές τις πληροφορίες, ο επιτιθέμενος μπορεί να **δημιουργήσει και να στείλει μια νέα επίθεση** γνωρίζοντας το canary (στην ίδια συνεδρία προγράμματος). Προφανώς, αυτή η τακτική είναι πολύ **περιορισμένη** καθώς ο επιτιθέμενος πρέπει να είναι σε θέση να **εκτυπώσει** το **περιεχόμενο** του **payload** του για να **εξάγει** το **canary** και στη συνέχεια να είναι σε θέση να δημιουργήσει ένα νέο payload (στην **ίδια συνεδρία προγράμματος**) και να **στείλει** την **πραγματική υπερχείλιση buffer**. **Παραδείγματα CTF:** - [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html) - 64 bit, ASLR ενεργοποιημένο αλλά χωρίς PIE, το πρώτο βήμα είναι να γεμίσει μια υπερχείλιση μέχρι το byte 0x00 του canary για να καλέσει στη συνέχεια το puts και να το διαρρεύσει. Με το canary δημιουργείται ένα ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και ένα ROP gadget για να καλέσει το `system('/bin/sh')` - [**https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html) - 32 bit, ARM, χωρίς relro, canary, nx, χωρίς pie. Υπερχείλιση με μια κλήση στο puts για να διαρρεύσει το canary + ret2lib καλώντας το `system` με μια ROP αλυσίδα για να pop r0 (arg `/bin/sh`) και pc (διεύθυνση του system) ## Αυθαίρετη Ανάγνωση Με μια **αυθαίρετη ανάγνωση** όπως αυτή που παρέχεται από τις **μορφές** **strings** μπορεί να είναι δυνατό να διαρρεύσει το canary. Ελέγξτε αυτό το παράδειγμα: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) και μπορείτε να διαβάσετε για την κακή χρήση των μορφών strings για να διαβάσετε αυθαίρετες διευθύνσεις μνήμης σε: {{#ref}} ../../format-strings/ {{#endref}} - [https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html](https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html) - Αυτή η πρόκληση εκμεταλλεύεται με πολύ απλό τρόπο μια μορφή string για να διαβάσει το canary από το stack {{#include ../../../banners/hacktricks-training.md}}