Esiste un linguaggio di programmazione veramente di basso livello che possa accedere direttamente alla variabile di memoria? Ad esempio, se ho un programma ho una variabile i
. Qualcuno può accedere alla memoria per cambiare la mia variabile di programma i
in un altro valore?Un programma può assegnare direttamente la memoria?
risposta
Come esempio di come modificare la variabile in un programma da "l'esterno", prendere in considerazione l'uso di un debugger. Esempio di programma:
$ cat print_i.c
#include <stdio.h>
#include <unistd.h>
int main (void) {
int i = 42;
for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
return 0;
}
$ gcc -g -o print_i print_i.c
$ ./print_i
i = 42
i = 42
i = 42
…
(. Il programma stampa il valore di i
ogni 3 secondi)
In un altro terminale, trovare l'ID di processo del programma in esecuzione e collegare il gdb
debugger ad esso:
$ ps | grep print_i
1779 p1 S+ 0:00.01 ./print_i
$ gdb print_i 1779
…
(gdb) bt
#0 0x90040df8 in mach_wait_until()
#1 0x90040bc4 in nanosleep()
#2 0x900409f0 in sleep()
#3 0x00002b8c in main() at print_i.c:6
(gdb) up 3
#3 0x00002b8c in main() at print_i.c:6
6 for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
(gdb) set variable i = 666
(gdb) continue
Ora l'output del programma cambia:
…
i = 42
i = 42
i = 666
Quindi, sì, è possibile cambiare la variabile di un programma da "esterno" se si ha accesso alla sua memoria. Ci sono molti avvertimenti qui, ad es. è necessario individuare dove e come viene memorizzata la variabile. Qui è stato facile perché ho compilato il programma con i simboli di debugging. Per un programma arbitrario in un linguaggio arbitrario è molto più difficile, ma ancora teoricamente possibile. Naturalmente, se non fossi il proprietario del processo in esecuzione, un sistema operativo ben educato non mi permetterebbe di accedere alla sua memoria (senza "hacking"), ma è tutta un'altra questione.
Se un altro processo dispone di autorizzazioni sufficienti, può modificare la memoria del processo. Su Linux, è semplice come leggere e scrivere lo pseudo-file /proc/{pid}/mem
. Questo è il numero di exploit che funzionano, anche se fanno affidamento su una vulnerabilità che consente loro di funzionare con privilegi molto elevati (root su Unix).
Certo, a meno che, naturalmente, il sistema operativo non protegga la memoria per conto dell'utente. Il linguaggio macchina (il linguaggio di programmazione di livello più basso) sempre "accede direttamente alla memoria", ed è piuttosto facile da ottenere in C (eseguendo per esempio una sorta di numero intero di puntatori, ad esempio). Il punto è, a meno che questo codice non sia in esecuzione nel tuo processo (o nel kernel), qualunque sia la lingua in cui è scritto, il sistema operativo normalmente proteggerebbe il tuo processo da tali interferenze (mappando la memoria in vari modi per diversi processi, per esempio).
Si potrebbe voler guardare varie API di debug là fuori. Potresti essere sorpreso di quanto possa essere insicura la memoria "protetta" nel mondo reale. –
@ttmrichter: il punto non è la sicurezza, è la stabilità. –
Le stesse API di debug rendono talvolta anche la stabilità un problema. Soprattutto quando i programmatori di cowboy li usano per aggirare problemi di progettazione. –
Risposta breve: sì. Risposta lunga: dipende da un sacco di fattori tra cui l'hardware (gestione della memoria?), Il tuo sistema operativo (spazi degli spazi virtuali protetti? Caratteristiche per eludere queste protezioni?) E la conoscenza dettagliata che il tuo avversario può avere o meno di entrambe le lingue architettura e la struttura dell'applicazione.
Dipende. In generale, una delle funzioni di un sistema operativo è chiamata segmentazione - che significa mantenere i programmi fuori dalla memoria dell'altro. Se scrivo un programma che tenta di accedere alla memoria che appartiene al tuo programma, il sistema operativo dovrebbe bloccarmi, dal momento che sto commettendo qualcosa chiamato un errore di segmentazione .
Ma ci sono situazioni in cui posso aggirare il problema. Ad esempio, se ho privilegi di root sul sistema, potrei essere in grado di accedere alla tua memoria. O peggio: posso eseguire il tuo programma all'interno di una macchina virtuale, quindi sedermi fuori da quella VM e fare ciò che voglio nella sua memoria.
Quindi, in generale, si dovrebbe presumere che una persona malintenzionata possa raggiungere e disturbare la memoria del programma se si sforzano abbastanza.
- 1. Redis bgsave fallito perché la forcella non può assegnare memoria
- 2. Python os.fork OSError: [Errno 12] non può assegnare memoria (ma la memoria non è il problema)
- 3. Assegnare la memoria al doppio puntatore?
- 4. può essere utilizzato per la memoria e il profilo di utilizzo della CPU di un programma
- 5. Contatore del programma di lettura direttamente
- 6. Un programma può calcolare la complessità di un algoritmo?
- 7. Possiamo assegnare un valore ad una posizione di memoria data?
- 8. non può assegnare accoppiare in una mappa
- 9. Perché un programma Java vuoto consuma memoria?
- 10. Utilizzo memoria: il programma assegna troppa memoria
- 11. Chiunque programma ancora usando xlib direttamente
- 12. un programma può leggere la propria sezione elfo?
- 13. È possibile scrivere direttamente un programma con istruzioni bytecode Java?
- 14. Come assegnare direttamente numeri complessi a una variabile?
- 15. Gestione file di memoria mappato in C# direttamente dalla memoria
- 16. La memoria riservata può causare un'eccezione di memoria insufficiente
- 17. Download del file direttamente nella memoria
- 18. Può sklearn la foresta casuale gestire direttamente le funzioni categoriali?
- 19. rapida UIGraphicsGetImageFromCurrentImageContext non può liberare la memoria
- 20. Elixir/Erlang può copiare un processo, compresa la sua memoria?
- 21. C'è un modo per limitare la memoria, ghci può avere?
- 22. Un programma può distinguere tra l'ingresso della chiave utente e l'ingresso della chiave del programma?
- 23. "ATTENZIONE: Non può mass-assegnare protetta attributi"
- 24. non può assegnare a struct variabile
- 25. (12) non può assegnare memoria: Impossibile creare il processo figlio:/opt/suPHP/sbin/suPHP
- 26. Può Fortran leggere i byte direttamente da un file binario?
- 27. Come si può sviluppare un programma come FRAPS?
- 28. errore: non si può assegnare un valore alla variabile finale
- 29. Può essere immutabile un maiale memoria?
- 30. Come posso profilare la memoria del programma multithread in Python?
@Marcelo - sembra che implichi che il file system proc' è un buco di sicurezza. In effetti, il buco della sicurezza è ciò che consente ai cattivi di ottenere il privilegio di root. –
Sono abbastanza d'accordo, @Stephen, ed è per questo che ho espresso questo punto esplicitamente nella mia risposta ("... si basano su qualche vulnerabilità ..."). –