2013-08-02 26 views
1

是否可以在OS X上获得运行进程的ASLR幻灯片?如何在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 

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

回答

1

MachOView源代码中使用从Attach.mm功能find_main_binaryget_image_size,就可以得到该进程的ASLR幻灯片,如果你有进程的PID,你必须像这样root权限:

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的小工具。

-1

不,这会挫败ASLR的目的。

+0

甚至没有root权限或加载的内核扩展可以将其转发到前端?似乎**非常**不太可能。 – Tyilo

+0

嗯,你可以编写一个LKM来检查进程的内存空间。确定非aslr函数的位置,在内存中查找所述位置并计算偏移量。但你说过你不想检查记忆。我很难看到这个用例吗? –

+0

我正在写一个[hydra]的前端(https://github.com/gdbinit/hydra),它在执行时暂停特定的可执行文件并通知前端。然后前端可以修补没有破解密码的过程的内存。如果你能自动确定ASLR偏移量,那会更好。 – Tyilo

相关问题