如何从 ELF 文件中禁用地址随机化 (ASLR)?

Joh*_*ohn 5 linux random elf objdump aslr

已解决: 解决方案是调用personality(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;
}
Run Code Online (Sandbox Code Playgroud)

没有 ASLR (PIE):

arm-linux-androideabi-gcc.exe code.c -o noPIE --sysroot=%NDK%\platforms\android-3\arch-arm
Run Code Online (Sandbox Code Playgroud)

与ASLR(PIE):

arm-linux-androideabi-gcc.exe -fPIE -pie code.c -o withPIE --sysroot=%NDK%\platforms\android-3\arch-arm
Run Code Online (Sandbox Code Playgroud)

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

# cat /proc/sys/kernel/randomize_va_space
2
Run Code Online (Sandbox Code Playgroud)

Emp*_*ian 3

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

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

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