阅读乔恩·埃里克森(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
我了解如果修改了程序名称或添加了新的环境变量,则位置会稍有不同,但是为什么位置会有很大的不同?
“我知道,如果程序名称被修改或添加了新的环境变量,位置将稍有不同,但是为什么位置会有如此大的差异?” 在所有可能的实现中,最简单的实现是正确的,但肯定不是必需的。
—
dmckee ---前主持人小猫,2014年
getenv
手册说它返回一个指向包含变量值的字符串的指针。其他所有内容均未指定,因此您的内核和/或编译器可以将值粘贴在所需的任何位置,只要该指针承诺始终为真即可。我猜想确切的答案可能是沉重的巫术,取决于各种内存映射实现细节和月相。(我还不够向导,无法为您提供确切的答案。)