-
-
[原创]HEVD学习笔记之未初始化栈变量
-
发表于: 2021-11-10 15:19 16987
-
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,此时会调用的就是未初始化的栈变量
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-1-19 18:01
被1900编辑
,原因:
赞赏
他的文章
- [原创]CVE-2022-21882提权漏洞学习笔记 16382
- [原创]CVE-2021-1732提权漏洞学习笔记 19489
- [原创]CVE-2014-1767提权漏洞学习笔记 15192
- [原创]CVE-2018-8453提权漏洞学习笔记 18526
- [原创]CVE-2020-1054提权漏洞学习笔记 13542
看原图
赞赏
雪币:
留言: