Что такое ptr_munge в аргументе apple для main? - PullRequest
6 голосов
/ 09 марта 2019

Недавно я рассматривал дополнительные аргументы для main и обнаружил, что кроме argc, argv и envp в macOS есть также дополнительная опция char ** apple.

Очевидно, что первое, что я сделал, быстро перебрал его:

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;
}

и посмотрите, что там было:

-----------------Apple-----------------
executable_path=bin/apple



ptr_munge=
main_stack=
executable_file=0x1901000004,0x2ea3d0
dyld_file=0x1901000004,0xab575

Если предположить, что они не полностью вводят в заблуждение имена, я могу догадаться, что это за остальные, но я был немного озадачен ptr_munge - что это такое и что с этим можно сделать? (Кроме того, для чего там все лишние пробелы?)

EDIT:

ОК. Я нашел этот файл: kern_exec.c , который содержит это:

/*
 * 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++;

Так что я до сих пор не совсем уверен, что это значит в контексте (в моем нет ничего), но я могу следовать этой теме.

1 Ответ

2 голосов
/ 09 марта 2019

Похоже, что он используется для обфускации значений регистров, хранящихся в jmp_buf на _setjmp() (а затем для их восстановления в _longjmp()).Предположительно это функция безопасности / конфиденциальности данных.Кажется, было введено с 10.14.Его нет в коде 10.13.x.

См. Код здесь , например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...