搭环境的话有很多教程 其实前面很多师傅都讲过 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));
/
/
/
/
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));
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);
}
__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));
/
/
/
/
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));
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);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
Status
=
GetExceptionCode();
DbgPrint(
"[-] Exception Code: 0x%X\n"
, Status);
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-10-30 10:16
被Ring3编辑
,原因: