0x00前言
搭环境的话有很多教程 其实前面很多师傅都讲过 TJ师傅讲过 我的学习过程也是根据TJ师傅来的 途中也经过了wjllz和0x2l师傅的指导 人很好的两位师傅 不过搭环境是真的头疼。。。。。
从现在开始写windows内核系列的漏洞学习 第一部分开始栈的东西 内核栈溢出部分的学习 内核栈和用户栈是分开的 一般用户程序无法直接访问内核栈空间 由于内核栈的空间往往很有限 所以往往就会发生溢出的可能然后直接造成蓝屏导致系统崩溃(蓝屏?) 不过后面微软引入GS机制后 基本上关于栈的攻击就结束了
0x01漏洞原理
栈溢出其实很好理解 在学习pwn的过程中其实就已经了解到了 栈是提前分配好的空间 在使用的过程中假如使用了危险函数 未对空间进行限制 就有可能造成栈溢出 然后覆盖返回地址 使其指向我们shellcode的位置
函数分析
TriggerBufferOverflowStack
这个函数就是漏洞函数 由于memcpy没有验证KernelBuffer的大小 导致缓冲区溢出 返回地址覆盖指向我们的shellcode
1 | TriggerBufferOverflowStack( |
0x02漏洞分析
我们对漏洞函数下断点即可
1 | bp HEVD!TriggerBufferOverflowStack |
下断点后执行到这里 然后查看ebp的值 可以发现返回地址已经被被覆盖为shellcode的地址 esp中全是padding
0x03漏洞利用
其实栈溢出在没有GS机制的情况下是很好利用的 只要将溢出后的返回地址覆盖为我们shellcode的地址就行
shellcode
1 | void ShellCode() |
创建CMD
1 | static VOID CreateCmd() |
调用shellcode
1 | memset(buf, 'A', 0x824); |
我们可以发现利用成功了
0x04补丁分析
其实就是RtlCopyMemory函数未对参数进行检查导致用户的Size传入导致的溢出 而安全补丁利用sizeof函数对参数进行了检查
0x05经验总结
在练习pwn之后对这个还是蛮容易理解的 但现在对栈有很多安全机制了 我们需要用更多的手段去绕过 导致我们的利用率大大降低 最后 感谢TJ师傅的文章 感谢wjllz和0x2l师傅的指导!!!