为什么环境变量的位置变化这么大?

为什么环境变量的位置变化这么大?

阅读乔恩·埃里克森 (Jon Erickson) 撰写的《黑客:利用的艺术》一书,我尝试估算环境变量的地址SHELLCODE以利用程序。

每次我跑去getenv("SHELLCODE");获取位置,结果都完全不同。

从我的外壳中提取:

> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3

我知道如果修改程序名或者添加新的环境变量,位置会略有不同,但为什么位置会相差那么大呢?

答案1

您所描述的是一种反利用功能,称为地址空间布局随机化(ASLR)。基本上,每次内核从磁盘加载程序的 ELF 文件时,内核都会将程序函数调用堆栈的最顶部地址放置在稍微不同(“随机”)的地址处。 shellcode中的地址argv和环境变量(shellcode 就是其中之一)最终会在每次程序调用时出现不同的地址。

ASLR 应该使缓冲区溢出和其他与堆栈相关的漏洞更难被利用。攻击者必须编写代码或执行某些操作来解释函数调用堆栈上变量和值的不同地址。

看起来你可以通过执行以下操作来禁用 ASLR:

echo 0 > /proc/sys/kernel/randomize_va_space

作为根用户。由于您明确引用了 Ubuntu,因此上面的命令有所不同:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

相关内容