gen*_*xyz 1 memory macos xcode ptrace mach
这是我的代码,仅适用于 Xcode(版本 4.5):
\n\n#include <stdio.h>\n#include <mach/mach_init.h>\n#include <mach/mach_vm.h>\n#include <sys/types.h>\n#include <mach/mach.h>\n#include <sys/ptrace.h>\n#include <sys/wait.h>\n#include <Security/Authorization.h>\n\nint main(int argc, const char * argv[]) {\n\n char test[14] = "Hello World! "; //0x7fff5fbff82a\n\n char value[14] = "Hello Hacker!";\n\n char test1[14];\n\n pointer_t buf;\n uint32_t sz;\n\n task_t task;\n\n task_for_pid(current_task(), getpid(), &task);\n\n if (vm_write(current_task(), 0x7fff5fbff82a, (pointer_t)value, 14) == KERN_SUCCESS) {\n\n printf("%s\\n", test);\n //getchar();\n }\n\n if (vm_read(task, 0x7fff5fbff82a, sizeof(char) * 14, &buf, &sz) == KERN_SUCCESS) {\n\n memcpy(test1, (const void *)buf, sz);\n printf("%s", test1);\n }\n\n return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n我还尝试了 ptrace 和其他东西,这就是为什么我也包含其他库。
\n\n第一个问题是,这仅适用于 Xcode,我可以使用调试器找到变量的位置(内存地址)(在本例中为 )test
,因此我更改了字符串value
,然后将新值复制到test
在test1
。
我实际上不明白 vm_write 是如何工作的(不完全)task_for_pid()
,对于 2\xc2\xb0 也是如此,问题是我需要在另一个进程上读写,这只是一个测试,看看这些函数是否可以工作相同的过程,并且它可以工作(仅在 Xcode 上)。
我如何在其他进程上做到这一点?我需要读取一个位置(如何找到“某物”的地址?),这是第一个目标。
\n针对您的问题,有以下解决方案:
第一个问题:OS X 具有地址空间布局随机化。如果你想让你的内存图像固定且可预测,你必须使用 NOPIE 设置来编译你的代码。此设置(PIE = 位置独立可执行文件)负责允许 ASLR,它通过某个随机值“滑动”内存,该随机值在每个实例上都会发生变化。
我实际上不明白 vm_write 是如何工作的(不完全),task_for_pid() 也是如此:
Mach API 在“任务”和“线程”的较低级别抽象上运行,它们大致对应于 BSD“进程”和“(u)线程”(有一些例外,例如 kernel_task,它没有 PID ,但我们暂时忽略它)。task_for_pid 获取任务端口(将其视为“句柄”),如果你获取了该端口 - 你就可以自由地做任何你想做的事情。基本上,vm_* 函数在任何任务端口上运行 - 您可以在您自己的进程(即 mach_task_self())或从 task_for_pid 获取的端口上使用它。
PID 任务实际上不一定需要 root(即“sudo”)。它需要通过 OSX 上的任务,传统上是验证 procmod 或 procview 组中的成员资格。您可以配置任务门控(/System/Library/LaunchDaemons/com.apple.taskerated.plist)以进行调试。顺便说一句,最终,获取任务端口将需要权利(与现在在 iOS 上相同)。也就是说,最简单的方法就是成为 root,而不是搞乱系统授权等。
归档时间: |
|
查看次数: |
4983 次 |
最近记录: |