【问题标题】:How to get start address of the current process and other process's heap from pid?如何从pid中获取当前进程和其他进程堆的起始地址?
【发布时间】:2012-04-16 01:24:13
【问题描述】:

如果ASLR在IOS中发挥作用,随机化heap的起始地址,那么如何从pid中获取当前进程和其他进程的heap的起始地址?

在论文提供的aslr.c中:“iOS内核开发”,似乎你试图获取当前进程的堆代码的起始地址。

void* heap = malloc(0);

我测试了代码,发现返回值不一样。 根据 ISO/IEC 9899:TC2(即 C99 标准),§7.20.3 规定:

如果请求的空间大小为零,则行为是实现定义的: 要么返回空指针,要么行为就像大小是某个非零值一样,除了返回的指针不应用于访问对象。

【问题讨论】:

    标签: ios linux macos process heap-memory


    【解决方案1】:

    如果ASLR在IOS中发挥作用,随机化堆的起始地址,

    确实如此。

    那么如何从pid中获取当前进程和其他进程堆的起始地址?

    你不能(至少不容易——我想不出任何方法,除了附加 GDB 和检查 glibc 内部变量 __curbrk)。

    我测试了代码,发现返回值不一样

    你为什么期望它们是一样的?

    单个 可执行文件中,禁用 ASLR 后,main 内的malloc(0) 将返回相同的值。如果启用 ASLR,您将获得不同的值。如果你构建不同的可执行文件,你会得到不同的值。

    【讨论】:

    • 嗯,好像很难得到堆的起始地址。我想要做的是更改其他进程变量的值,但是如果变量的内存是在堆上分配的,那么每次进程重新启动时它的地址都会不同:(。所以我想检查变量是否是相对的地址是固定的。如果偏移量是固定的,通过获取堆的起始地址,就可以得到变量的地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2010-09-22
    • 2010-09-16
    • 2012-07-18
    • 1970-01-01
    相关资源
    最近更新 更多