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

KUN*_*KUN 6 c linux debugging gdb

最近我正在做一些基于文件的Return-to-libc攻击实验.在使用我的Ubuntu11.10 使用return-to-libc时,在开发过程中绕过非可执行堆栈.

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

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

在此输入图像描述
在此输入图像描述

但是当我尝试将它用于Return-to-libc实验时,我发现这个地址是错误的.

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

在此输入图像描述

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

在此输入图像描述

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

我也找到了相关的问题.但答案并没有多大意义(第二个可能更好).

请告诉我一些关于此的细节.

Man*_*agu 4

从您的屏幕截图来看,我假设您正在 32 位 intel 平台上运行。我还没有花时间充分研究这个问题的答案,但以下几点值得注意:

  1. 我敢打赌,你的整个环境都在同一个地方,并且像 c 风格的字符串一样紧密地包装在一起。(尝试x/100s **(char***)&environ)。
  2. 当我在 x86-64 安装上尝试这个时,在环境之后我看到的唯一东西就是我的命令行和一些空字符串。
  3. 在 处0xBffff47A,您非常接近用户地址空间的顶部(以 结束0xC0000000)。

所以,我的猜测是这里发生的事情是:

  1. 环境块和命令行参数在启动过程中的某个时刻以打包形式被推到用户地址空间的末尾。
  2. 当您在 GDB 或终端中运行程序时,环境的内容是不同的。例如,我_=/usr/bin/gdb在 GDB 下运行时注意到“”,我敢打赌只有在 GDB 下运行时才会出现。

结果是,虽然您的固定指针倾向于落在环境块中间的某个位置,但它不会每次都落在同一个位置,因为环境本身在运行之间不断变化。