关于ASLR的问题

逆向工程 linux 开发
2021-07-05 15:38:22

如果我有一个没有启用 ASLR 的二进制文件。但是,它使用的libc文件开启了ASLR,那么libc文件中system()的地址会不会每次都随机化呢?

或者地址每次都相同,因为二进制文件本身没有启用 ASLR?

1个回答

创建进程时,加载程序的工作是解析 ELF 并分配/映射内存段、解析和加载库。任何共享对象的基本偏移量由加载器在加载时决定。但这取决于操作系统的 ASLR 设置,而不是二进制文件。

$ gcc -m32 -no-pie -fno-pic -zexecstack untitled.c -o untitled
$ ldd ./untitled
    linux-gate.so.1 (0xf7f66000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7d4b000)
    /lib/ld-linux.so.2 (0xf7f68000)
$ ldd ./untitled
    linux-gate.so.1 (0xf7fd1000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7db6000)
    /lib/ld-linux.so.2 (0xf7fd3000)
$ ldd ./untitled
    linux-gate.so.1 (0xf7f8f000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7d74000)
    /lib/ld-linux.so.2 (0xf7f91000)

但是一旦系统范围的 ASLR 被禁用

$ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
0
$ ldd `which cat`
    linux-vdso.so.1 (0x00007ffff7ffa000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7831000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ffff7dd9000)
$ ldd `which cat`
    linux-vdso.so.1 (0x00007ffff7ffa000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7831000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ffff7dd9000)
$ ldd `which cat`
    linux-vdso.so.1 (0x00007ffff7ffa000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7831000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ffff7dd9000)

系统相对于 libc 基的偏移量在 libc 中应保持不变。