最近我正在使用我的Ubuntu11.10在纸上Bypassing non-executable-stack during exploitation using return-to-libc进行一些返回libc攻击实验 .
在我的实验之前,我关闭了ALSR .
根据论文,我可以在gdb中找到环境变量SHELL = "/bin/bash"的地址(使用gdb来调试我要攻击的程序):
但是当我尝试将它用于返回libc实验时,我发现这个地址是 wrong .
然后我编写一个简单的程序来获取环境变量地址:
当我在终端中运行这个程序时,我得到 right 地址:
With this address I can do the attack.
我也找到了相关的question . 但答案确实没有意义(第二个可能更好) .
请告诉我一些关于此的细节 .
1 回答
从截图中,我假设你在32位英特尔平台上运行 . 我没有花时间充分研究这个问题的答案,但这些都值得注意:
我敢打赌,你的整个环境都在同一个地方,并且作为c风格的字符串被紧紧地包装在一起 . (试试
x/100s **(char***)&environ
) .当我在我的x86-64安装上尝试过时,我在环境之后看到的唯一一件事就是我的命令行和一些空字符串 .
在
0xBffff47A
,您非常接近用户地址空间的顶部(以0xC0000000
结尾) .所以,我的猜测是,这里发生的是:
环境块和命令行参数在启动期间的某个时刻,以用户地址空间末尾的打包形式推送 .
在GDB或终端中运行程序时,环境内容会有所不同 . 例如,我在GDB下运行时会注意到“
_=/usr/bin/gdb
”,而只有在GDB下运行时才会注意到'll just bet that' .结果是,虽然您的固定指针往往位于环境块中间的某处,但每次都不会落在同一个地方,因为环境本身在运行之间会发生变化 .