首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从ELF文件中禁用地址随机化(ASLR)?

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

Stack Overflow用户
提问于 2015-10-12 12:16:09
回答 2查看 5.2K关注 0票数 4

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

ASLR标志在ELF文件中的位置?我需要为一个特定的库(.so)禁用ASLR。我试过使用objdump,但无法找到如何使用objdump。

我不能使用/proc,因为它似乎不能在我的Android4.4.4上工作,所以我试图修改二进制文件。

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

代码语言:javascript
复制
#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):

代码语言:javascript
复制
arm-linux-androideabi-gcc.exe code.c -o noPIE --sysroot=%NDK%\platforms\android-3\arch-arm

与ASLR (PIE):

代码语言:javascript
复制
arm-linux-androideabi-gcc.exe -fPIE -pie code.c -o withPIE --sysroot=%NDK%\platforms\android-3\arch-arm

事实上,noPIE二进制文件并不是随机的,即使:

代码语言:javascript
复制
# cat /proc/sys/kernel/randomize_va_space
2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-13 03:41:19

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2015-10-12 13:05:32

我相信ASLR在这两种情况下都在发生。另见

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

在第二种情况下(PIE二进制文件),甚至可执行文件本身也是由execve(2) (当然还有共享库,这是linux(8)后来提到的作为ELF文件中的“解释器”的mmap-ed )随机加载的。

您可以通过斯特拉斯(1)-ing检查两次执行情况。

ASLR是内核状态的一部分。为mmap-ing创建一个特定的共享对象没有任何意义,但是,作为受雇俄语回答,您可以为进程及其未来的子进程(可能是父shell及其所有子进程)禁用setarch -R

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33080909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档