6

最近我正在做一些 Return-to-libc 攻击实验,基于论文Bypassing non-executable-stack during exploit using return-to-libc with my Ubuntu11.10。

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

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

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

但是当我尝试使用它进行Return-to-libc实验时,我发现这个地址是错误的。

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

在此处输入图像描述

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

在此处输入图像描述

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

我也找到了关于这个的相关问题。但答案并没有真正意义(第二个可能更好)。

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

4

1 回答 1

4

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

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

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

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

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

于 2012-07-19T03:54:51.007 回答