Uninitialized Variables

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Η βασική ιδέα εδώ είναι να κατανοήσουμε τι συμβαίνει με μη αρχικοποιημένες μεταβλητές καθώς θα έχουν την τιμή που ήταν ήδη στη μνήμη που τους ανατέθηκε. Παράδειγμα:

  • Συνάρτηση 1: initializeVariable: Δηλώνουμε μια μεταβλητή x και της αναθέτουμε μια τιμή, ας πούμε 0x1234. Αυτή η ενέργεια είναι παρόμοια με το να κρατάμε ένα σημείο στη μνήμη και να τοποθετούμε μια συγκεκριμένη τιμή σε αυτό.

  • Συνάρτηση 2: useUninitializedVariable: Εδώ, δηλώνουμε μια άλλη μεταβλητή y αλλά δεν της αναθέτουμε καμία τιμή. Στη γλώσσα C, οι μη αρχικοποιημένες μεταβλητές δεν ορίζονται αυτόματα σε μηδέν. Αντίθετα, διατηρούν την τιμή που ήταν τελευταία αποθηκευμένη στη θέση μνήμης τους.

Όταν εκτελέσουμε αυτές τις δύο συναρτήσεις σειριακά:

  1. Στην initializeVariable, η x ανατίθεται μια τιμή (0x1234), η οποία καταλαμβάνει μια συγκεκριμένη διεύθυνση μνήμης.

  2. Στην useUninitializedVariable, η y δηλώνεται αλλά δεν ανατίθεται τιμή, οπότε παίρνει τη θέση μνήμης αμέσως μετά την x. Λόγω της μη αρχικοποίησης της y, κληρονομεί την τιμή από την ίδια θέση μνήμης που χρησιμοποιήθηκε από την x, επειδή αυτή ήταν η τελευταία τιμή που υπήρχε εκεί.

Αυτή η συμπεριφορά εικονίζει ένα βασικό έννοια στον προγραμματισμό χαμηλού επιπέδου: Η διαχείριση μνήμης είναι κρίσιμη, και οι μη αρχικοποιημένες μεταβλητές μπορεί να οδηγήσουν σε μη προβλέψιμη συμπεριφορά ή ευπάθειες ασφαλείας, καθώς μπορεί να κρατούν ακούσια ευαίσθητα δεδομένα που παρέμειναν στη μνήμη.

#include <stdio.h>

// Function to initialize and print a variable
void initializeAndPrint() {
int initializedVar = 100; // Initialize the variable
printf("Initialized Variable:\n");
printf("Address: %p, Value: %d\n\n", (void*)&initializedVar, initializedVar);
}

// Function to demonstrate the behavior of an uninitialized variable
void demonstrateUninitializedVar() {
int uninitializedVar; // Declare but do not initialize
printf("Uninitialized Variable:\n");
printf("Address: %p, Value: %d\n\n", (void*)&uninitializedVar, uninitializedVar);
}

int main() {
printf("Demonstrating Initialized vs. Uninitialized Variables in C\n\n");

// First, call the function that initializes its variable
initializeAndPrint();

// Then, call the function that has an uninitialized variable
demonstrateUninitializedVar();

return 0;
}

Πώς Λειτουργεί:

  • Συνάρτηση initializeAndPrint: Αυτή η συνάρτηση δηλώνει μια ακέραια μεταβλητή initializedVar, της αναθέτει την τιμή 100, και στη συνέχεια εκτυπώνει τη διεύθυνση μνήμης και την τιμή της μεταβλητής. Αυτό το βήμα είναι απλό και δείχνει πώς συμπεριφέρεται μια αρχικοποιημένη μεταβλητή.

  • Συνάρτηση demonstrateUninitializedVar: Σε αυτή τη συνάρτηση, δηλώνουμε μια ακέραια μεταβλητή uninitializedVar χωρίς να την αρχικοποιήσουμε. Όταν προσπαθούμε να εκτυπώσουμε την τιμή της, η έξοδος μπορεί να εμφανίσει ένα τυχαίο αριθμό. Αυτός ο αριθμός αντιπροσωπεύει τα δεδομένα που υπήρχαν προηγουμένως σε αυτήν τη θέση μνήμης. Ανάλογα με το περιβάλλον και το μεταγλωττιστή, η πραγματική έξοδος μπορεί να ποικίλει, και μερικές φορές, για λόγους ασφαλείας, μερικοί μεταγλωττιστές ενδέχεται να αρχικοποιούν αυτόματα τις μεταβλητές σε μηδέν, αν και δεν πρέπει να βασιζόμαστε σε αυτό.

  • Συνάρτηση main: Η συνάρτηση main καλεί και τις δύο παραπάνω συναρτήσεις σε σειρά, δείχνοντας την αντίθεση μεταξύ μιας αρχικοποιημένης μεταβλητής και μιας μη αρχικοποιημένης.

Last updated