如何从 ELF 文件中禁用地址随机化 (ASLR)?
How to disable address randomization (ASLR) from an ELF file?
已解决:
解决方案是调用 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;
}
没有 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
我相信ASLR is happening in both cases. See also this。
但在第一种情况下(noPIE
二进制),可执行文件本身有一个固定地址;然而,所有不带 MAP_FIXED
的 mmap(2) 调用都是随机的,这包括加载共享库。
在第二种情况下(PIE
二进制文件),即使是可执行文件本身也被 execve(2) (and also of course the shared libraries, which are later mmap
-ed by ld-linux(8) 加载到某个随机地址,在您的 ELF 文件中被称为 "interpreter"。
您可以通过 strace(1)-ing 两次执行来检查。
ASLR 是内核状态的一部分。将它更改为 mmap
-ing 一个特定的共享对象没有任何意义,但是,作为 ,您可以使用 setarch -R
为进程及其未来的子进程禁用它(也许您的父级 shell 及其所有子级)。
I need to disable ASLR for a specific library (.so).
你不能(而且 ASLR 不在 ELF 文件的任何位置,因为它不是 ELF 的 属性,它是 属性 的内核)。
您可以做的是禁用给定过程的随机化。 setarch -R
是 your friend。
已解决: 解决方案是调用 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;
}
没有 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
我相信ASLR is happening in both cases. See also this。
但在第一种情况下(noPIE
二进制),可执行文件本身有一个固定地址;然而,所有不带 MAP_FIXED
的 mmap(2) 调用都是随机的,这包括加载共享库。
在第二种情况下(PIE
二进制文件),即使是可执行文件本身也被 execve(2) (and also of course the shared libraries, which are later mmap
-ed by ld-linux(8) 加载到某个随机地址,在您的 ELF 文件中被称为 "interpreter"。
您可以通过 strace(1)-ing 两次执行来检查。
ASLR 是内核状态的一部分。将它更改为 mmap
-ing 一个特定的共享对象没有任何意义,但是,作为 setarch -R
为进程及其未来的子进程禁用它(也许您的父级 shell 及其所有子级)。
I need to disable ASLR for a specific library (.so).
你不能(而且 ASLR 不在 ELF 文件的任何位置,因为它不是 ELF 的 属性,它是 属性 的内核)。
您可以做的是禁用给定过程的随机化。 setarch -R
是 your friend。