Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Puntatori & segmentation fault

    Si può fare una cosa del genere ???

    codice:
    
    #include <stdio.h>
    #include <string.h>
    
    
    
    typedef char byte; 
    
    int main () { 
    
     byte * ptr = 0x0804850a;  
    
    	*ptr = 0x90; 
    	ptr++;
    	*ptr = 0x90; 
    
    
    
    return 0; 
    
    
    }
    Però il programma da segmentationfault al primo : *ptr = 0x90!!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sintatticamente sì, ma così tenti di scrivere nella locazione

    0x0804850a

    di cui non sai nulla, ovvero, molto probabilmente, non e' allocata al processo e quindi è vietato usarla.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    OK!! Probabilmente è allocata per un altro processo.....

    Pero io la posso leggere senza problemi giusto??? e se è già allocata per un altro processo non c'è modo di scriverla???

    Io sono sotto linux allocare le giuste posizioni di memoria se ne occupa il kernel, e quindi è lui che mi fa crasciare il programma, con il segnale SIGSEGV!!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da PeppePes88
    OK!! Probabilmente è allocata per un altro processo.....
    No ... lo spazio degli indirizzi e' virtuale. Ogni processo puo' avere allocata una propria locazione 0x0804850a ma sono tutte "diverse" tra i vari processi. Il discorso e' un po' complesso da spiegarsi in una risposta di un forum.

    Pero io la posso leggere senza problemi giusto??? e se è già allocata per un altro processo non c'è modo di scriverla???
    No ... non puoi ne' leggere ne' scriverla. Vedi risposta sopra.

    Io sono sotto linux allocare le giuste posizioni di memoria se ne occupa il kernel, e quindi è lui che mi fa crasciare il programma, con il segnale SIGSEGV!!
    E fa bene ...

    P.S. Che vorresti fare? Scrivere 0x90 (che corrisponde ad istruzioni NOP) in locazioni di memoria e' uno dei metodi usati per "superare" protezioni e simili ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    P.S. Che vorresti fare? Scrivere 0x90 (che corrisponde ad istruzioni NOP) in locazioni di memoria e' uno dei metodi usati per "superare" protezioni e simili ...
    Volevo solo sapere se si poteva fare una cosa del genere perchè sto ripassando i puntatori per un esame dove c'è anche un po di c.... é ho messo 0x90 per evitare danni nel caso avesse funzionato....

    Non vedo come si possano superare le protezioni se tanto il programma viene fermato dal kernel....

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da PeppePes88
    Volevo solo sapere se si poteva fare una cosa del genere perchè sto ripassando i puntatori per un esame dove c'è anche un po di c.... é ho messo 0x90 per evitare danni nel caso avesse funzionato....
    Questa non l'ho capita ...

    Comunque, non capisco perche' hai scelto il valore 0x90 ...

    Non vedo come si possano superare le protezioni se tanto il programma viene fermato dal kernel....
    Intanto questi meccanismi di protezione dell'accesso ad indirizzi virtuali non allocati sono propri della CPU (del suo hardware interno ...) e sono solamente "notificati" dal kernel ... comunque, lasciamo perdere ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    se mettevo un valore a caso poteva essere una qualche istruzione che faceva qualcosa di strano, per essere sicuro che non faceva niente ho messo nop!!! Non vedo cosa c'era di strano...

    Io livello d'hardware so che esiste una rete combinatoria che si occupa della corrispondenza tra indirizzi virtuali e indirizzi reali, nel mio libro si chiama mml, ma non che si occupasse di controllare se questi indirizzi fossero gia occupati... Ecco perchè dicevo che era il kernel ha occuparsene.....

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da PeppePes88
    se mettevo un valore a caso poteva essere una qualche istruzione che faceva qualcosa di strano, per essere sicuro che non faceva niente ho messo nop!!!
    Non e' proprio cosi' perche', ammesso di poter scrivere "a caso" una istruzione e che questa venga eseguita, il 0x90 potrebbe finire nel "mezzo" di una qualsiasi istruzione macchina lunga n byte ed alterarne il comportamento. Ad esempio, potrebbe alterare l'indirizzo di una locazione indicata come target di una qualsiasi istruzione macchina.

    Per riassumere, se non sai "esattamente" dove scrivi in memoria, non ha senso scegliere "cosa" scrivere ...

    Non vedo cosa c'era di strano...
    Ha invece senso se sai "esattamente" che quello che scrivi va a "sostituire" precise istruzioni macchina che normalmente effettuano dei "controlli" di protezione del software che, se sostituite con dei NOP, non hanno piu' effetto ... ecco perche' avevo delle perplessita' ... ma nulla di importante.

    Io livello d'hardware so che esiste una rete combinatoria che si occupa della corrispondenza tra indirizzi virtuali e indirizzi reali ...
    In ultima analisi, e' la CPU a sollevare l'eccezione ...

    Ecco perchè dicevo che era il kernel ha occuparsene.....
    ... a occuparsene ...

    In tutti i casi, secondo me, non e' per l'accesso ad indirizzi particolari che devi esercitarti con i puntatori, ma per l'uso comune all'interno dei programmi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.