我正在学习Linux x86二进制文件中的缓冲区溢出漏洞利用。我正在执行经典的堆栈粉碎操作,以通过禁用ASLR并在Ubuntu 12.04 VM中生成根 shell ,并通过禁用NX位和堆栈金丝雀来编译二进制文件。

在执行期间,返回地址将被覆盖,并且将执行shellcode,但是我没有获得root shell,而是导致了bash shell。

为了减轻对bash的保护,我使用zsh shell,并删除了sh-> bash符号链接(symbolic link),并在/bin目录中使用zsh shell创建了sh的符号链接(symbolic link)。

我已经尝试过使用root拥有的启用setuid的二进制文件(对其他用户的执行权限),但是仍然无法获取root shell。

我已经用C程序验证了我的shell代码,同时编译了(我的shell代码的)测试程序并在启用setuid后执行了它。因此测试程序提供了root shell。但是当相同的shellcode与缓冲区溢出一起使用时,我无法获得根shell。

当我在gdb中调试此方案时,在执行溢出期间/bin/zsh4会导致bash shell。

甚至我也无法通过返回libc攻击获得root shell。这也会导致bash shell。我已经在Ubuntu 12.04,Ubuntu 11.04和Ubuntu9中尝试了这些步骤,但结果仍然相同。

我是这方面的初学者。因此,在上述任何一个步骤中我都可能犯了一些错误。所以你们中的任何人都可以请教可能是什么问题以及如何解决它

最佳答案

最后,我找出了此错误的原因。

在执行过程中,我的root特权被删除,因为我已禁用进程系统级别的ptrace来使用其他工具。
我已经将/proc/sys/kernel/yama/ptrace_scope值重写为0。这就是没有为我提供root shell的原因。

我从execve的手册页中找到了此信息(我用于创建shellcode):



所以现在当我不禁用ptrace_scope时,我得到的是root shell。

感谢merlin2011和naab参与此讨论。

09-10 01:15
查看更多