昨天完成了Stack Overflows for Beginners: 1靶机的第一个目标,还是比较简单的,今天来继续完成第二个目标。
首先用level1用户和昨天拿到的密码登陆系统。
第二个目标难度有所提升,除了一个名为levelTwo的可执行文件外,作者没有留下其它任何线索。
尝试执行一下levelTwo这个文件,随意输入个参数AAAA,可正常执行
还用老套路,利用edb-debugger分析程序运行的流程,找到可溢出的部分。
打开edb后,发现除了调用系统函数外,还调用了一个叫levelTwo!hello的函数,在此处设置端点并执行。
行下一条指令,可以看到levelTwo!hello函数的内容,这里调用了strcpy函数,从昨天的内容可知,strcpy没有对数据长度进行检测,过长的数据会导致越界,将其它的数据覆盖,看来这里就是可溢出的部分了。同时注意程度的返回地址已经被压入到栈中,值为56556286
在strcpy和printf这两行设置断点,依次执行。可以看到输入的参数已经被复制到了栈中,这样就可以计算出一共填充72字节后,后面的数据就可以覆盖程序的返回地址了。
我们输入40个A来验证一下(72+8=80字节=40个字母)
执行下一条指令,查看栈内容,栈顶地址为ffffd2ec,值为56556286,没问题
继续执行到printf之后,ret之前的断点,查看ffffd2ec处的值,已经变成了41414141,说明溢出已经成功,返回地址已经被修改
接下来回头找一下40个A是从哪个地址开始填入的,并记下这个地址,以便做为替换后的跳转地址,在下图可以看到这个地址为ffffd2c8
接下来需要用shellcode替换填充的A字符,shellcode的长度不能超过填充字符的长度,也就是说不能超过72字节,shellcode的功能是获得当前UID的shell,我在shell-storm下找到了一个21字节的shellcode,功能是直接获得root权限的shell。
来写一个python脚本生成新的填充字符,内容是编码后的shellcode+填充A+返回地址ffffd2c8
执行一下,已经获得了root的shell,进入/home/level2目录,得到了level2的密码和levelThree的可执行文件
正常来讲只要获得了level2的shell就可就了,这样的话提前拿到了root权限,应该与靶机作者设计的目的不符,看来还有其它我没想到的方法。