[04] HEVD 内核漏洞之IntegerOverflow
作者:huity
出处:https://www.cnblogs.com/huity35/p/11252574.html
版权:本文版权归作者所有。文章在博客园、看雪、个人博客同时发布。
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任。
0x00 前言
0x01 漏洞原理
整数溢出
Demo(基于栈的整数溢出)
- #include "stdio.h"
- #include "string.h"
- int main()
- {
- int i;
- char buf[];
- unsigned short int size;
- char overflow[];
- memset(overflow,,sizeof(overflow));
- printf("Input the num:\n");
- scanf("%d",&i);
- size=i;
- printf("size:%d\n",size);
- printf("i:%d\n",i);
- if(size>)
- return -;
- memcpy(buf,overflow,i);//栈溢出
- return ;
- }
上面的demo中,size为无符号短整数(0-65535),当我们输入大于65535是就会造成溢出,例如我们输入65536,最终得到的size为0,从而绕过边界检查,但是在memcpy函数复制数据时,使用的是int类型的i参数,导致栈溢出。
Demo(基于堆的整数溢出)
- #include "stdio.h"
- #include "string.h"
- #include "Windows.h"
- int main()
- {
- int heap;
- unsigned short int size;
- char* v1,*v2;
- HANDLE HeapHandle;
- printf("int put size: \n");
- scanf("%d",&size);
- HeapHandle = HeapCreate(HEAP_GENERATE_EXCEPTIONS,0x100,0xfff);
- if(size <=0x50)
- {
- size-=;
- printf("size:%d\n",size);
- v1=(char*)HeapAlloc(HeapHandle,,size);
- v2=(char*)HeapAlloc(HeapHandle,,0x50);
- }
- HeapFree(HeapHandle,,v1);
- HeapFree(HeapHandle,,v2);
- return ;
- }
上述demo中size为unsigned short int,小于5时,例如,当size=2时,size减去5则得到负数,但size取值范围导致无法识别负数,而得到正数65533,而分配得到大的堆块,从而溢出导致覆盖到后面的堆管理结构。
分析
- __declspec(safebuffers)
- NTSTATUS TriggerIntegerOverflow( _In_ PVOID UserBuffer, _In_ SIZE_T Size)
- {
- ULONG Count = ;
- NTSTATUS Status = STATUS_SUCCESS;
- ULONG BufferTerminator = 0xBAD0B0B0;
- ULONG KernelBuffer[BUFFER_SIZE] = { };//512*4=2048
- SIZE_T TerminatorSize = sizeof(BufferTerminator);//
- PAGED_CODE();
- __try
- {
- //
- // UserBuffer 为Ring3地址 其中前面均用A填充,倒数8字节开始的4字节为Payload地址 最后四字节为0xBAD0B0B0
- ProbeForRead(UserBuffer, sizeof(KernelBuffer), (ULONG)__alignof(UCHAR));
- DbgPrint("[+] UserBuffer: 0x%p\n", UserBuffer);
- DbgPrint("[+] UserBuffer Size: 0x%X\n", Size);
- DbgPrint("[+] KernelBuffer: 0x%p\n", &KernelBuffer);
- DbgPrint("[+] KernelBuffer Size: 0x%X\n", sizeof(KernelBuffer));
- #ifdef SECURE
- //
- // 安全注意:这是安全的,因为开发人员没有对用户提供的值进行任何算术运算。
- //相反,开发人员从KernelBuffer的大小减去ULONG的大小,即x86上的4。 因此,不会发生整数溢出,并且此检查不会失败
- if (Size > (sizeof(KernelBuffer) - TerminatorSize))
- {
- DbgPrint("[-] Invalid UserBuffer Size: 0x%X\n", Size);
- Status = STATUS_INVALID_BUFFER_SIZE;
- return Status;
- }
- #else
- DbgPrint("[+] Triggering Integer Overflow (Arithmetic Overflow)\n");
- // 注意这里是有漏洞的版本
- if ((Size + TerminatorSize) > sizeof(KernelBuffer))//FFFFFFFF+4 = 00000003
- {
- DbgPrint("[-] Invalid UserBuffer Size: 0x%X\n", Size);
- Status = STATUS_INVALID_BUFFER_SIZE;
- return Status;
- }
- #endif
- //实现拷贝操作
- while (Count < (Size / sizeof(ULONG)))
- {
- if (*(PULONG)UserBuffer != BufferTerminator)
- {
- KernelBuffer[Count] = *(PULONG)UserBuffer;
- UserBuffer = (PULONG)UserBuffer + ;
- Count++;
- }
- else
- {
- break;
- }
- }
- }
- __except (EXCEPTION_EXECUTE_HANDLER)
- {
- Status = GetExceptionCode();
- DbgPrint("[-] Exception Code: 0x%X\n", Status);
- }
- return Status;
- }
函数中比较了用户提交缓冲区长度和内核缓冲区长度,在有漏洞的版本中,这一比较采用了:
- if ((Size + TerminatorSize) > sizeof(KernelBuffer))

我们在Windbg中同样可以看到这一问题:
- 97c4ba9f 8b450c mov eax,dword ptr [ebp+0Ch]
- 97c4baa2 0345d4 add eax,dword ptr [ebp-2Ch]
- 97c4baa5 3d00080000 cmp eax,800h
- kd> r eax
- eax=
- kd> r
- eax= ebx= ecx=ffffffff edx=0000004d esi=86e61528 edi=860fff80
- eip=97c80adb esp=9398f268 ebp=9398fab0 iopl= nv up ei ng nz na pe cy
- cs= ss= ds= es= fs= gs= efl=
- HEVD!TriggerIntegerOverflow+0x16b:
- 97c80adb 8b450c mov eax,dword ptr [ebp+0Ch] ss::9398fabc=ffffffff
- kd> dd 9398fab0
- 9398fab0 9398fad4 97c80956 ffffffff
- 9398fac0 c0000001 ffffffff
- 9398fad0 9398fafc 97c800ae 86e6a870
- 9398fae0 86e6a8e0
- 9398faf0 c00000bb 86e6a8e0 9398fb14
- 9398fb00 83e7f593 86e61528 86e6a870 86e6a870
- 9398fb10 86e61528 9398fb34 8407399f 860fff80
- 9398fb20 86e6a870 86e6a8e0 0498fbac
0x02 漏洞利用


0x03 漏洞反思
0x04 链接
[04] HEVD 内核漏洞之IntegerOverflow的更多相关文章
- [02] HEVD 内核漏洞之栈溢出
作者:huity出处:http://www.cnblogs.com/huity35/版权:本文版权归作者所有.文章在看雪.博客园.个人博客同时发布.转载:欢迎转载,但未经作者同意,必须保留此段声明:必 ...
- [03] HEVD 内核漏洞之UAF
作者:huity出处:https://www.cnblogs.com/huity35/p/11240997.html版权:本文版权归作者所有.文章在博客园.个人博客同时发布.转载:欢迎转载,但未经作者 ...
- 内核漏洞学习—熟悉HEVD
一直以来内核漏洞安全给很多人的印象就是:难,枯燥.但是内核安全是否掌握是衡量一个系统安全工程师水平的标准之一,也是安全从业人员都应该掌握的基本功.本文通过详细的实例带领读者走进内核安全的大门.难度系数 ...
- 【翻译】 Windows 内核漏洞学习—空指针解引用
Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/windo ...
- Windows 内核漏洞学习—空指针解引用
原标题:Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/w ...
- CVE-2014-0038内核漏洞原理与本地提权利用代码实现分析 作者:seteuid0
关键字:CVE-2014-0038,内核漏洞,POC,利用代码,本地提权,提权,exploit,cve analysis, privilege escalation, cve, kernel vuln ...
- Android内核漏洞利用技术实战:环境搭建&栈溢出实战
前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是 ...
- Linux kernel pwn notes(内核漏洞利用学习)
前言 对这段时间学习的 linux 内核中的一些简单的利用技术做一个记录,如有差错,请见谅. 相关的文件 https://gitee.com/hac425/kernel_ctf 相关引用已在文中进行了 ...
- 初识linux内核漏洞利用
0x00 简介 之前只接触过应用层的漏洞利用, 这次第一次接触到内核层次的,小结一下. 0x01 概况 这次接触到的,是吾爱破解挑战赛里的一个题,给了一个有问题的驱动程序,要求在ubuntu 14.0 ...
随机推荐
- 模拟键盘发送文字(使用SendInput API函数)
嗯...老生常谈的话题, 不过系统的总结了一下, 找了个相对简单的实现方式, 可以方便的发送任何文字 参考另一片文章: http://www.cnblogs.com/-clq/archive/2011 ...
- [2017.02.06] 阅读《Effective Morden C++》
- springboot 集成完整的swagger2
springboot 在集成swagger中会不会遇到各种问题: 1.swagger 进行接口鉴权(比如设置header的token,接口进行拦截处理). 2.swagger 进行实体属性解析(po ...
- vue的懒加载如何实现?
个人通过查找发现一个比较好用的模块,vue-lazyload 第一步 下载安装这个包 npm install vue-lazyload 第二步 在main.js中引入这个模块 import Vu ...
- zabbix2.4汉化
zabbix的2.4版本安装完后,这里的语言界面选择没有中文,其实是这个版本把中文的屏蔽了. [root@zabbix-server opt]# vim /var/www/html/include/l ...
- 整理一下Apache与Tomcat的关系
如果有对Apache与Tomcat认识比较的同学就要拿起小板凳听一下 关系一 Apache是web服务器,Tomcat是应用服务器,也就是java服务器,因为Apache只能支持静态网页,所以Apac ...
- SLAM方向国内有哪些优秀公司?
计算机视觉life为读者整理了国内几十家涉及SLAM的优秀公司,涵盖自动驾驶.仓储机器人.服务机器人.无人机.AR.芯片相机等领域. 一 自动/辅助驾驶: 1.百度: 主要产品:自动驾驶软件 百度智能 ...
- jquery 动态 新增 元素 绑定事件
在jquery1.7以前使用live方法进行绑定,由于年代久远,这里就不介绍了. 在jquery1.7以后我们使用的on方法,这里需要注意的一点就是:如果想让动态生成的元素,都绑上事件,on前面的选择 ...
- svn unable to connect to a repository url 计算机积极拒绝
网上应该说启动server服务,首先找不到这个服务,后来下载个软件有了,启动还是不行.clear了所有saved data之后也是不行. 解决方法:Network中 Enable proxy Serv ...
- Java线程池源码及原理
目录 1 说明 1.1类继承图 2 线程池的状态 3 源码分析 3.1完整的线程池构造方法 3.2 ctl 3.3 任务的执行 3.3.1 execute(Runnable command) 3.3. ...