4

已解决: 解决方案是调用个性(0x40000)。请参阅下面的评论中的详细信息。

ASLR 标志位于 ELF 文件中的什么位置?我需要为特定库 (.so) 禁用 ASLR。我试过使用 objdump,但我不知道怎么做。

我不能使用 /proc 因为它似乎不适用于我的 Android 4.4.4,所以我正在尝试修改二进制文件。

编辑: 我编译了以下内容:

#include <stdio.h>

void* getEIP()
{
    return __builtin_return_address(0) - 0x5;
}

int main(int argc, char** argv)
{
    printf("EIP located at: %p\n", getEIP());
    return 0;
}

没有 ASLR (PIE):

arm-linux-androideabi-gcc.exe code.c -o noPIE --sysroot=%NDK%\platforms\android-3\arch-arm

使用 ASLR (PIE):

arm-linux-androideabi-gcc.exe -fPIE -pie code.c -o withPIE --sysroot=%NDK%\platforms\android-3\arch-arm

noPIE 二进制文件确实没有被随机化,即使:

# cat /proc/sys/kernel/randomize_va_space
2
4

2 回答 2

3

我需要为特定库 (.so) 禁用 ASLR。

不能(并且 ASLR 不在 ELF 文件中的任何位置,因为它不是 ELF 的属性,而是内核的属性)。

可以做的是禁用给定进程的随机化。setarch -R你的朋友

于 2015-10-13T03:41:19.597 回答
1

我相信ASLR在这两种情况下都会发生。另请参阅

但在第一种情况下(noPIE二进制),可执行文件本身具有固定地址;然而,所有对 mmap(2)的调用MAP_FIXED都是随机的,这包括共享库的加载。

在第二种情况下(PIE二进制),甚至可执行文件本身也被execve(2)加载到某个随机地址(当然还有共享库,后来mmapld-linux(8)称为“解释器”在您的 ELF 文件中)。

您可以通过strace(1)来检查两个执行。

ASLR 是内核状态的一部分。为特定的共享对象更改它mmap没有任何意义,但是,正如Employed Russian 回答setarch -R的那样,您可以为一个进程及其未来的子进程(可能是您的父 shell 及其所有子进程)禁用它。

于 2015-10-12T13:05:32.203 回答