首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在苹果对main的争论中,ptr_munge是什么?

在苹果对main的争论中,ptr_munge是什么?
EN

Stack Overflow用户
提问于 2019-03-09 05:00:11
回答 1查看 217关注 0票数 6

我最近研究了main的其他参数,我发现除了macOS上的argc、argv和envp之外,还有一个额外的char **apple选项。

显然,我做的第一件事就是快速遍历它:

代码语言:javascript
复制
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;
}

看看里面有什么:

代码语言:javascript
复制
-----------------Apple-----------------
executable_path=bin/apple



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

假设它们不是完全误导人的名字,我可以猜出其余的是什么,但我被ptr_munge弄糊涂了-那是什么,能用它做什么?(还有,所有额外的空格是用来做什么的?)

编辑:

好的,我找到了这个文件:kern_exec.c,其中包含以下内容:

代码语言:javascript
复制
/*
 * 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++;

因此,我仍然不确定这在上下文中是什么意思(我的上下文中没有任何东西),但我可以遵循这个主题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-09 07:30:00

它似乎被_setjmp()用来混淆存储在jmp_buf中的寄存器值(然后在_longjmp()中恢复它们)。这可能是一种安全/数据隐私功能。它似乎是在10.14中引入的。它不在10.13.x代码中。

请参阅代码here,例如:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55070933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档