2010-04-11 24 views
6

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

7

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.

1

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).

+2

@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. –

+0

Sono abbastanza d'accordo, @Stephen, ed è per questo che ho espresso questo punto esplicitamente nella mia risposta ("... si basano su qualche vulnerabilità ..."). –

4

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).

+1

Si potrebbe voler guardare varie API di debug là fuori. Potresti essere sorpreso di quanto possa essere insicura la memoria "protetta" nel mondo reale. –

+0

@ttmrichter: il punto non è la sicurezza, è la stabilità. –

+3

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. –

1

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.

0

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.

Problemi correlati