-
-
[原创]HEVD学习笔记之未初始化栈变量
-
发表于:
2021-11-10 15:19
17248
-
HEVD介绍和实验环境请看:HEVD学习笔记之概述
栈中的变量根据编译器的编译结果,会对其进行不同的初始化操作。在对栈中变量的之前,需要对其进行正确的赋值操作,比如下面这样
函数指针pFunc在调用之前被正确的赋值了test的函数地址,那么就会正常调用test函数

可如果在使用之前没有正确的赋值
那么变量保存的内容就是编译器默认的结果,此时对它的使用就会产生错误

该函数在函数地址表中的第12个函数,所以对应的IOCTL是0x222003 + 11 * 4。
将CurrentStackLocation和IRP入栈以后,调用UninitializedMemoryStackIoctlHandler。
在该函数中,将输入缓冲区指针入栈以后调用TriggerUninitializedMemoryStack
函数首先对输入缓冲区进行可读检查,并把前4字节的内容保存到esi。
接着会判断esi是否等于0x0BAD0B0B0,如果等于则会对局部变量var_FuncAddr赋值为函数地址UninitializedMemoryStackObjectCallback,该函数的实现如下
无论是否对局部变量进行初始化都会执行接下来的代码,判断保存的局部变量中的内容是否为0,如果不为0,则会将其当初函数地址调用
由于无论是否对栈变量var_FuncAddr进行赋值,函数都会将它取出进行调用,在没有初始化的情况下,就会产生漏洞。
由上分析可以知道,如果输入缓冲区保存的内容是0x0BAD0B0B0,函数会对局部变量进行正确初始化并调用

而如果保存的不是0x0BAD0B0B0,此时会调用的就是未初始化的栈变量

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-1-19 18:01
被1900编辑
,原因: