-
-
[原创]HEVD学习笔记之缓冲区溢出攻击
-
发表于: 2021-11-8 16:32 11526
-
实验环境与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。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]CVE-2022-21882提权漏洞学习笔记 16458
- [原创]CVE-2021-1732提权漏洞学习笔记 19581
- [原创]CVE-2014-1767提权漏洞学习笔记 15227
- [原创]CVE-2018-8453提权漏洞学习笔记 18587
- [原创]CVE-2020-1054提权漏洞学习笔记 13581