每次检查时环境变量的地址都会改变

The address of an environment variable changes every time it is checked

我正在尝试学习如何使用缓冲区溢出将 esp 中的地址更改为 运行 一个 shell 代码;并且我已经定义了一个名为 "SHELLCODE" 的环境变量来存储 shell 代码的执行,但是每当我 运行 getenv 函数获取地址时该环境变量的地址超时更改;

Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE
SHELLCODE is at 0x7fff507b9bd5
Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE
SHELLCODE is at 0x7fff5fb4abd5
Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE
SHELLCODE is at 0x7fff54ca5bd5
Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE
SHELLCODE is at 0x7fff5d633bd5
Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE
SHELLCODE is at 0x7fff50bedbd5
Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE
SHELLCODE is at 0x7fff5d5f9bd5
Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE
SHELLCODE is at 0x7fff5bc6ebd5
Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE
SHELLCODE is at 0x7fff5589bbd5

这是什么原因?如何防止这种情况发生?

看来你的程序被编译为使用 Aaddress Space Layout R随机化 (ASLR)。在您的程序的每次执行中,主要内存部分(例如您的代码、全局变量、堆栈等)都被映射到一个随机的内存地址。因此,每次执行程序时地址"moves"。

我建议您检查是否可以通过将程序编译为使用固定地址来关闭程序的 ASLR。另一种选择是为您的 PC 暂时禁用 ASLR(不推荐这样做,因为用户之后通常会忘记打开它)。

我经常使用的另一个技巧,因为它是一个练习,是 "leak" 您要手动使用的地址。在您的程序中添加一个打印行以打印所需的地址,然后才等待将使程序溢出的输入。通过对地址进行参数化利用,您将能够利用该练习(模拟一个真实的案例,您需要内存泄漏才能使您的攻击生效)。

例如(取自scout的测试模块):

printf("The buffer is at address: %p\n", buffer);
printf("Press ENTER to continue\n");
fgetc(stdin);