我最近在研究main的其他参数,发现除了macOS上的argc,argv和envp外,还有一个额外的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;
}
Run Code Online (Sandbox Code Playgroud)
看看里面是什么:
-----------------Apple-----------------
executable_path=bin/apple
ptr_munge=
main_stack=
executable_file=0x1901000004,0x2ea3d0
dyld_file=0x1901000004,0xab575
Run Code Online (Sandbox Code Playgroud)
假设它们不是完全误导的名称,我可以猜出它们的其余部分是什么,但我有些困惑ptr_munge-那是什么,可以用它做什么?(还有所有额外的空白吗?)
编辑:
好的,我找到了这个文件: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++;
Run Code Online (Sandbox Code Playgroud)
因此,我仍然不确定上下文中的含义(我的内容中没有任何内容),但是我可以遵循此线程。
它似乎用于混淆存储在jmp_bufby中的寄存器值_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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |