经过前面的学习我们可以知道,利用缓冲区溢出漏洞,攻击者可以将恶意代码放到栈中执。如果设置栈不可执行,那么及时攻击者能够成功修改返回地址,也无法运行恶意代码。
但是,攻击者可以跳转到栈以外的代码,而不是栈中的代码,从而完成攻击,这就是Return-to-libc Attack的主要思想。
Return-to-libc Attack的步骤
寻找system()的地址
使用system()
的地址覆盖掉原函数的返回地址,使得函数跳转到system()
函数处
可以使用gdb进行debug,并用p命令打印出system()
和 exit()
的地址
寻找"/bin/sh"字符串的地址
找到"/bin/sh"
字符串的地址后,配合system()
执行system(""/bin/sh")
,这样就可以产生一个root shell
- 导出一个名为“ MYSHELL”的环境变量,其值为“ / bin / sh”。
- MYSHELL作为环境变量传递到易受攻击的程序,该环境变量存储在堆栈中。
- 找到该地址。
导出 “MYSHELL”
环境变量:
打印出环境变量的地址值:
需要特别注意的是,“ MYSHELL”
环境变量的地址对程序名称的长度敏感。
从书上所举例子课知,如果程序名称从env55
更改为env77
,我们将获得一个不同的地址。
执行system()函数的参数
寻找字符串"/bin/sh"
在栈中应该处于的位置,从而使它作为函数system()
的参数