<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Code Security</title><link>https://www.dotnetzone.gr:443/cs/forums/139/ShowForum.aspx</link><description>Περιοχή που συζητάμε για το το code security - ένα θέμα που πρέπει να απασχολεί κάθε προγραμματιστή.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Pointer Overflow Attacks</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/34525.aspx</link><pubDate>Tue, 28 Aug 2007 07:09:58 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:34525</guid><dc:creator>Thiseas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/34525.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=34525</wfw:commentRss><description>Pointer Overflow Attacks&lt;br&gt;&lt;br&gt;Τα διάφορα buffer oveflows είναι αρκετά "της μόδας" τελευταία και αυτό για πολλούς λόγους:&lt;br&gt;1. Πολλά προγράμματα είναι γραμμένα απρόσεκτα και πρόχειρα αφήνοντας "τρύπες".&lt;br&gt;2. Πολλοί προγραμματιστές απλά δεν γνωρίζουν πως να προστατέψουν τα προγράμματα τους.&lt;br&gt;3. Παλιές versions των compilers δεν έχουν μεθόδους προστασίας από επιθέσεις ή χρησιοποιούν μη ασφαλείς functions (π.χ. strcpy).&lt;br&gt;&lt;br&gt;&lt;br&gt;Ο σκοπός του post αυτού είναι να παρουσιάσω ένα πολύ απλό πρόγραμμα το οποίο είναι ευάλωτο (vulnerable) σε επίθέσεις Pointer Overflow.&lt;br&gt;Πρώτα θα παρουσιάσω το πρόγραμμα και μετά θα το τροποποιήσω έτσι ώστε να υλοποιήσω μια τέτοια επίθεση.&lt;br&gt;Φυσικά όλα αυτά που θα παρουσιαστούν είναι ΕΝΤΕΛΩΣ εκπαιδευτικά και ο λόγος που τα δίνω είναι για περαιτέρω μελέτη και προβληματισμό για την αποφυγή τέτοιων προβλημάτων στα προγράμματα σας.&lt;br&gt;&lt;br&gt;Την βασική ιδέα του προγράμματος που σας παρουσιαζω την πήρα από το βιβλίο "THE ART OF COMPUTER VIRUS RESEARCH AND DEFENSE" του Peter Szor.&lt;br&gt;&lt;br&gt;Tο πρόγραμμα το έχω δοκιμάσει σε Windows XP στους compilers: Dev C++ 4.9.9.2 και Microsoft Visual C++ 2005. &lt;br&gt;Θα ήθελα να παρουσιάσω τα παραδείγματα όπως τα έκανα στο Visual Studio 2005 και αυτό γιατί θέλω επίσης να δείξω κάποιες πολύ "καλές" δυνατότητες του πακέτου.&lt;br&gt;&lt;br&gt;Θα πρέπει να δημιουργείσετε ένα C++ project για WIN32 console application.&lt;br&gt;&lt;br&gt;Για να περάσει compile το πρόγραμμα στην MSC θα πρέπει να δηλώσετε στα options του compilation οτι το πρόγραμμα δεν χρησιμοποιεί "precompiled headers".&lt;br&gt;Αυτό μπορείτε να το κάνετε πηγαίνοντας στο:&lt;br&gt;Project | &amp;lt;Program Name&amp;gt; Properties... | Configuration Properties | C/C++ | Precopiled Headers = "Not Using Precompiled Headers"&lt;br&gt;&lt;br&gt;Βεβαια για να μπορέσετε να κατανοήσετε τα αποτελέσματα πρέπει να κάνετε compile σε debug mode.&lt;br&gt;Συγκεκριμένα (για τους λάτρεις της command line - και όχι μόνο) οι flags που θα πρέπει να έχετε είναι:&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/Od /D &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"WIN32"&lt;/span&gt; /D &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"_DEBUG"&lt;/span&gt; /D &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"_CONSOLE"&lt;/span&gt; /D &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"_UNICODE"&lt;/span&gt; /D &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"UNICODE"&lt;/span&gt; /Gm /EHsc /MDd /Fo&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug\\"&lt;/span&gt; /Fd&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug\vc80.pdb"&lt;/span&gt; /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt&lt;/span&gt;&lt;br&gt;
&lt;br&gt;Έστω λοιπόν οτι έχουμε το παρακάτω μικρό και αθώο πρόγραμμα:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;001 #include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"stdio.h"&lt;/span&gt;&lt;br&gt;002 #include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"string.h"&lt;/span&gt;&lt;br&gt;003 #include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"stdlib.h"&lt;/span&gt;&lt;br&gt;004&lt;br&gt;005 &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; CallBack(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; *szTemp)                  &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Μια απλή function που δέχεται ένα string και το τυπώνει στην οθόνη.&lt;/span&gt;&lt;br&gt;006 {&lt;br&gt;007 printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"CallBack(%s)\n"&lt;/span&gt;, szTemp);&lt;br&gt;008 &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0;&lt;br&gt;009 }&lt;br&gt;010&lt;br&gt;011 &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; main(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; argc, &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; **argv)&lt;br&gt;012 {&lt;br&gt;013     &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; buffer&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-29.gif" alt="Music" /&gt;;                  &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Ορίζω ένα string 8 θέσεων.&lt;/span&gt;&lt;br&gt;014     &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; (*funcptr)(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; *szTemp);    &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Ορίζω έναν pointer σε function που δέχεται σαν παραμετρο ενα pointer σε χαρακτήρα/ες (δηλ. ενα string).&lt;/span&gt;&lt;br&gt;015&lt;br&gt;016     funcptr &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; CallBack;                     &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Θέτω τον pointer να δείχνει την function που όρισα στην αρχή.&lt;/span&gt;&lt;br&gt;017     strcpy(buffer,  &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"hi!"&lt;/span&gt;);                 &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Δίνω στην μεταβλητή Buffer μια τιμή...&lt;/span&gt;&lt;br&gt;018&lt;br&gt;019     (*funcptr)(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"param"&lt;/span&gt;);                    &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Καλώ την function με τη χρήση του pointer που δείχνει σε αυτήν.&lt;/span&gt;&lt;br&gt;020&lt;br&gt;021     printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"End of the program.\n"&lt;/span&gt;);        &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Ωχ!!! τι κάνω εδώ? ξέχασα... ;)&lt;/span&gt;&lt;br&gt;022                         &lt;br&gt;023     &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0;                               &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Επιστρεφω στο λειτουργικό (στην μεταβλητη συστήματος errorlevel) την τιμή 0. Δηλ. Τέλος Προγράμματος.&lt;/span&gt;&lt;br&gt;024 }&lt;/span&gt;&lt;br&gt;&lt;br&gt;Αν αυτό το τρέξουμε θα πάρουμε τα παρακάτω:&lt;br&gt;&lt;pre&gt;&lt;font color="#008000"&gt;&lt;font color="#000000"&gt;CallBack(param)&lt;br&gt;End of the program.&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Τίποτα το ιδιαίτερο μέχρι στιγμής.&lt;br&gt;&lt;br&gt;Παρατηρώ λίγο τον κώδικα...&lt;br&gt;χμ...&lt;br&gt;Κατ' αρχάς υπάρχει η &lt;b&gt;strcpy&lt;/b&gt;... χμ, κακό αυτό... Ωπα! Εδω έχουμε vulnerable Κώδικα!!&lt;br&gt;Σκέφτομαι.... &lt;br&gt;Αν κάνω buffer overflow στην μεταβλητή buffer τι θα γίνει?&lt;br&gt;Δηλαδή αν γράψω την γραμμή 017 ως εξής:&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;br&gt;017     strcpy(buffer,  &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"1234567_102030"&lt;/span&gt;);&lt;br&gt;&lt;/span&gt;&lt;br&gt;Ξερετε τι θα γίνει?&lt;br&gt;H Buffer είναι 8 χαρακτηρες.&lt;br&gt;Άρα θα κρατήσει τους πρώτους 8 χαρακτηρες στην buffer και οι υπόλοιποι '102030' θα... "περισέψουν"!!&lt;br&gt;Αλλά επειδή στον κόσμο του προγραμματισμού δεν περισεύει τίποτα, αυτοί οι υπόλοιποι χαρακτήρες θα θεωρήσει το πρόγραμμα οτι ανήκουν στην επομενη εντολη.&lt;br&gt;Ποιά ειναι η επόμενη εντολή?&lt;br&gt;Προσέχτε μην πείτε την γραμμή 018 ή την 019!!&lt;br&gt;Κάνω overwrite το buffer!&lt;br&gt;Που ορίζεται το buffer? Στην γραμμή 013 (είδες? είναι και γρουσούζικη!)&lt;br&gt;Άρα το "περίσσεμα" ποια γραμμή θα καλύψει?... μα την 014.&lt;br&gt;Ποια είναι η 014... η δήλωση του Function Pointer!!!! &lt;br&gt;Voila!!&lt;br&gt;Μετά λοιπόν την εκτέλεση της αλλαγμένης γραμμής 017 θα επιρεαστεί η μνήμη που έχει κρατηθεί από τις γραμμές 013 και 014, οπότε ο function pointer δεν θα δείχνει πια την fuction callback.&lt;br&gt;Τι θα δείχνει?&lt;br&gt;Μα το περίσευμα μου... την εντολή που υπάρχει στην διεύθυνση 102030... &lt;br&gt;χμ.... οκ οχι ακριβώς 102030 γιατι το πρόγραμμα δεν δουλεύει με τον σειριακό τρόπο που σκεφτόμαστε εμείς.&lt;br&gt;Στην πράξη το πρόγραμμα θα εκτελέσει οτι βρίσκεται στη διεύθυνση χ30 χ20 χ10, δηλαδή το '102030' ανάποδα (ανα 2) και φυσικά δεκαεξαδικό!!&lt;br&gt;Χοντρικά, σκεφτείτε οτι μετα την εκτέλεση του strcpy(buffer,&amp;nbsp; "1234567_102030"); η μνημη μου θα γίνει έτσι:&lt;br&gt;&lt;pre&gt;MNHMH&lt;br&gt;STACK&amp;nbsp; 		TIMH&lt;br&gt;--------	---------&lt;br&gt;buffer 		1234567_&lt;br&gt;funPtr 		102030&lt;/pre&gt;&lt;br&gt;Οπότε η γραμμή &lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;019     (*funcptr)(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"param"&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;br&gt;Θα πάει να εκτελέσει οτι είναι στην διεύθυνση funPtr που τώρα πια είναι το 102030!!&lt;br&gt;&lt;br&gt;Τώρα θα κάνουμε ένα κόλπο.&lt;br&gt;θα κάνουμε buffer overflow και θα οδηγήσουμε το πρόγραμμα εκεί που θέλουμε εμείς.&lt;br&gt;Ας πουμε να το οδηγήσουμε κατευθείαν να εκτελέσει την γραμμή 021 χωρίς να καλέσει ποτέ την function callback.&lt;br&gt;&lt;br&gt;Δηλαδή να κάνουμε buffer overflow και να δώσουμε σαν "περίσευμα" την διεύθυνση της εντολής στην γραμμή 021.&lt;br&gt;Αν το πετύχουμε αυτό, θα πρέπει μόλις εκτελέσουμε το πρόγραμμα να δούμε:&lt;br&gt;&lt;br&gt;&lt;pre&gt;End of the program.&lt;/pre&gt;&lt;br&gt;και όχι το παρακάτω που βλέπαμε πριν:&lt;br&gt;&lt;pre&gt;CallBack(param)&lt;br&gt;End of the program.&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Χμ.... πως θα το κάνουμε αυτό?&lt;br&gt;Το Visual Studio μας προσφέρει ένα όμορφο τρόπο...&lt;br&gt;Λοιπόν.... σηκώνουμε μανίκια γιατί θα λερώσουμε λίγο τα χέρια μας...&lt;br&gt;Δεν αλλάζουμε τίποτα!! στο πρόγραμμα μας ακόμα!!&lt;br&gt;Βάζουμε ένα break point στην γραμμη 021.&lt;br&gt;Πατάμε f6 για build και μετά &lt;br&gt;Πατάμε f5 για να ξεκινήσει το debug.&lt;br&gt;Μόλις τοποθετηθουμε στην γραμμή 021, πατάμε CTRL+ALT+D ή από το μενού (Debug|Windows|Disassembly).&lt;br&gt;Θα ανοίξει ένα window με τον dissasmbled κώδικα που μόλις γράψαμε και τον cursor τοποθετημένο στο κρίσιμο σημείο:&lt;br&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 19: &amp;nbsp;&amp;nbsp; &amp;nbsp;(*funcptr)("param"); &lt;br&gt;004112B5 68 68 46 41 00&amp;nbsp;&amp;nbsp; push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset string "param" (414668h) &lt;br&gt;004112BA FF 15 28 61 41 00 call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [funcptr (416128h)] &lt;br&gt;004112C0 83 C4 04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esp,4 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20: &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 21: &amp;nbsp;&amp;nbsp; &amp;nbsp;printf("End of the program.\n"); &lt;br&gt;004112C3 68 4C 46 41 00&amp;nbsp;&amp;nbsp; push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset string "End of the program.\n" (41464Ch) &lt;br&gt;004112C8 FF 15 38 72 41 00 call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [__imp__printf (417238h)] &lt;br&gt;004112CE 83 C4 04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esp,4 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22: &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 23: &amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&lt;br&gt;&lt;br&gt;&lt;/font&gt;Εδώ φαίνεται καθαρά η διεύθυνση της γραμμής 21, Είναι η 004112C3 (φυσικά σε 16δική μορφή)&lt;br&gt;&lt;br&gt;Πώς πρέπει να την περάσουμε όμως εμείς για δουλέψει?&lt;br&gt;θυμάστε το κόλπο?&lt;br&gt;Ανα δυο αντίστροφα και δεκαεξαδικα.&lt;br&gt;Δηλαδή:&lt;br&gt;C31241 ή καλύτερα σαν C string: "\xc3\x12\x41"&lt;br&gt;&lt;br&gt;Τις 16δικές τιμές "68 4C 46 41 00" που είναι δίπλα στην διεύθνση ίσως εσείς δεν τις βλέπετε. &lt;br&gt;Είναι τα λεγόμενα code bytes του Assembly κώδικα (χρήσιμο συνήθως σε αυτούς που φτιάχνουν Xploits).&lt;br&gt;Αν θέτε (πορτοκαλάδα θέτε! - από πορτοκάλια? [άσχετο] ) να τα δείτε κάντε Right-Click και τσεκάρετε το "Show Code Bytes".&lt;br&gt;&lt;br&gt;Οπότε το πρόγραμμα μας γίνεται:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;001 #include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"stdio.h"&lt;/span&gt;&lt;br&gt;002 #include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"string.h"&lt;/span&gt;&lt;br&gt;003 #include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"stdlib.h"&lt;/span&gt;&lt;br&gt;004&lt;br&gt;005 &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; CallBack(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; *szTemp)                  &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Μια απλή function που δέχεται ένα string και το τυπώνει στην οθόνη.&lt;/span&gt;&lt;br&gt;006 {&lt;br&gt;007 printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"CallBack(%s)\n"&lt;/span&gt;, szTemp);&lt;br&gt;008 &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0;&lt;br&gt;009 }&lt;br&gt;010&lt;br&gt;011 &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; main(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; argc, &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; **argv)&lt;br&gt;012 {&lt;br&gt;013     &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; buffer&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-29.gif" alt="Music" /&gt;;                   &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Ορίζω ένα string 8 θέσεων.&lt;/span&gt;&lt;br&gt;014     &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; (*funcptr)(&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; *szTemp);     &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Ορίζω έναν pointer σε function που δέχεται σαν παραμετρο ενα pointer σε χαρακτήρα/ες (δηλ. ενα string).&lt;/span&gt;&lt;br&gt;015&lt;br&gt;016     funcptr &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; CallBack;                      &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Θέτω τον pointer να δείχνει την function που όρισα στην αρχή.&lt;/span&gt;&lt;br&gt;017        strcpy(buffer,  &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"1234567_\xc3\x12\x41"&lt;/span&gt;); &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// buffer overflow: goto at printf("End of the program.\n");&lt;/span&gt;&lt;br&gt;018&lt;br&gt;019     (*funcptr)(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"param"&lt;/span&gt;);                     &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Καλώ την function με τη χρήση του pointer που δείχνει σε αυτήν.&lt;/span&gt;&lt;br&gt;020&lt;br&gt;021     printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"End of the program.\n"&lt;/span&gt;);         &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Ωχ!!! τι κάνω εδώ? ξέχασα... ;)&lt;/span&gt;&lt;br&gt;022                         &lt;br&gt;023     &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0;                                &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Επιστρεφω στο λειτουργικό (στην μεταβλητη συστήματος errorlevel) την τιμή 0. Δηλ. Τέλος Προγράμματος.&lt;/span&gt;&lt;br&gt;024 }&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Όλο το πρόβλημα δημιουργληθηκε απο την strcpy. &lt;br&gt;Η Micro$oft προτείνει την strcpy_s, αν και νομίζω οτι και η strncpy είναι αρκετή, απλά θέλει ακόμα μια παράμετρο....&lt;br&gt;&lt;br&gt;&lt;br&gt;Happy Coding Guys...&lt;br&gt;</description></item></channel></rss>