2010-04-11 9 views
6

¿Hay algún lenguaje de programación realmente bajo que pueda acceder directamente a la variable de memoria? Por ejemplo, si tengo un programa, tengo una variable i. ¿Alguien puede acceder a la memoria para cambiar mi variable de programa i a otro valor?¿Puede un programa asignar la memoria directamente?

Respuesta

7

Como un ejemplo de cómo cambiar la variable en un programa desde "el exterior", considere el uso de un depurador. Programa de ejemplo:

$ 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 
… 

(. El programa imprime el valor de i cada 3 segundos)

En otro terminal, encontrar el identificador de proceso del programa en ejecución y adjuntar el depurador gdb a ella:


$ 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 

Ahora la salida del programa de cambios:

… 
i = 42 
i = 42 
i = 666 

Entonces, sí, es posible cambiar la variable de un programa desde "afuera" si tiene acceso a su memoria. Aquí hay muchas advertencias, p. uno necesita ubicar dónde y cómo se almacena la variable. Aquí fue fácil porque compilé el programa con símbolos de depuración. Para un programa arbitrario en un lenguaje arbitrario es mucho más difícil, pero todavía teóricamente posible. Por supuesto, si yo no fuera el propietario del proceso en ejecución, entonces un sistema operativo con buena conducta no me permitiría acceder a su memoria (sin "piratear"), pero esa es una pregunta completamente diferente.

1

Si otro proceso tiene suficientes permisos, puede cambiar la memoria de su proceso. En Linux, es tan simple como leer y escribir el pseudo-archivo /proc/{pid}/mem. Esta es la cantidad de vulnerabilidades que funcionan, aunque confían en alguna vulnerabilidad que les permite ejecutarse con privilegios muy altos (root en Unix).

+2

@Marcelo - parece implicar que el sistema de archivos 'proc' es un agujero de seguridad. De hecho, el agujero de seguridad es lo que permite que los malos obtengan privilegios de root. –

+0

Estoy muy de acuerdo, @Stephen, por lo que expresé este punto de forma explícita en mi respuesta ("... confían en cierta vulnerabilidad ..."). –

4

Claro, a menos que, por supuesto, el sistema operativo proteja esa memoria en su nombre. El lenguaje de máquina (el lenguaje de programación de nivel más bajo) siempre "accede a la memoria directamente", y es bastante fácil de lograr en C (por ejemplo, al convertir un tipo de entero en puntero). El punto es que, a menos que este código se ejecute en su proceso (o kernel), sea cual sea el idioma en el que esté escrito, el sistema operativo normalmente protegería su proceso de dicha interferencia (asignando la memoria de varias maneras para diferentes procesos, por ejemplo).

+1

Es posible que desee ver varias API de depuración por ahí. Puede que se sorprenda de cuán insegura puede ser la memoria "protegida" en el mundo real. –

+0

@ttmrichter: el punto no es la seguridad, es la estabilidad. –

+3

Esas mismas API de depuración también hacen que la estabilidad sea un problema. Especialmente cuando los codificadores vaqueros los usan para evitar problemas de diseño. –

1

Respuesta corta: sí. Respuesta larga: depende de muchos factores, incluyendo su hardware (¿administración de memoria?), Su sistema operativo (características de espacios de direcciones virtuales protegidos para eludir estas protecciones?) Y el conocimiento detallado que su oponente puede o no tener de su lenguaje arquitectura y la estructura de tu aplicación.

0

Depende. En general, una de las funciones de un sistema operativo se llama segmentación - eso significa mantener programas fuera de la memoria del otro. Si escribo un programa que intenta acceder a la memoria que pertenece a su programa, el sistema operativo debería bloquearme, ya que estoy cometiendo algo llamado falla de segmentación.

Pero hay situaciones en las que puedo evitar eso. Por ejemplo, si tengo privilegios de administrador en el sistema, es posible que pueda acceder a su memoria. O peor aún: puedo ejecutar su programa dentro de una máquina virtual y luego sentarme fuera de esa VM y hacer lo que quiera con su memoria.

Por lo tanto, en general, debe suponer que una persona malintencionada puede acercarse y jugar con la memoria de su programa si se esfuerzan lo suficiente.

Cuestiones relacionadas