首页 文章

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

提问于
浏览
5

最近我正在使用我的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实验时,我发现这个地址是 wrong .

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

enter image description here

当我在终端中运行这个程序时,我得到 right 地址:

enter image description here

With this address I can do the attack.

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

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

1 回答

  • 3

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

    • 我敢打赌,你的整个环境都在同一个地方,并且作为c风格的字符串被紧紧地包装在一起 . (试试 x/100s **(char***)&environ ) .

    • 当我在我的x86-64安装上尝试过时,我在环境之后看到的唯一一件事就是我的命令行和一些空字符串 .

    • 0xBffff47A ,您非常接近用户地址空间的顶部(以 0xC0000000 结尾) .

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

    • 环境块和命令行参数在启动期间的某个时刻,以用户地址空间末尾的打包形式推送 .

    • 在GDB或终端中运行程序时,环境内容会有所不同 . 例如,我在GDB下运行时会注意到“ _=/usr/bin/gdb ”,而只有在GDB下运行时才会注意到'll just bet that' .

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

相关问题