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

时间:2015-10-12 12:16:09

标签: linux random elf objdump aslr

解决: 解决方案是调用个性(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

2 个答案:

答案 0 :(得分:2)

  

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

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

可以做的是禁用给定进程的随机化。 setarch -Ryour friend

答案 1 :(得分:1)

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

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

在第二种情况下(PIE二进制),即使可执行文件本身也被execve(2)加载到某个随机地址(当然还有共享库,后来是mmap - 由ld-linux(8)编辑,作为&#34;解释器&#34;在您的ELF文件中。)

你可以通过strace(1)检查两次执行。

ASLR是内核状态的一部分。为mmap分析特定的共享对象没有任何意义,但是,作为Employed Russian answered,您可以使用setarch -R为进程及其未来的子进程(也许是您的进程)禁用它父shell及其所有子代。)