我正在尝试学习如何使用缓冲区溢出来更改esp中的地址以运行shell代码;并且我已经定义了一个名为“ SHELLCODE”的环境变量来存储外壳程序代码的执行,但是每当我运行 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
其原因是什么?如何防止这种情况发生?
答案 0 :(得分:1)
似乎您的程序已编译为使用 A 地址 S 速度 L ayout R 随机化(ASLR )。每次执行程序时,主内存部分(例如代码,全局变量,堆栈等)都将映射到随机内存地址。因此,每次执行程序时,地址都会“移动”。
我建议您通过编译使用固定地址来检查是否可以关闭程序的ASLR。另一种选择是暂时禁用PC的ASLR(不建议这样做,因为用户通常会忘记随后将其打开)。
由于这是一种练习,因此我经常使用的另一个技巧是“泄漏”您要手动使用的地址。在程序中添加打印行以打印所需的地址,然后等待输入溢出程序。通过在地址上设置漏洞利用参数,您就可以利用此练习(模拟一个实际的单词情况,在这种情况下您需要内存泄漏才能使攻击起作用)。
例如(取自scout的测试模块):
printf("The buffer is at address: %p\n", buffer);
printf("Press ENTER to continue\n");
fgetc(stdin);