这是这个靶机环境的最后一个flag了,目标是获取root用户shell,不知道作者会设置些什么样的障碍,一步一步试吧,渗透技术不就是通过不断的尝试来找到各种脑洞大开的方法嘛。
与前面的flag一样,目录下给了一个levelFive的可执行文件,没有其他提示。
执行一下试试看,这个程序还是一个交互式的程序,按照提示输入一个字符串,提示参数错误。
输入一个短点的字符串,没有报错,看来对输入长度有要求。
同样的方法,edb开始分析汇编的代码,在5655628f处调用了levelFive!overflow,看来这个过程是切入点了。
继续分析levelFive!overflow,这里没有看到熟悉的strcpy函数,但是找到了一个同样存在越界可能的gets函数。
既然找到了存在隐患的函数,那传入一个较长的字符串参数观察一下是否会出现溢出。(注意下图中的函数返回地址 ffffd33c,值为56556214)
在edb的output窗口输入字符串。
从栈内容中可以看到输入的字符串被写入到了ffffd32c,并且把后面的返回地址覆盖了。这样就说明了溢出是可操作的,接下来就是定义payload了。
下图是我使用的shellcode,想详细分析可以到shell-storm.org上找。毕竟我不会写shellcode。
这里要注意的是在返回地址之前填充的内容长度太小,不足以容纳shellcode,所以用字符串填充,为了shellcode不受栈影响,跳转到变量保存的位置。
将shellocde输入到5.txt,并用5.txt的内容做为输入,执行levelFive,成功获得shell,但是确没有得到root权限,看来还是少了点什么。
仔细对比levelFive与之前的程序反汇编代码,发现少了一个setuid的调用过程,如果不把uid设置为0,那程序肯定没有root权限。
最简单的方法就是在shellcode之前再加一个setuid的代码不就行了,网上借鉴了其它shellcode,将\xb0\x17\x31\xdb\xcd\x80这6个字节的代码加入到原来的shellcode之面。
重新执行levelFive,成功拿到了root的shell。
回过头来查看一下levelFive文件的uid属性,其uid在一开始就一直是0,那为什么执行时并没有使用root权限呢?这个问题一直没有想明白,不知道有没有大神可以指导一下。