Niente segmentation fault in mac osx?
Posted by Dibi Store Sun, 02 Mar 2008 17:21:00 GMT
Oggi pomeriggio stavo provando qualche semplice esempio di buffer overflow sul mio mac book e mi aspettavo (come negli altri sistemi) di ricevere un errore di segmentation fault qualora tentassi di sovrascrivere un array al di fuori della sua grandezza. L'esempio chiarisse cosa stavo tentanto di fare:
int main()
{
int array[5];
int i;
for(i = 0; i < 255; i++)
{
array[i] = 10;
}
printf("%d\n", array[40]);
return 0;
}
Cosa vi aspettereste di output? Bhe di certo non 10! Se qualcuno sa dirmi il perchè di sta cosa mi fa un piacere, certo è che sta cosa a mio parere può condurre ad errori e andrebbe tolta.


Il codice è un unico gigantesco undefined behaviour: sbagli dalla dichiarazione del main() al dimenticarti di includere stdio.h, e in un "programma" di linee 14 (linee bianche incluse). Il C non è Ruby, se il codice non è corretto e/o safe, il risultato è un undefined behaviour. Ti aspettavi un "avvertimento" ? Il C non esegue alcun check a riguardo, la libreria standard contiene una tonnellata di funzioni potenzialmente pericolose e da evitare come la peste. Prima di fare post su ultraipotetiche "falle" che avresti trovato tu con un programma di 10 righe (sbagliata) e non le migliaia di ingegneri Apple, fa 3 controlli.
Allora: non ho incluso stdio.h perchè non era necessaria al fine di mostrare il codice (non sono proprio cosi idiota). Non mi aspettavo un avvertimento, che è giusto che non ci sia, ma solamente che mi ritornasse un errore al momento dell'esecuzione. Non ho mai detto che questa è una 'falla' anche se secondo me è una cosa che non fa piacere, in quanto può indurre ad errori del cosiddetto 'fuori di uno' in quanto non ci si accorge dell'errore neanche eseguendo il programma.
@ngw non credo ci sia bisogno di attaccare l'autore in questo modo. Innanzitutto credo proprio che l'include "stdio.h" sia stato omesso in quanto scontato. Altrimenti quel codice non veniva neanche compilato perchè non trovava la dichiarazione di printf. per qunto riguarda il codice l'ho testato personalmente anche su una linux box con gcc 4.1.2, e effettivamente stampa 10 ma stampa anche un errore di segmentation fault. Attenzione molto probabilmente non vedi l'errore di segmentation fault perchè viene stampato non su stdout ma su stderr.
Sul mio blog trovi un post nel quale c'è tutta la spiegazione. Il link lo trovi sul mio nick.
Vecchio e' ovvio... Tu sei semplicemente andato a scrivere dati al di fuori del tuo array, ma questo non significa che stai andando a rompere le balle alla memoria protetta del sistema. In C ti puoi trovare a dichiarare un "int array[2]" e scrivere "array[10] = 1" senza che il compilatore ti dia errori e senza che a runtime ci siano problemi... nonostante l'evidente castrone. Per ottenere il SegFault (quello a cui vuoi arrivare credo) devi fare in modo di andare a sovrascrivere la parte di memoria dove a runtime viene messo l'intirizzo dello SP. Nel tuo caso specifico basta andare a scrivere piu' dati, tipo: #include int main() { int array[5], i; for(i = 0; i 10000; i++) { array[i] = 10; } return 0; } e qui si che ti da un bel "Segmentation fault"... domani te lo mostro se vuoi. PS @ Luna: bel post quello con la spiegazione, ma per queste mianchiatelle non serve scomodare un Ing. Dot. Prof.... basta avere "la capa in funzione" ;-)
Non sono andato a scomodare nessuno semplicemente ne discutevamo...è una persona che mi ha insegnato tanto e spesso discutiamo anche di cazzatelle....nonstante la capa mi funzioni benissimo
@Rocco Sicilia. Ok però non mi sembra così banale, mi ha aiutato la spiegazione nel post di Luca a capire un pò di più sulla gestione della memoria, approfondirò l'argomento cercando di capirne di più sulla gestione della memoria da parte del compilatore. anzi se qualcuno ha qualche risorsa è apprezzata.
lol, Luca perche' ti senti preso in causa? La mia frecciatina era per Oscar che gia' dovrebbe aver capito come sono fatto... Dopo tutto questo e' il blog di Oscar, mi rivolgo a lui... Del Ben, vieni giu' a vedere il mio codice ;-)
beh scusa parlavo di un mio caro amico ing all'inizio del mio post credevo ti riferissi a me :)...cmq fallo vedere anche a me il codice che ora sono diventato curioso ;P
Che a dire il vero devo ancora vedere anchio :D