首页
社区
课程
招聘
[原创]HEVD学习笔记之未初始化栈变量
发表于: 2021-11-10 15:19 17014

[原创]HEVD学习笔记之未初始化栈变量

2021-11-10 15:19
17014

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,此时会调用的就是未初始化的栈变量


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2022-1-19 18:01 被1900编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//