Überschreitung der Feldgrenzen bei Arrays



  • Warum kann es gut gehen?

    Weil du scheinbar zufällig ein Byte erwischt hast, das in dem Fall nicht gebraucht wird. Aber du solltest ein seltsames Verhalten erzielen können, wenn du weiter darüber hinaus schreibst, irgendwann kommen da meistens irgendwelche Rücksprungadressen oder etwas ähnlich sensibles.

    Ausgabe bei mir (gcc, win32):

    1
    2
    3
    4
    15
    16
    


  • Ausgabe bei mir (gcc, ubuntu 8.10, 32 bit):

    1
    2
    3
    16
    15
    16
    

    🙂



  • Und das war beides die gleiche Kiste, und zwar keine virtuelle, sondern eine zum Angreifen. Du hast ein schönes kurzes Beispiel für einen nasal demon gepostet. Nur braucht man zum Testen halt mehrere Systeme. 😉



  • Es klappt endlich. Es gibt Fehler und auch eine Fehlermeldung :).

    #include <stdio.h>
    
    int main(void)
    {
    	int alpha[3]; /* Array mit 3 Elementen */
    	alpha[0] = 1;
    	alpha[1] = 2;
    	alpha[2] = 3;
    	alpha[3] = 4; /* Dieses Element gibt es eigentlich nicht */
    	alpha[4] = 5;
    	alpha[5] = 6;
    	alpha[6] = 7;
    	alpha[7] = 8;
    	alpha[8] = 9;
    	alpha[9] = 10;
    	alpha[10] = 11;
    	alpha[11] = 12;
    	alpha[12] = 13;
    
    	int k; /* Die Variablen k und l sollen den Speicherplatz von
    	* alpha[3] überschreiben, weil alpha[3] eigentlich
    	* keinen zugesicherten Speicherplatz besitzt. */
    	int l;
    	k=88888;
    	l=44444;
    
    	printf ("%i\n", alpha[0]); /* 1 wird ausgegeben */
    	printf ("%i\n", alpha[1]); /* 2 wird ausgegeben */
    	printf ("%i\n", alpha[2]); /* 3 wird ausgegeben */
    	printf ("%i\n", alpha[3]); /* diese Ausgabe sollte ungleich 4
    	* sein. Ich erwarte den Wert von k oder l. Es wird aber trotzdem
    	* die 4 ausgegeben!? */
    	printf ("%i\n", alpha[4]); /* 5 wird nettweise ausgegeben */
    	printf ("%i\n", alpha[5]); /* 6 wird nettweise ausgegeben */
    	printf ("%i\n", alpha[6]); /* Endlich ein "Fehler", ein Überlauf.
    	44444 wird ausgegeben, die Variable l */
    	printf ("%i\n", alpha[7]); /* Auc hhier ein "Fehler". 88888 wird
    	ausgegeben, die Variable k */
    	printf ("%i\n", alpha[8]); /* 9 wird ausgegeben,
    	erstaunlicherweise korrekt */
    	printf ("%i\n", alpha[9]); /* 10 wird ausgegeben,
    	erstaunlicherweise korrekt */
    	printf ("%i\n", alpha[10]); /* 11 wird ausgegeben,
    	erstaunlicherweise korrekt */
    	printf ("%i\n", alpha[11]); /* 12 wird ausgegeben,
    	erstaunlicherweise korrekt */
    	printf ("%i\n", alpha[12]); /* 13 wird ausgegeben,
    	erstaunlicherweise korrekt */
    
    	printf ("%i\n", k); /* 15 wird ausgegeben */
    	printf ("%i\n", l); /* 16 wird ausgegeben */
    	/* Und dann wird noch "Segmentation fault" ausgegeben. Endlich
    	 * geschafft! */
    
    	return 0;
    }
    

    Oder nur die Ausgabe:

    1
    2
    3
    4
    5
    6
    44444
    88888
    9
    10
    11
    12
    13
    88888
    44444
    Segmentation fault
    

    Danke an euch beide! Nun ist's geklärt! 🙂



  • Katzenstreu schrieb:

    Danke an euch beide!

    dir haben 3 leute geantwortet.
    🙂



  • Basher schrieb:

    Katzenstreu schrieb:

    Danke an euch beide!

    dir haben 3 leute geantwortet.
    🙂

    Da lechzt er nach Anerkennung... 😃



  • _matze schrieb:

    Da lechzt er nach Anerkennung

    nö, der OP könnte was übersehen haben.
    🙂



  • Basher schrieb:

    Katzenstreu schrieb:

    Danke an euch beide!

    dir haben 3 leute geantwortet.
    🙂

    Ich habe nur Beiträge von dir und µngbd gelesen. Oder gab's noch einen Verrückten, hilfsbereiten, Programmierer? 😃 Mit _matze, der sich rein geschmuggelt hat, sind es nun 3 🤡. Und noch mehr Anerkennung gilt es hier zu erreichen: C/C++ Forum :: ANSI C :: Einlesen von Array mit scanf() und dem &-Operator



  • Da lechzt er nach Anerkennung... 😃

    Hehe. Aber irgendwie muss er ja auch, nachdem auch die Signatur sehr nach Bashar aussieht. Mir macht das aber wenig aus, weil ich gewohnt bin, beide ernst zu nehmen. 🙂



  • Nun habe ich es auch gesehen. Nach 5 mal schauen. Basher und Bashar. Ihr seid wohl zwangsläufig ein Team :).



  • Und noch mehr Anerkennung gilt es hier zu erreichen: C/C++ Forum :: ANSI C :: Einlesen von Array mit scanf() und dem &-Operator

    Ich hab's versucht. Jetzt würdest du mich in die Regierung wählen, oder? 😃



  • Na klar µngbd . Aber zumindest dann musst du dich beim Bund ausweisen oder dich hier registrieren :). Warum bist du nicht registriert?



  • Katzenstreu schrieb:

    Na klar µngbd . Aber zumindest dann musst du dich beim Bund ausweisen oder dich hier registrieren :). Warum bist du nicht registriert?

    Frag Basher mal, warum er registriert ist... 😉



  • Damit ihm niemand diesen genialen Namen wegnehmen kann. Stimmt's Basher?



  • Warum bist du nicht registriert?

    Das bin ich, aber ich verwende den Account nur in den Foren, wo man als Unreg nicht schreiben darf.

    Das hat mit Privatspähre zu tun, als Unreg können nur Marcus Bäckmann und die Moderatoren wissen, ob hinter "µngbd" immer der gleiche steckt. Und nach einigen Jahren hier vertraue ich ihnen in dem Zusammenhang. Ich mache aus "mngbd" (Account) meistens "µngbd" (Unreg). Kannst ja versuchen, herauszufinden, welche Accounts ich vorher hatte -- das geht, wenn man nur lange genug liest. 🙂

    Wenn ich aber registriert wäre, dann könnte die ganze Welt wissen, daß ich immer der gleiche bin. Und wenn du einmal jemanden angelogen hast, von wegen: "ich muss arbeiten", derjenige aber deinen Usernamen kennt, und herausfindet, daß du gar nicht arbeitest, sondern die ganze Zeit hier herumstreitest -- dann kann das dein Privatleben belasten. Zu allem Überfluss kann man nach den Beiträgen registrierter User suchen, aber nach denen von Unregs nicht. Also verhindere ich so, daß sich jeder Protokolle über meine Aktivitäten hier anzeigen lassen kann. 🙂

    Frag Basher mal, warum er registriert ist... 😉

    Ein kleiner Tip:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-249103-and-postdays-is-0-and-postorder-is-asc-and-start-is-20.html



  • Beispiel: hier steht alles, was du als Katzenstreu geschrieben hast:
    http://www.c-plusplus.net/forum/search-var-search_author-is-Katzenstreu.html



  • Hier prallen gerade Welten aufeinander. Datenschutz, das Argument hatte ich erwartet. Und nun sage ich dir, dass ich alle möglichen Google-Dienste nutzte weil ich sie richtig praktisch und gut finde. Auch wenn dadurch Daten von mir analysiert werden können. Und auch ein T-Mobile G! (HTC Dream) Handy mit Android benutzte ich. Außerdem mag ich Statistiken und finde es gut, dass man auch nach meine Beiträgen, Themen und Daten und Fakten recherchieren kann.
    Ich habe einen Freund, der ähnlich denkt wie du. Seine Festplatten sind komplett LVM-verschlüsselt. Seine Passworte im Netz sind überall unterschiedlich und extrem lang (>40 Zeichen). So etwas kann Hobby sein, aber ich versuche abzuwägen zwischen Komfort und Datenschutz. Auch in anderen Foren kannst du mich mit gleichem Nick finden. Und dann siehst du meinen vollen Namen und vieles mehr.

    Das würde hier eine Grundsatzdiskussion einleiten. Ich kann dich voll verstehen und akzeptiere deine Einstellung, zumindest solange dein Rechner nicht läuft und die fleißig schreibst :p.



  • Das würde hier eine Grundsatzdiskussion einleiten. Ich kann dich voll verstehen und akzeptiere deine Einstellung, zumindest solange dein Rechner nicht läuft und die fleißig schreibst :p.

    Das gilt natürlich auch umgekehrt. Was den Rechner angeht, solltest du knivil bestechen, sonst hilft er mich noch:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-249226.html

    Aber im Ernst: solange du Posts über versuchte Pufferüberläufe schreibst, und dich nicht im Gegensatz beschwerst, daß "er" zu "dumm" ist, die Arraygrenzen zu checken, kannst du hier auch ohne mich auf kompetente Hilfe zählen. Irgendwer hat immer eine Antwort. Und die wirklichen Gurus sind sowieso andere.

    Der politischen Diskussion über Datenschutz kann man eine gewisse Theorie-Lastigkeit nicht absprechen, auch wenn ich da näher bei deinem Freund bin als bei dir. Man weiß halt nie so genau was mit den Daten passiert und hat nur Theorien parat. Ich war schon früher mal aus Protest gegen eine gewisse elitäre Haltung oft als Unreg unterwegs, aber ich hatte wirklich einmal private Probleme wegen eines Accounts, und das ist gar nicht theoretisch.
    🙂

    Diese elitäre Haltung habe ich selbst übrigens auch manchmal:

    ich schrieb:

    Mir macht das aber wenig aus, weil ich gewohnt bin, beide ernst zu nehmen.

    Scheinbar kommt man nie ganz ohne Vorurteile aus...



  • µngbd schrieb:

    ...aber ich hatte wirklich einmal private Probleme wegen eines Accounts, und das ist gar nicht theoretisch.

    was war da? doch nicht etwa mit 'nem account von hier, oder?
    🙂



  • fricky schrieb:

    was war da? doch nicht etwa mit 'nem account von hier, oder?

    Doch, Account von hier.

    Da hab privat gelogen, und vorgegeben, sehr beschäftig zu sein. Aber mein Gegenüber kannte meinen Account-Namen (was ich nicht wusste) und hat mir so nachgewiesen, dass ich gelogen hatte...


Anmelden zum Antworten