Come posso verificare se un'applicazione Mac ha abilitato NX o ASLR?

5

Secondo Wikipedia, il bit NX è impostato per tutti i binari x64:

OS X for Intel supports the NX bit on all CPUs supported by Apple (from 10.4.4 – the first Intel release – onwards). Mac OS X 10.4 only supported NX stack protection. In Mac OS X 10.5, all 64-bit executables have NX stack and heap; W^X protection. This includes x86-64 (Core 2 or later) and 64-bit PowerPC on the G5 Macs.

Tuttavia, se l'eseguibile non è 64 bit: Mach-O executable i386 ?

Allo stesso modo, per ASLR, Wikipedia afferma che è abilitato per impostazione predefinita per 10.7 e versioni successive:

In Mac OS X Lion 10.7 (released July 2011), Apple expanded their implementation to cover all applications, stating "address space layout randomization (ASLR) has been improved for all applications. It is now available for 32-bit apps (as are heap memory protections), making 64-bit and 32-bit applications more resistant to attack."

Questo significa che non c'è modo di disattivarlo tramite un'opzione del compilatore? Se c'è, come posso verificare che l'applicazione non abbia? Ci sono delle analogie con Windows, dove alcune librerie potrebbero essere ASLR-ed altre?

    
posta Guest 22.05.2014 - 16:38
fonte

1 risposta

3
  • Il bit NX è per l'architettura AMD e XD è per Intel. Vuoi sapere se una pagina è eseguibile, in pratica. vmmap <pid or partial process name> elencherà i permessi dei blocchi di memoria.

  • Puoi verificare ASLR (PIE, per essere corretto) in OS X utilizzando otool -hv <file_path> e controllando il flag "PIE". Ad esempio il mio i386 Wireshark non ha alcun flag PIE (molto probabilmente b / c è stato compilato senza uno). Non so come sia in 10.9, ma in 10.7 potresti collegare il tuo programma con --no_pie flag per disabilitare PIE.

C'è uno script interessante al link che può rispondere alla tua domanda. In effetti puoi usarlo per disattivare i binari già compilati con --no-pie flag nello script. Consentitemi di citarne una parte e vi invito a leggere l'intera fonte:

...

NON-EXECUTABLE HEAP

Traditionally in Mac OS X, 32-bit processes did not have data pages set to prohibit execution. Although user programs could call mprotect and mach_vm_protect to deny execution of code in data pages, the kernel would silently ignore such requests without updating the page tables, and the hardware would happily execute code on such pages. 64-bit processes were always given proper hardware protection of data pages. This behavior was controllable on a system-wide level via the vm.allow_data_exec sysctl, which is set by default to 1. The bit with value 1 (set by default) allows code execution on data pages for 32-bit processes, and the bit with value 2 (clear by default) does the same for 64-bit processes.

In Mac OS X 10.7, executables can "opt in" to having hardware protection against code execution on data pages applied. This is done by setting a new bit in the |flags| field of an executable's |mach_header|. When MH_NO_HEAP_EXECUTION is set, proper protections will be applied, regardless of the setting of vm.allow_data_exec.

...

Inoltre, devo aggiungere un link alla pagina SO con due ottime risposte relative al problema: link

    
risposta data 22.05.2014 - 21:10
fonte

Leggi altre domande sui tag