-
-
[原创]Windows Kernel Exploit 内核漏洞学习(2)-内核栈溢出
-
发表于:
2019-7-7 19:12
13854
-
[原创]Windows Kernel Exploit 内核漏洞学习(2)-内核栈溢出
这是 Windows kernel exploit 系列的第二部分,前一篇我们讲了UAF的利用,这一篇我们通过内核空间的栈溢出来继续深入学习 Windows Kernel exploit ,看此文章之前你需要有以下准备:
传送门:
[+]Windows Kernel Exploit 内核漏洞学习(0)-环境安装
[+]Windows Kernel Exploit 内核漏洞学习(1)-UAF
栈溢出是系列漏洞中最为基础的漏洞,如果你是一个 pwn 选手,第一个学的就是简单的栈溢出,栈溢出的原理比较简单,我的理解就是用户对自己申请的缓冲区大小没有一个很好的把控,导致缓冲区作为参数传入其他函数的时候可能覆盖到了不该覆盖的位置,比如 ebp,返回地址等,如果我们精心构造好返回地址的话,程序就会按照我们指定的流程继续运行下去,原理很简单,但是实际用起来并不是那么容易的,在Windows的不断更新过程中,也增加了许多对于栈溢出的安全保护机制。
我们在IDA中打开源码文件StackOverflow.c
源码文件这里下载查看一下主函数TriggerStackOverflow
,这里直接将 Size 传入memcpy
函数中,未对它进行限制,就可能出现栈溢出的情况,另外,我们可以发现 KernelBuffer 的 Size 是 0x800
我们现在差的就是偏移了,偏移的计算是在windbg中调试得到的,我们需要下两处断点来找偏移,第一处是在TriggerStackOverflow
函数开始的地方,第二处是在函数中的memcpy
函数处下断点
上面的第一处断点可以看到返回地址是0x91a03ad4
上面的第二处断点可以看到0x91a032b4是我们memcpy
的第一个参数,也就是KernelBuffer
,我们需要覆盖到返回地址也就是偏移为 0x820
知道了偏移,我们只需要将返回地址覆盖为我们的shellcode的位置即可提权,提权的原理我在第一篇就有讲过,需要的可以参考我的第一篇,只是这里提权的代码需要考虑到栈的平衡问题,在TriggerStackOverflow
函数开始的地方,我们下断点观察发现,ebp的值位置在91a3bae0,也就是值为91a3bafc
当我们进入shellcode的时候,我们的ebp被覆盖为了0x41414141,为了使堆栈平衡,我们需要将ebp重新赋值为97a8fafc
利用思路中,我们介绍了为什么要堆栈平衡,下面是具体的shellcode部分
构造并调用shellcode部分
具体的代码参考这里,最后提权成功
我们先查看源文件 StackOverflow.c
中补丁的措施,区别很明显,不安全版本的RtlCopyMemory
函数中的第三个参数没有进行控制,直接将用户提供的 Size 传到了函数中,安全的补丁就是对RtlCopyMemory
的参数进行严格的设置
通过这次的练习感受到Windows内核中和Linux中栈溢出的区别,在Linux中,如果我们想要栈溢出,会有canary,ASLR,NX等等保护需要我们去绕过,如果平台上升到win10,那么就会有更多全新的安全机制需要去考虑
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-7-8 19:44
被Thunder J编辑
,原因: