Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 07 Σεπ 2011, 14:50

πΑΝτως και εκεινο που καναμε με την συναρτηση και την προβληματικη fgets ουσιαστικα και εκεινο ειχε θεματα με την ανω υπερχειλιση και αυτο ουσιαστικα νομιζω πρεπει να περιγραφει ενα exploit? ή οχι? Και μετα η νεα ασφαλης συναρτηση που προεκυψε περιλαμβανοντας μεσα και τον μηδενικο αλλα και τον χαρακτηρα νεας γραμμης μπορει να πει κανεις πως ηταν ενα patch? στον κωδικα.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 07 Σεπ 2011, 15:05

Star_Light έγραψε:πΑΝτως και εκεινο που καναμε με την συναρτηση και την προβληματικη fgets ουσιαστικα και εκεινο ειχε θεματα με την ανω υπερχειλιση και αυτο ουσιαστικα νομιζω πρεπει να περιγραφει ενα exploit? ή οχι? Και μετα η νεα ασφαλης συναρτηση που προεκυψε περιλαμβανοντας μεσα και τον μηδενικο αλλα και τον χαρακτηρα νεας γραμμης μπορει να πει κανεις πως ηταν ενα patch? στον κωδικα.

Δεν έχω ιδέα σε ποιες συναρτήσεις αναφέρεσαι :lol:
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 07 Σεπ 2011, 15:23

migf1 έγραψε:
Δεν έχω ιδέα σε ποιες συναρτήσεις αναφέρεσαι :lol:


Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<stdlib.h>
#define N 10
void func(char str[N]);
int main()
{
char str[N]="";

printf("Dwste mia simvoloseira: \n");
fgets(str,N,stdin);

printf("\n");
func(str);

return 0;
}
void func(char str[N])
{
char *str_ptr;
str_ptr=str;

for(str_ptr=str; *str_ptr!='\0' && *str_ptr!='\n'; str_ptr++)

putchar(*str_ptr);

printf("\n\n");

while(str_ptr!=str)
{
str_ptr--;
printf("%c",*str_ptr);
}

return;
}
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 07 Σεπ 2011, 15:38

Star_Light έγραψε:
migf1 έγραψε:
Δεν έχω ιδέα σε ποιες συναρτήσεις αναφέρεσαι :lol:


Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<stdlib.h>
#define N 10
void func(char str[N]);
int main()
{
char str[N]="";

printf("Dwste mia simvoloseira: \n");
fgets(str,N,stdin);

printf("\n");
func(str);

return 0;
}
void func(char str[N])
{
char *str_ptr;
str_ptr=str;

for(str_ptr=str; *str_ptr!='\0' && *str_ptr!='\n'; str_ptr++)

putchar(*str_ptr);

printf("\n\n");

while(str_ptr!=str)
{
str_ptr--;
printf("%c",*str_ptr);
}

return;
}

Όντως, μπουούν να πάθουν bufffer overflow αλλά το exploit που κολλά;
Επίσης για να κάνω μια γενική ερώτηση, το buffer overflow προκαλείται δλδ όταν δεν κάνουμε ελέγχους;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 07 Σεπ 2011, 16:14

stamatiou έγραψε:
Επίσης για να κάνω μια γενική ερώτηση, το buffer overflow προκαλείται δλδ όταν δεν κάνουμε ελέγχους;

Το buffer overflow προκαλείται όταν το πρόγραμμά σου επιχειρεί να γεμίσει έναν πίνακα με περισσότερα στοιχεία από όσα τον έχεις ορίσει να δέχεται ως μέγιστο πλήθος. Οπότε όταν για παράδειγμα έχεις μια συνάρτηση insert_element( int array[], int element) που προσθέτει το στοιχείο element στον πίνακα array, πρέπει μέσα της να ελέγχεις ώστε αν ο πίνακας είναι ήδη γεμάτος να μην πάει να προσθέσει το element μετά το τέλος του πίνακα... γιατί αν το προσθέσει εκεί θα έχεις buffer overflow.

Το buffer overflow εγείρει segmentation-fault στο σύστημα (ίσως όχι αμέσως όμως, ίσως και ποτέ).

Λοιπόν φαντάσου πως έχεις ορίσει έναν πίνακα 3 πραγματικών και μια μεταβλητή ενός χαρακτήρα.

Κώδικας: Επιλογή όλων

float array[3];
char c;


Φαντάσου τώρα ότι στο memory-layout του προγράμματος σου (όταν φορτωθεί δλδ στη μνήμη) αυτά τα δυο έχουν καταλάβει διαδοχικά κομμάτια μνήμης, π.χ...

Κώδικας: Επιλογή όλων

θέσεις μνήμης:
... 20000001 20000001 20000002 20000003 ...
... array[0] array[1] array[2] c
στο έχω απλοποιημένο το σχέδιο (π.χ. το καθένα από τα array[0] δεν πιάνει μονάχα 1 byte όπως υπονοεί το σχέδιο αυτό)

Αν εσύ με οποιονδήποτε τρόπο, έμμεσο ή άμεσο, γράψεις κάτι σαν αυτό:

Κώδικας: Επιλογή όλων
array[3] = 4.0;

τότε πας και βάζεις στη μνήμη 20000003 που έχει δεσμευτεί τη μεταβλητή c τον πραγματικό αριθμό 4.0 (και μάλιστα επειδή οι πραγματικοί αριθμοί πιάνουν περισσότερα του 1byte που πιάνουν οι χαρακτήρες, εκείνο το 4.0 θα πάει να κάνει overwrite και άλλα bytes μετά το c.

Οπότε όταν τα πρόγραμμά σου επιχειρήσει κατόπιν να χρησιμοποιήσει τη μεταβλητή c (ή οτιδήποτε έπεται κι έχει γίνει overwrite) στην καλύτερη των περιπτώσεων το c θα έχει τιμή ότι να'ναι και στη χειρότερη θα σου βαρέσει seg-fault. Αν τα έξτρα bytes είναι πολλά και πάνε να κάνουν overwrite μνήμη που το λειτουργικό την έχει μαρκάρει ως read-only, τότε το seg-fault θα προκληθεί άμεσα.

Seg-fault δεν εγείρεται μονάχα λόγω buffer-overflow, εγείρεται από διάφορους λόγους ένας εκ των οποίων μπορεί να είναι και το buffer-overflow. Άλλος λόγος που προκαλεί seg-fault είναι όταν προσπαθούμε να χρησιμοποιήσουμε τα περιεχόμενα ενός δείκτη που είναι NULL, ή να χρησιμοποιήσουμε undefined περιεχόμενα ενός δείκτη.

Το exploit κολλάει στο ότι π.χ. μια περίπτωση είναι χάκερς να ψάχνουν για παραγόμενα seg-faults ή να προκαλούν μόνοι τους seg-faults και να κάνουν overwrite με δικό τους τον κώδικα του λειτουργικού που είναι γραμμένος να τρέχει όταν υπάρξει seg-fault.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 07 Σεπ 2011, 16:24

ακριβως στο exploit εκμεταλευεσαι κενα στον κωδικα... κενα που δεν προσεξε ο προγραμματιστης για τον Α ή Β λογο
και τελικα μια ενημερωμενη εκδοση (μια διορθωμενη δηλαδη συναρτηση) διορθωνει τα προηγουμενα λαθη και ετσι εχουμε και τις αναβαθμισεις...
ειναι ακριβως μικρογραφια του οτι εχουμε κανει εδω και με την fgets που μας εδινε ο migf1 απλα οταν τα κοιταζεις εκ των εσω οπως κανουμε εμεις εδω
ειναι σιγουρα ευκολοτερο να τα κατανοησεις απο οτι αν τα διαβαζεις απλα απο ενα περιοδικο ή καποιο βιβλιο ασφάλειας χωρις να εισαι ενεργος
στην παραγωγη και ενασχοληση με τον κωδικα.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 07 Σεπ 2011, 16:42

Star_Light έγραψε:
migf1 έγραψε:
Δεν έχω ιδέα σε ποιες συναρτήσεις αναφέρεσαι :lol:

Spoiler: show
Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<stdlib.h>
#define N 10
void func(char str[N]);
int main()
{
char str[N]="";

printf("Dwste mia simvoloseira: \n");
fgets(str,N,stdin);

printf("\n");
func(str);

return 0;
}
void func(char str[N])
{
char *str_ptr;
str_ptr=str;

for(str_ptr=str; *str_ptr!='\0' && *str_ptr!='\n'; str_ptr++)

putchar(*str_ptr);

printf("\n\n");

while(str_ptr!=str)
{
str_ptr--;
printf("%c",*str_ptr);
}

return;
}

Δεν έχω δώσει εγώ τέτοια συνάρτηση!
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 07 Σεπ 2011, 17:03

migf1 έγραψε:
Δεν έχω δώσει εγώ τέτοια συνάρτηση!


Eγω την εχω φτιαξει , αλλα βοηθησες και εσυ. ;)
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 07 Σεπ 2011, 17:23

Α οκ, λέω κι εγώ :lol:

Λοιπόν, είμαστε ΟΚ με τα NULL κλπ για να προχωρήσουμε;

Να δώσω μια περιληπτική άσκηση να δούμε που βρισκόμαστε...
Κώδικας: Επιλογή όλων

char *s_copy( char *dst, const char *src )
{
char *save = dst;
while ( (*dst++=*src++) )
;
return save;
}

Αυτός ο κώδικας αντιγράφει τα περιεχόμενα του string src στο string dst χωρίς να ελέγχει για ενδεχόμενο buffer-overflow στον dst. Επίσης δεν ελέγχει αν κάποιο ή και τα δύο από τα strings έχουν περαστεί στη συνάρτηση ως NULL.

  1. προσθέστε ελέγχους που θα αποτρέπουν την πρόσβαση σε οποιοδήποτε *dst ή *src αν οι δείκτες που τους αντιστοιχούν είναι NULL
  2. προτείνετε τρόπους ώστε η συνάρτηση να αποτρέπει ενδεχόμενο buffer-overflow στον dst
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 07 Σεπ 2011, 18:36

οποιος την κανει να την δωσει σε σποιλερ γιατι εγω ισως την κανω πιο μετα... μιας και εχω κατι αλλο να κανω τωρα ;)
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι