首页
社区
课程
招聘
[原创]HEVD学习笔记之缓冲区溢出攻击
发表于: 2021-11-8 16:32 11498

[原创]HEVD学习笔记之缓冲区溢出攻击

2021-11-8 16:32
11498

实验环境与HEVD的介绍请看:HEVD学习笔记之概述

要理解缓冲区溢出攻击的关键是要理解函数的执行过程,关于这部分内容可以看看这篇文章:从反汇编的角度学C/C++之函数。产生该漏洞的关键原因是,当函数退出的时候,会将保存在栈中的返回地址取出,跳转到该地址继续执行,以此来执行函数调用以后的程序。而如果用户的输入没有得到控制,覆盖掉了这个返回地址就会让函数退出的时候,执行我们指定的地址的代码。

在IDA中可以看到,该漏洞是函数地址表中的第一个漏洞,也就是说要触发该漏洞,IOCTL需要是0x222003。

首先将IRP和CurrentStackLocation的指针压入栈中,随后调用BufferOverflowStackIoCtrl函数,继续看该函数内容。

在该函数中,将输入缓冲区的大小与输入缓冲区的指针压入栈中以后,调用TriggerBufferOverfloaStack函数,继续跟进这个函数

在该函数中,首先会将局部变量Dst数组初始化为0,接着在对输入缓冲区进行合法性检查。

随后,函数会将输入缓冲区中的内容全部拷贝到局部变量Dst中。由于在这里并没有检查输入缓冲区的长度是否是合法的,所以这里就产生了漏洞,让我们可以进行缓冲区溢出的攻击。

接下来将用WinDbg对其进行动态调试,查看数据情况。首先在TriggerBufferOverflowStack函数中下断点,然后在用户层发送IOCTL以后程序将断在函数的开头地址,此时esp以及栈中的数据如下图所示

此时esp所保存的0x99151AD4所保存的0x8EFDD19A就是执行完函数以后的返回地址。继续在memcpy函数下断点以后运行程序,此时寄存器状态与栈中情况如下图所示

也就是说要拷贝的局部变量的目的地址是0x991512B4,那也就是说想要输入的数据覆盖到返回地址,我们需要提供0x99151A4D-0x991512B4=0x820大小的字节数据来填充上面的内容,接着的4字节就会覆盖掉返回地址。此时这个地址,就可以指定为ShellCode的地址,这样当函数退出的时候,就会执行我们想要执行的ShellCode。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

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