Realicé dos programas en C que eran copias exactas uno del otro. Los compilé en la plataforma Linux (Ubuntu 10.04) usando el compilador gcc y obtuve dos ejecutables por separado. Luego obtuve el ensamblado El código de ambos ejecutables utilizando objdump y encontró que el código de ensamblado era exactamente el mismo e incluso la dirección de las instrucciones correspondientes en dos archivos de ensamblaje era la misma. El programa debía imprimir la dirección de una variable. Los programas cuando se ejecutan producen direcciones diferentes y además el mismo programa produce una dirección diferente cuando se ejecuta cada vez.¿Por qué la dirección de las líneas de código es la misma en los dos programas pero la dirección de la variable cambia incluso para el mismo programa cada vez que se ejecuta. Creo que la dirección impresa de la variable en la pantalla es una dirección virtual, pero si es virtual, por qué no puede ser igual cada vez. Es la dirección que se muestra en el código de ensamblaje obtenido por objd ump también es virtual?¿Por qué la dirección de la variable cambia entre ejecuciones?
Respuesta
Es debido a address space layout randomization.
Para citar Wikipedia:
Dirección diseño del espacio de la aleatorización (ASLR) es un método de seguridad de ordenador que implica disponer aleatoriamente las posiciones de las áreas clave de datos, por lo general incluye la base del ejecutable y la posición de las bibliotecas, montón y apilar, en el espacio de direcciones de un proceso.
Beneficios
Espacio de direcciones aleatorización dificulta algunos tipos de ataques a la seguridad, haciendo que sea más difícil para un atacante predecir direcciones de destino. Por ejemplo, los atacantes que intenten ejecutar ataques de retorno a la libra deben localizar el código que se ejecutará, mientras que otros atacantes que intenten ejecutar Shellcode inyectado en la pila deben encontrar primero la pila. En ambos casos, las direcciones de memoria relacionadas están oscurecidas por los atacantes. Estos valores deben adivinarse, y una suposición errónea no suele ser recuperable debido a la falla de la aplicación.
Por ejemplo, cuando corro en repetidas ocasiones el mismo ejecutable producido a partir del siguiente código C en mi caja de Ubuntu 10.10:
#include <stdio.h>
int g = 0;
int main() {
int x = 0;
printf("%p %p\n", &x, &g);
}
La dirección de la variable local (x
) no deja de cambiar, pero la dirección de de la variable global (g
) se mantiene igual.
¿Puede explicar por qué la dirección de la variable global permanece igual? Cuando cambiamos aleatoriamente las direcciones de las áreas de datos clave. Esto también cambiaría el rango de direcciones de la sección "datos" en la memoria virtual del proceso, que contiene esta variable global. – user3834119
Sí, siempre obtendrá un valor cambiado en la variable de Dirección. esto se debe a que, cuando el programa entra en el modo de ejecución, cuando ejecuta las declaraciones de declaración de variables, cada vez que el controlador crea variables en función de las ubicaciones de memoria disponibles. Esta es la única razón por la que cada vez devuelve un valor diferente para la dirección.
- 1. ¿Por qué la impresión de una variable cambia su valor?
- 2. ¿Persistirá la caché WebView entre las ejecuciones de la aplicación?
- 3. ¿Por qué DOM cambia la codificación?
- 4. Por qué la dirección de la variable de proceso hijo y el proceso primario es igual
- 5. bash: ¿mejor forma de almacenar variables entre ejecuciones?
- 6. Mantener variables persistentes en la memoria entre las ejecuciones de la secuencia de comandos de Python
- 7. ¿La variable copiada cambia el original?
- 8. ¿Por qué Thread.CurrentThread.CurrentCulture cambia entre Page Rendering y HttpModule.PostRequestHandlerExecute?
- 9. ¿Por qué la dirección de esta variable volátil siempre está en 1?
- 10. Por qué la dirección de la variable permanece igual en la llamada al sistema fork() después de haber sido modificada
- 11. ¿Por qué la miniatura PIL no cambia el tamaño correctamente?
- 12. ¿Por qué VBA ActiveWorkbook.SaveAs cambia la hoja de cálculo abierta?
- 13. ¿Por qué Wicket cambia la identificación de los elementos html?
- 14. ¿Por qué esta variable de proceso por lotes nunca cambia incluso cuando se establece?
- 15. ¿Cómo hacer que pdb reconozca que la fuente ha cambiado entre ejecuciones?
- 16. AVPlayer no cambia entre la descarga progresiva y la transmisión
- 17. dirección C de una dirección de una variable
- 18. Por qué scanf debe tomar la dirección del operador
- 19. Variable de la clase Delphi por clase
- 20. ¿Cuál es la diferencia entre $ VARIABLE y $ {VARIABLE}
- 21. ¿Cómo cambia Arrays.sort() la variable que se le pasa?
- 22. ¿Por qué insertar-seleccionar a la tabla variable de la variable XML tan lento?
- 23. ¿Cómo puedo imprimir la dirección de memoria de una variable?
- 24. ¿Por qué una variable asignada por valor a un elemento de matriz (después de una asignación previa por referencia) cambia cuando se cambia el elemento de matriz?
- 25. ¿Por qué RUnit cambia mis números aleatorios?
- 26. ¿Por qué lineTo() cambia los píxeles interiores?
- 27. ¿Por qué el color del borde de la celda de la tabla html no cambia?
- 28. JavaScript: ¿por qué el cambio de una variable de argumento cambia los `arguments`" array "?
- 29. Cómo imprimir/registrar la dirección de una variable en NDK
- 30. Conozca la dirección de una variable en Visual Studio
Casi todas las direcciones visibles son virtuales en CPUs modernas + sistemas operativos. Además, la dirección no tiene que ser la misma, porque no existe un requisito para tal en la mayoría de los lenguajes de programación. –