¿Cómo puedo verificar si una aplicación Mac tiene NX o ASLR habilitado?

5

Según Wikipedia, el bit NX está configurado para todos los binarios x64:

  

OS X para Intel admite el bit NX en todas las CPU compatibles con Apple   (desde 10.4.4 - la primera versión de Intel - en adelante). Sólo Mac OS X 10.4   Protección de pila NX soportada. En Mac OS X 10.5, todos de 64 bits.   ejecutables tienen pila NX y montón; W ^ X protección. Esto incluye   x86-64 (Core 2 o posterior) y PowerPC de 64 bits en las Mac G5.

Sin embargo, ¿qué sucede si el ejecutable no es de 64 bits: Mach-O executable i386 ?

De manera similar, para ASLR, Wikipedia dice que está habilitada de manera predeterminada para 10.7 y más:

  

En Mac OS X Lion 10.7 (lanzado en julio de 2011), Apple expandió su   Implementación para cubrir todas las aplicaciones, indicando "espacio de direcciones   La aleatorización de diseño (ASLR) se ha mejorado para todas las aplicaciones. Eso   ahora está disponible para aplicaciones de 32 bits (al igual que las protecciones de memoria del montón),   haciendo que las aplicaciones de 64 y 32 bits sean más resistentes al ataque ".

¿Esto significa que no hay forma de optar por no hacerlo a través de una opción de compilación? Si la hay, ¿cómo podría verificar que la aplicación no la tiene? ¿Existen analogías con Windows, donde algunas bibliotecas pueden ser ASLR-ed, pero otras no?

    
pregunta Guest 22.05.2014 - 16:38
fuente

1 respuesta

3
  • El bit NX es para la arquitectura AMD y XD es para Intel. Desea saber si una página es ejecutable, básicamente. vmmap <pid or partial process name> listará los permisos de los fragmentos de memoria.

  • Puede verificar ASLR (PIE, para ser correcto) en OS X usando otool -hv <file_path> y verificando el indicador "PIE". Por ejemplo, mi i386 Wireshark no tiene un indicador PIE (probablemente b / c se compiló sin uno). No sé cómo está en 10.9, pero en 10.7 podría vincular su programa con el indicador --no_pie para deshabilitar PIE.

Hay un script interesante en enlace que puede responder a su pregunta. Usted puede en realidad lo usa para excluirse de binarios ya compilados con el indicador --no-pie en el script. Permítame citar una parte y le invito a leer la fuente completa:

  

...

     

HEAP NO EJECUTABLE

     

Tradicionalmente en Mac OS X, los procesos de 32 bits no tenían páginas de datos configuradas para   prohibir la ejecución Aunque los programas de usuario podrían llamar mprotect y   mach_vm_protect para denegar la ejecución de código en páginas de datos, el kernel lo haría   ignorar silenciosamente tales solicitudes sin actualizar las tablas de páginas, y la   El hardware ejecutaría felizmente el código en tales páginas. Los procesos de 64 bits eran   Siempre se da la protección adecuada de hardware de las páginas de datos. Este comportamiento fue   controlable a nivel de todo el sistema a través del sysctl vm.allow_data_exec, que   se establece de forma predeterminada en 1. El bit con valor 1 (establecido de forma predeterminada) permite el código   ejecución en páginas de datos para procesos de 32 bits y bit con valor 2   (Borrar de forma predeterminada) hace lo mismo para los procesos de 64 bits.

     

En Mac OS X 10.7, los ejecutables pueden "optar por" tener protección de hardware   Contra la ejecución del código en las páginas de datos aplicadas. Esto se hace estableciendo un nuevo   poco en las | banderas | campo de un ejecutable | mach_header |. Cuando   MH_NO_HEAP_EXECUTION está establecido, se aplicarán las protecciones adecuadas, independientemente   de la configuración de vm.allow_data_exec.

     

...

Además de eso, debo agregar un enlace a la página SO con dos respuestas muy buenas relacionadas con el problema: enlace

    
respondido por el JSmyth 22.05.2014 - 21:10
fuente

Lea otras preguntas en las etiquetas