地址空间布局随机化 (Address Space Layout Randomization, ASLR)
ASLR 是 Oracle Solaris 系统的一种功能,利用此功能可以随机生成进程地址空间(例如栈、库和基于 brk 的堆)的关键部分的起始地址。缺省情况下,为显式标记为需要 ASLR 的二进制文件启用 ASLR。以下命令提供有关 ASLR 状态的信息:% sxadm infoEXTENSION STATUS CONFIGURATION
aslr enable (tagged-files) enable (tagged-files)
ld(1) 命令的 –z 选项用于标记需要使用 ASLR 的新建目标文件。用法如下所示:
ld -z aslr[=mode]
其中 mode 可设置为 enable 或 disable。如果未指定 mode,则假定使用 enable。
以下示例说明了如何使用 –z 选项创建启用了 ASLR 的可执行文件:% cat hello.c
#include
int
main(int argc, char **argv)
{
(void) printf("Hello World!\n");
return (0);
}
% cc hello.c -z aslr
ASLR 标记由目标文件动态部分中的条目提供,该条目可以使用 elfdump(1) 进行检查。% elfdump -d a.out | grep ASLR
[28] SUNW_ASLR 0x2 ENABLE
elfedit(1) 命令可用于在现有目标文件中添加或修改 ASLR 动态条目。% cc hello.c
% elfedit -e 'dyn:sunw_aslr enable' a.out
% elfdump -d a.out | grep ASLR
[29] SUNW_ASLR 0x2 ENABLE% elfedit -e 'dyn:sunw_aslr disable' a.out
% elfdump -d a.out | grep ASLR
[29] SUNW_ASLR 0x1 DISABLE
给定进程对 ASLR 的要求是在该进程启动时建立的,该进程一旦启动就无法对此要求进行修改。因此,ASLR 标记仅对进程中的主要可执行目标文件有意义。
pmap(1) 实用程序可用于检查进程的地址映射。使用该实用程序观察启用了 ASLR 的可执行文件的映射时,会看到用于栈、库映射和基于 brk 的堆的具体地址在每次调用时均不同。
sxadm(1) 命令用于控制系统的 ASLR 缺省行为。显式标记为禁用 ASLR 的二进制文件优先于 sxadm 建立的系统缺省行为。
调试和 ASLR
调试期间,地址空间随机化可能会出现问题。某些调试需要重复调用同一程序时使用相同的地址映射。您可以采用以下方式之一禁用 ASLR:临时在系统范围内禁用 ASLR% sxadm exec -s aslr=disable /bin/bash
使用 ld 或 elfedit 命令将相关二进制文件标记为禁用 ASLR
建立禁用 ASLR 的 shell,从中执行调试操作% sxadm exec -s aslr=disable /bin/bash
注 -此 ASLR 修改不会应用到 SUID 或特权二进制文件。