在gdb中查找环境变量地址时的奇怪之处

时间:2012-07-19 03:20:36

标签: c linux debugging gdb

最近我正在使用我的Ubuntu11.10在论文Bypassing non-executable-stack during exploitation using return-to-libc上进行一些返回libc攻击实验。

在我的实验之前,我关闭了ALSR。

根据论文,我可以在gdb中找到环境变量SHELL =“/ bin / bash”的地址(使用gdb来调试我要攻击的程序):

enter image description here
enter image description here

但是当我尝试将它用于返回libc实验时,我发现该地址错误

然后我写了一个简单的程序来获取环境变量地址:

enter image description here

当我在终端中运行此程序时,我得到正确的地址:

enter image description here

有了这个地址,我可以进行攻击。

我也找到了相关的question。但答案确实没有意义(第二个可能更好)。

请告诉我一些有关此事的细节。

1 个答案:

答案 0 :(得分:4)

从截图中,我假设你在32位英特尔平台上运行。我没有花时间充分研究这个问题的答案,但这些都值得注意:

  1. 我敢打赌,你的整个环境都在同一个地方,并且作为c风格的字符串被紧紧地包装在一起。 (尝试x/100s **(char***)&environ)。
  2. 当我在x86-64安装上尝试时,我在环境之后看到的唯一一件事就是我的命令行和一些空字符串。
  3. 0xBffff47A,您非常接近用户地址空间的顶部(以0xC0000000结尾)。
  4. 所以,我的猜测是,这里发生的是:

    1. 环境块和命令行参数在启动期间的某个时刻,以用户地址空间末尾的打包形式推送。
    2. 在GDB或终端中运行程序时,环境内容会有所不同。例如,我在GDB下运行时注意到“_=/usr/bin/gdb”,我只是打赌只有在GDB下运行时才会这样。
    3. 结果是,虽然你的固定指针往往位于环境块中间的某个地方,但每次都不会落在同一个地方,因为环境本身在运行之间会发生变化。