【问题标题】:How can I obtain another process' ASLR slide on OS X?如何在 OS X 上获得另一个进程的 ASLR 幻灯片?
【发布时间】:2013-08-02 02:05:49
【问题描述】:

是否可以在 OS X 上获取正在运行的进程的 ASLR 幻灯片?

我不想以某种方式禁用 ASLR(例如 gdb),而是想获得偏移量。

例子:

$ cat > test.c
#include <stdio.h>

int test(void) {
    return 42;
}

int main(void) {
    getchar();
    printf("%p: %d\n", test, test());
    return 0;
}
$ gcc test.c -o test

多次运行测试将确认test()在每次运行时确实有不同的地址:

$ ./test
^D
0x104493e50: 42
$ ./test
^D
0x106fe8e80: 42

注意:查找幻灯片的方法不应该搜索进程的内存或以其他方式检查它,因为我需要一个适用于所有可执行文件的便携式解决方案。

【问题讨论】:

    标签: c macos aslr


    【解决方案1】:

    使用MachOView源代码中Attach.mm中的find_main_binaryget_image_size函数,如果你有进程的pid并且你有这样的root权限,你可以得到进程的ASLR幻灯片:

    pid_t pid = ...;
    
    mach_vm_address_t main_address;
    if(find_main_binary(pid, &main_address) != KERN_SUCCESS) {
        printf("Failed to find address of header!\n");
        return 1;
    }
    
    uint64_t aslr_slide;
    if(get_image_size(main_address, pid, &aslr_slide) == -1) {
        printf("Failed to find ASLR slide!\n");
        return 1;
    }
    
    printf("ASLR slide: 0x%llx\n", aslr_slide);
    

    我已经把它做成了一个叫做get_aslr的小工具。

    【讨论】:

      【解决方案2】:

      不,这会破坏 ASLR 的目的。

      【讨论】:

      • 甚至没有root权限或加载了可以将其转发到前端的内核扩展?似乎非常不太可能。
      • 好吧,你可以写一个LKM来检查进程的内存空间。确定非 aslr 函数的位置,在内存中找到所述位置并计算偏移量。但你说你不想检查记忆。我很难看到其中的用例?
      • 我正在向hydra 写一个前端,它会在执行时暂停特定的可执行文件并通知前端。然后,前端可以在不破坏代码设计的情况下修补进程的内存。如果你能自动确定 ASLR 偏移量,那就更好了。
      • 我不确定,这超出了我的专业范围。祝你好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      相关资源
      最近更新 更多