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

Shell 环境变量的地址在每次检查时都会更改,shell,buffer-overflow,shellcode,Shell,Buffer Overflow,Shellcode,我试图学习如何使用缓冲区溢出来更改esp中的地址以运行shell代码;我已经定义了一个名为“外壳代码”的环境变量来存储外壳代码的执行,但是每当我运行getenv函数来获取该环境变量的地址时,地址就会随着时间的推移而改变 Onurcans-MacBook-Air:ArtofExploitation onurcanbektas$ ./genenv_exp SHELLCODE SHELLCODE is at 0x7fff507b9bd5 Onurcans-MacBook-Air:ArtofExploi

我试图学习如何使用缓冲区溢出来更改esp中的地址以运行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

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

您的程序似乎是使用AddressSpaceLayoutRandomization(ASLR)编译的。在程序的每次执行中,主要内存部分(如代码、全局、堆栈等)都映射到随机内存地址。因此,每次执行程序时,地址都会“移动”

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

我经常使用的另一个技巧,因为这是一个练习,就是“泄漏”您想要手动使用的地址。在程序中添加打印行以打印所需的地址,然后等待将使程序溢出的输入。通过对地址进行参数化利用,您将能够利用该练习(模拟真实的单词情况,在这种情况下,您需要内存泄漏才能进行攻击)

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


非常感谢你的建议;我想,最后一个选择似乎非常适合我的情况。
printf("The buffer is at address: %p\n", buffer);
printf("Press ENTER to continue\n");
fgetc(stdin);