首页
社区
课程
招聘
[原创]HEVD内核漏洞学习(1)-内核栈溢出
发表于: 2020-10-25 17:33 7222

[原创]HEVD内核漏洞学习(1)-内核栈溢出

2020-10-25 17:33
7222

搭环境的话有很多教程 其实前面很多师傅都讲过 TJ师傅讲过 我的学习过程也是根据TJ师傅来的 途中也经过了wjllz和0x2l师傅的指导 人很好的两位师傅 不过搭环境是真的头疼。。。。。

从现在开始写windows内核系列的漏洞学习 第一部分开始栈的东西 内核栈溢出部分的学习 内核栈和用户栈是分开的 一般用户程序无法直接访问内核栈空间 由于内核栈的空间往往很有限 所以往往就会发生溢出的可能然后直接造成蓝屏导致系统崩溃(蓝屏?)

栈溢出其实很好理解 在学习pwn的过程中其实就已经了解到了 栈是提前分配好的空间 在使用的过程中假如使用了危险函数 未对空间进行限制 就有可能造成栈溢出 然后覆盖返回地址 使其指向我们shellcode的位置

TriggerBufferOverflowStack
这个函数就是漏洞函数 由于memcpy没有验证KernelBuffer的大小 导致缓冲区溢出 返回地址覆盖指向我们的shellcode

我们对漏洞函数下断点即可

下断点后执行到这里 然后查看ebp的值 可以发现返回地址已经被被覆盖为shellcode的地址 esp中全是padding


其实栈溢出在没有GS机制的情况下是很好利用的 只要将溢出后的返回地址覆盖为我们shellcode的地址就行

我们可以发现利用成功了

其实就是RtlCopyMemory函数未对参数进行检查导致用户的Size传入导致的溢出 而安全补丁利用sizeof函数对参数进行了检查

在练习pwn之后对这个还是蛮容易理解的 但现在对栈有很多安全机制了 我们需要用更多的手段去绕过 导致我们的利用率大大降低 最后 感谢TJ师傅的文章 感谢wjllz和0x2l师傅的指导!!!
最近有学习内核的师傅嘛 可以一起交流一下的咩

 
TriggerBufferOverflowStack(
    _In_ PVOID UserBuffer,
    _In_ SIZE_T Size
)
{
    NTSTATUS Status = STATUS_SUCCESS;
    ULONG KernelBuffer[BUFFER_SIZE] = { 0 };
 
    PAGED_CODE();
 
    __try
    {
        //
        // Verify if the buffer resides in user mode
        //
 
        ProbeForRead(UserBuffer, sizeof(KernelBuffer), (ULONG)__alignof(UCHAR));
 
        DbgPrint("[+] UserBuffer: 0x%p\n", UserBuffer);
        DbgPrint("[+] UserBuffer Size: 0x%X\n", Size);
        DbgPrint("[+] KernelBuffer: 0x%p\n", &KernelBuffer);
        DbgPrint("[+] KernelBuffer Size: 0x%X\n", sizeof(KernelBuffer));
 
#ifdef SECURE
        //
        // Secure Note: This is secure because the developer is passing a size
        // equal to size of KernelBuffer to RtlCopyMemory()/memcpy(). Hence,
        // there will be no overflow
        //
 
        RtlCopyMemory((PVOID)KernelBuffer, UserBuffer, sizeof(KernelBuffer));
#else
        DbgPrint("[+] Triggering Buffer Overflow in Stack\n");
 
        //
        // Vulnerability Note: This is a vanilla Stack based Overflow vulnerability
        // because the developer is passing the user supplied size directly to
        // RtlCopyMemory()/memcpy() without validating if the size is greater or
        // equal to the size of KernelBuffer
        //
 
        RtlCopyMemory((PVOID)KernelBuffer, UserBuffer, Size);
#endif
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        Status = GetExceptionCode();
        DbgPrint("[-] Exception Code: 0x%X\n", Status);
    }
 
    return Status;
}
TriggerBufferOverflowStack(
    _In_ PVOID UserBuffer,
    _In_ SIZE_T Size
)
{
    NTSTATUS Status = STATUS_SUCCESS;
    ULONG KernelBuffer[BUFFER_SIZE] = { 0 };
 
    PAGED_CODE();
 
    __try
    {
        //
        // Verify if the buffer resides in user mode
        //
 
        ProbeForRead(UserBuffer, sizeof(KernelBuffer), (ULONG)__alignof(UCHAR));
 
        DbgPrint("[+] UserBuffer: 0x%p\n", UserBuffer);
        DbgPrint("[+] UserBuffer Size: 0x%X\n", Size);
        DbgPrint("[+] KernelBuffer: 0x%p\n", &KernelBuffer);
        DbgPrint("[+] KernelBuffer Size: 0x%X\n", sizeof(KernelBuffer));
 
#ifdef SECURE
        //
        // Secure Note: This is secure because the developer is passing a size
        // equal to size of KernelBuffer to RtlCopyMemory()/memcpy(). Hence,
        // there will be no overflow
        //
 
        RtlCopyMemory((PVOID)KernelBuffer, UserBuffer, sizeof(KernelBuffer));
#else
        DbgPrint("[+] Triggering Buffer Overflow in Stack\n");
 
        //
        // Vulnerability Note: This is a vanilla Stack based Overflow vulnerability
        // because the developer is passing the user supplied size directly to
        // RtlCopyMemory()/memcpy() without validating if the size is greater or
        // equal to the size of KernelBuffer
        //
 
        RtlCopyMemory((PVOID)KernelBuffer, UserBuffer, Size);
#endif
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        Status = GetExceptionCode();
        DbgPrint("[-] Exception Code: 0x%X\n", Status);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-10-30 10:16 被Ring3编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (6)
雪    币: 20
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
6
2020-10-26 10:36
0
雪    币: 229
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
6
2020-10-26 12:15
0
雪    币: 7
活跃值: (4331)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
4
6
2020-10-26 12:56
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
我虽然不是搞漏洞分析方向,但平时也要用到驱动开发,还是有必要了解下!
以后我写驱动会更加注意的!讲得很好!谢谢!
2020-10-29 22:35
0
雪    币: 919
活跃值: (1340)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
请问一下你尝试GS的了吗?而且不同的编译器的try_catch申请的是不一样的,所以你要修正shellcode,在我研究的时候,发现拷贝的时候也会爆出页错误,目前还在研究
2020-11-5 15:41
0
雪    币: 550
活跃值: (2995)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
丿一叶知秋 请问一下你尝试GS的了吗?而且不同的编译器的try_catch申请的是不一样的,所以你要修正shellcode,在我研究的时候,发现拷贝的时候也会爆出页错误,目前还在研究
关于GS的话 你可以去看看wjllz师傅的代码思路 官方的exp的话 我这边是会产生蓝屏的
2020-11-5 16:23
0
游客
登录 | 注册 方可回帖
返回
//