I was recently looking into additional arguments to main and I found that apart from argc, argv and envp on macOS there is also an extra char **apple option.
Obviously the first thing I did was quickly loop over it:
int main(int argc, char ** argv, char ** envp, char ** apple)
{
    puts("-----------------Apple-----------------");
    for(char **a = apple; *a != 0; a++)
    {
        printf("%s\n", *a);
    }
    return 0;
}
and see what was in there which was:
-----------------Apple-----------------
executable_path=bin/apple
ptr_munge=
main_stack=
executable_file=0x1901000004,0x2ea3d0
dyld_file=0x1901000004,0xab575
Assuming they're not totally misleading names I can guess what the rest of them are but I was a bit stumped by ptr_munge - what is that and what can be done with it? (Also what's all the extra whitespace there for?)
EDIT:
OK I found this file: kern_exec.c which contains this:
/*
 * libplatform needs a random pointer-obfuscation value when it is initialized.
 */
#define PTR_MUNGE_VALUES 1
#define PTR_MUNGE_KEY "ptr_munge="
...
/*
* Supply libpthread & libplatform with a random value to use for pointer
* obfuscation.
*/
error = exec_add_entropy_key(imgp, PTR_MUNGE_KEY, PTR_MUNGE_VALUES, FALSE);
if (error) {
    goto bad;
}
imgp->ip_applec++;
So I am still pretty unsure what that means in context (there's nothing in my one) but I can follow this thread.
It appears that it's used to obfuscate the register values stored in jmp_buf by _setjmp() (and then to restore them in _longjmp()). It's presumably a security/data-privacy feature. It seems to have been introduced with 10.14. It isn't in the 10.13.x code.
See the code here, for example:
LEAF(__setjmp, 0)
    // %rdi is a jmp_buf (struct sigcontext *)
    // now build sigcontext
    movq    %rbx, JB_RBX(%rdi)
    movq    %rbp, %rax
    _OS_PTR_MUNGE(%rax)
    movq    %rax, JB_RBP(%rdi)
    movq    %r12, JB_R12(%rdi)
    movq    %r13, JB_R13(%rdi)
    movq    %r14, JB_R14(%rdi)
    movq    %r15, JB_R15(%rdi)
    // RIP is set to the frame return address value
    movq    (%rsp), %rax
    _OS_PTR_MUNGE(%rax)
    movq    %rax, JB_RIP(%rdi)
    // RSP is set to the frame return address plus 8
    leaq    8(%rsp), %rax
    _OS_PTR_MUNGE(%rax)
    movq    %rax, JB_RSP(%rdi)
    // save fp control word
    fnstcw  JB_FPCONTROL(%rdi)
    // save MXCSR
    stmxcsr JB_MXCSR(%rdi)
    // return 0
    xorl    %eax, %eax
    ret
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With